摘要
本文提供了一些集成Python和Web服務(wù)器的方法雁竞,以及一些開發(fā)網(wǎng)站有用的實(shí)踐岛都,來展示如何使用Python進(jìn)行web開發(fā)划滋。
Web 2.0專注于讓網(wǎng)站上的用戶生成內(nèi)容,自從它開始媒峡,網(wǎng)絡(luò)編程就成為了熱門話題翠桦。一直以來都可以使用Python創(chuàng)建網(wǎng)站,但這是一個相當(dāng)無聊的任務(wù)糊渊。因此市咆,有很多框架和工具被創(chuàng)造出來,幫助開發(fā)人員創(chuàng)建更快再来,更強(qiáng)大的網(wǎng)站蒙兰。本文描述了一些將Python和Web服務(wù)器組合以創(chuàng)建動態(tài)內(nèi)容的方法磷瘤。這不是一個完整的介紹,因?yàn)檫@個話題過于廣泛搜变,不可能在一篇文章中講清楚采缚。本文會介紹目前最流行的庫。
底層一窺
當(dāng)用戶打開網(wǎng)站時(shí)挠他,他們使用的瀏覽器會連接到該網(wǎng)站的Web服務(wù)器(這被稱之為請求)扳抽。服務(wù)器在文件系統(tǒng)中查找文件,并將其發(fā)回用戶的瀏覽器(這被稱之為響應(yīng))殖侵。這是底層HTTP協(xié)議的大概工作過程贸呢。
動態(tài)網(wǎng)站不是基于文件系統(tǒng)中的文件,而是基于在請求進(jìn)入時(shí)Web服務(wù)器運(yùn)行的程序拢军,由程序生成內(nèi)容返回給用戶楞陷。這些程序可以做各種有用的事情,比如顯示公告板的發(fā)布茉唉,顯示電子郵件固蛾,配置軟件,或者只顯示當(dāng)前時(shí)間度陆。這些程序可以用服務(wù)器支持的任何編程語言編寫艾凯。因?yàn)榇蠖鄶?shù)的服務(wù)器都支持Python,因此可以使用Python輕松地創(chuàng)建動態(tài)網(wǎng)站懂傀。
大多數(shù)的HTTP服務(wù)器軟件是用C或者C++編寫的趾诗,所以它們不能直接執(zhí)行Python代碼。服務(wù)器程序和應(yīng)用程序之間需要一個橋梁蹬蚁。這些橋梁恃泪,或者叫做接口,定義了程序如何與服務(wù)器進(jìn)行交互缚忧。對于這樣的接口悟泵,已經(jīng)有了很多很好的嘗試,但是只有一些值得一提闪水。
不是所有的Web服務(wù)器都支持所有的接口糕非。很多Web服務(wù)器只支持舊的,已過時(shí)的接口球榆;不過朽肥,它們通常可以使用第三方模塊進(jìn)行擴(kuò)展持钉,以支持較新的模塊衡招。
通用網(wǎng)關(guān)接口
通用網(wǎng)關(guān)接口,通常叫做CGI每强,是最古老的接口始腾,幾乎所有的Web服務(wù)器都支持州刽。Web服務(wù)器通過啟動CGI程序來處理請求。對于Python程序來說浪箭,每個請求都會啟動一個新的Python解釋器穗椅,這需要一些時(shí)間,因而整個服務(wù)只能用于低負(fù)載的情況奶栖。
CGI的優(yōu)勢在于它很簡單匹表,編寫一個使用CGI的Python程序只需要大概3行代碼。這種簡單是有代價(jià)的宣鄙,就是它對于開發(fā)者的支持不夠袍镀。
現(xiàn)在已經(jīng)不再推薦編寫CGI程序了。使用WSGI可以編寫兼容CGI的程序冻晤,并作為CGI程序運(yùn)行苇羡。
簡單的CGI腳本
可以用下面的小程序測試Web服務(wù)器是否支持CGI
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import cgitb
cgitb.enable()
print "Content-Type: text/plain;charset=utf-8"
print
print "Hello World!"
根據(jù)Web服務(wù)器的配置,可能需要使用.py或.cgi擴(kuò)展名來保存上面的代碼明也。另外宣虾,處于安全考慮惯裕,代碼文件可能需要保存到cgi-bin
文件夾温数。
你可能會疑惑cgitb
是用來干嘛的。在發(fā)生異常時(shí)蜻势,該庫會返回一些棾糯蹋回溯信息,而不是在瀏覽器上簡單返回"Internal Server Error"握玛。這對調(diào)試非常有用够傍,但可能會將一些機(jī)密數(shù)據(jù)暴露給用戶。所以不能在生產(chǎn)環(huán)境中使用cgitb
挠铲。開發(fā)者應(yīng)該總是捕獲異常冕屯,并顯示正確的錯誤頁面,終端用戶不喜歡在瀏覽器中看到"Internal Server Errors"拂苹。
CGI腳本的常見問題
使用CGI的過程中可能會有一些坑導(dǎo)致腳本不能運(yùn)行安聘。有時(shí),一個看似正確的腳本可能因?yàn)橐恍┖茈y發(fā)現(xiàn)的問題導(dǎo)致不能正常工作瓢棒。
下面是其中的一些問題:
- Python腳本沒有可執(zhí)行權(quán)限浴韭。當(dāng)CGI腳本不可執(zhí)行時(shí),大多數(shù)Web服務(wù)器會讓用戶下載這個腳本脯宿,而不是運(yùn)行腳本將輸出返回給用戶念颈。要使CGI腳本在類Unix操作系統(tǒng)上正常運(yùn)行,可以使用
chmod a+x your_script.py
來解決這個問題连霉。 - 在類Unix系統(tǒng)上榴芳,程序文件中的行結(jié)尾必須是Unix樣式行尾嗡靡。這很重要,因?yàn)閃eb服務(wù)器會檢查腳本的第一行(稱為shebang)窟感,并嘗試運(yùn)行在那里指定的程序叽躯。它很容易被Windows的換行符(回車和換行,也稱為CRLF)困惑肌括,所以必須將文件轉(zhuǎn)換為Unix行結(jié)尾(LF)点骑。在通過FTP上傳文件時(shí),可以通過文本模式而不是二進(jìn)制模式來自動完成這一轉(zhuǎn)換谍夭,但是首選的方法是告訴編輯器使用Unix行結(jié)尾來保存文件黑滴。大多數(shù)編輯器都支持這一功能。
- Web服務(wù)器必須能夠讀取該腳本紧索,所以需要確保權(quán)限正確袁辈。在類Unix系統(tǒng)上,服務(wù)器程序的用戶和組通常是www-data珠漂,所以可能得更改文件的所有權(quán)晚缩,或者使用
chmod a+r your_script.py
。 - Web服務(wù)器器必須要知道訪問的是CGI腳本媳危。檢查服務(wù)器配置荞彼,因?yàn)榉?wù)器可能只期望具有特定擴(kuò)展名的文件為CGI腳本。
- 在類Unix系統(tǒng)中待笑,shebang(
#!/usr/bin/env python
)中的路徑必須是正確的鸣皂。該行調(diào)用/usr/bin/env
來查找Python的路徑,但是如果Python在服務(wù)器的路徑不存在暮蹂,或者/usr/bin/env
不存在的話寞缝,調(diào)用將會失敗。
mod_python
PHP的使用者通常會發(fā)現(xiàn)仰泻,很難使用Python進(jìn)行Web開發(fā)荆陆。他們首先想到的是使用mod_python,因?yàn)樗麄冋J(rèn)為這和mod_php
是一樣的集侯。事實(shí)上被啼,這兩個是有不同的。mod_python
將Python解釋器嵌入到Apache進(jìn)程中浅悉,這樣不必為每個請求啟動Python解釋器趟据,從而加快請求。另一方面术健,它不是Python與HTML的混合汹碱,PHP通常與HTML混合。Python中達(dá)到類似效果的是模版引擎荞估。mod_python
本身更為強(qiáng)大咳促,并提供對Apache內(nèi)部組件的更多訪問稚新。它可以模仿CGI,工作在“Python-頁面”模式(類似于JSP)跪腹,這個模式讓Python可以和HTML混合使用褂删,它有一個“發(fā)布者”來指定一個文件來接受和處理所有請求。
不過mod_python
有一些問題冲茸。和PHP解釋器不同屯阀,Python解釋器在執(zhí)行文件的時(shí)候會有緩存,因此對文件的更改需要重新啟動Web服務(wù)器轴术。另一個問題是难衰,Apache通過啟動子進(jìn)程來處理請求,不幸的是逗栽,所有的子進(jìn)程都要加載整個Python解釋器盖袭。這會讓服務(wù)器更慢。還有一個問題彼宠,mod_python
與特定版本的libpython
鏈接鳄虱,所以不可能在不重新編譯的情況下從舊版本切換到新版本。mod_python
和apache是綁定的凭峡,所以為mod_python
編寫的程序在其他服務(wù)器上不能輕易運(yùn)行拙已。
這些就是避免使用mod_python
編寫程序的原因。在某些情況下想罕,可以考慮使用mod_python
進(jìn)行部署悠栓,但是WSGI程序也可以在mod_python
下運(yùn)行霉涨。
FastCGi和SCGI
FastCGI和SCGI嘗試通過另外一種方式解決CGI的性能問題按价。它不再將解釋器嵌入到Web服務(wù)器中,而是創(chuàng)建長時(shí)間運(yùn)行的后臺程序笙瑟。Web服務(wù)器中的一個模塊使得其可以與后臺進(jìn)程通信楼镐。由于后臺進(jìn)程獨(dú)立于服務(wù)器,因此它可以用任意語言進(jìn)行編寫往枷,包括Python框产。該語言只需要一個處理與Web服務(wù)器通信的庫。
FastCGi和SCGI的區(qū)別很小错洁,因?yàn)镾CGI本質(zhì)上只是一個更簡單的FastCGI(simpler FastCGI)秉宿。支持SCGI的Web服務(wù)器不多,因此大多數(shù)人都使用FastCGI屯碴。幾乎所有適用于SCGI的內(nèi)容也適用于FastCGI描睦,所以這里只涉及后者。
現(xiàn)在FastCGI不再被直接使用了导而。就像mod_python
一樣忱叭,它只用于部署WSGI應(yīng)用程序隔崎。
設(shè)置FastCGI
每種Web服務(wù)器都有自己的特定模塊。
- Apache有mod_fastcgi和mod_fcgid韵丑。最開始是
mod_fastcgi
爵卒,但是它有一些許可問題,有時(shí)被認(rèn)為是非免費(fèi)的撵彻。mod_fcgid
是一個較小的钓株,兼容的替代方案。Apache需要加載其中一個模塊陌僵。 - lighttpd同時(shí)有FastCGI module和SCGI module
- nginx也支持FastCGI享幽。
安裝和配置好上面模塊后,可以用下面的程序測試一下拾弃。
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
from cgi import escape
import sys, os
from flup.server.fcgi import WSGIServer
def app(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
yield '<h1>FastCGI Environment</h1>'
yield '<table>'
for k, v in sorted(environ.items()):
yield '<tr><th>%s</th><td>%s</td><tr>' % (escape(k), escape(v))
yield '</table>'
WSGIServer(app).run()
這就是一個簡單的WSGi應(yīng)用程序值桩,但是首先需要安裝flup來處理底層的FastCGI訪問。
mod_wsgi
mod_wsgi試圖擺脫網(wǎng)關(guān)豪椿。FastCGi奔坟,SCGI和mod_python主要用于部署WSGI應(yīng)用程序,mod_wsgi直接將WSGI應(yīng)用程序嵌入Apache Web服務(wù)器搭盾。mod_wsgi專門用于承載WSGI應(yīng)用程序咳秉。和其他需要使用膠水代碼來部署的方法比較起來,使用mod_wsgi部署起來更加容易鸯隅。缺點(diǎn)是mod_wsgi僅限于Apache Web服務(wù)器;其他服務(wù)器需要自己的mod_wsgi實(shí)現(xiàn)澜建。
mod_wsgi支持兩種模式:集成Apache進(jìn)程的嵌入模式和FastCGi類似的守護(hù)模式。和FastCGi不同蝌以,mod_wsgi可以自己處理工作進(jìn)程炕舵,這使得管理起來更加容易。
WSGI
在前面已經(jīng)多次提到了WSGI跟畅,現(xiàn)在來解釋它的重要性咽筋。
WSGI全稱是Web服務(wù)器網(wǎng)關(guān)接口,PEP 333中定義了它徊件,目前是Python Web編程的最佳方式奸攻。它一般會用來編寫框架,一般的Web開發(fā)人員并不需要直接接觸它虱痕。在選擇Web開發(fā)框架時(shí)睹耐,最好選擇支持WSGI的框架。
WSGI的最大優(yōu)點(diǎn)就是統(tǒng)一了應(yīng)用程序編程接口部翘。如果使用的框架支持WSGI硝训,那么應(yīng)用程序就能在所有支持WSGI的Web服務(wù)器上進(jìn)行部署。應(yīng)用程序并不需要關(guān)心部署使用的是mod_python或FastCGi或者mod_wsgi--使用WSGi,應(yīng)用程序?qū)⒛茉谠谌魏尉W(wǎng)關(guān)接口上運(yùn)行捎迫。Python標(biāo)準(zhǔn)庫包含自己的WSGi服務(wù)器wsgiref晃酒,它是一個可用于測試的小型Web服務(wù)器。
WSGI一個非常好的特性是中間件窄绒。中間件是應(yīng)用程序的一層贝次,可以在其中添加各種功能。已經(jīng)有很多的中間件存在了彰导。比如蛔翅,不用再編寫自己的會話管理(HTTP是無狀態(tài)協(xié)議,因此要將多個HTTP請求與單個用戶關(guān)聯(lián)位谋,應(yīng)用程序必須通過會話創(chuàng)建和管理此類狀態(tài))山析,只需要下載會話管理中間件,將其插入應(yīng)用掏父,然后就能進(jìn)行應(yīng)用相關(guān)的特定邏輯的編碼了笋轨。同樣的,現(xiàn)在也有中間件可以使用gzip處理壓縮HTML赊淑,來節(jié)省服務(wù)器的寬帶爵政。也可以使用現(xiàn)有中間件輕松解決認(rèn)證問題。
雖然WSGI可能看起來很復(fù)雜陶缺,但初始階段的學(xué)習(xí)是非常有益的钾挟,因?yàn)閷﹂_發(fā)網(wǎng)中中出現(xiàn)的問題,WSGI和相關(guān)的中間件很有可能已經(jīng)有了解決方案饱岸。
WSGI服務(wù)器
用于連接到各種底層網(wǎng)關(guān)(如CGI和mod_python)的代碼被稱為WSGI服務(wù)器掺出。flup
就是一個WSGI服務(wù)器,它支持FastCGi苫费,SCGI和AJP汤锨。部分服務(wù)器使用Python編寫,比如flup
黍衙,還存在其他以C編寫的服務(wù)器泥畅,可以用作插入式替換。
已經(jīng)有很多WSGI服務(wù)器存在了琅翻,所以Python Web應(yīng)用幾乎可以在任何地方部署。這是Python與其他網(wǎng)絡(luò)技術(shù)相比的一大優(yōu)勢柑贞。
模型-視圖-控制器
通常在“框架**支持MVC”這樣的語句中聽到MVC這個術(shù)語方椎。MVC更多地關(guān)心代碼的整體組織,而不是任何特定的API钧嘶。很多Web框架使用這個模型來幫助開發(fā)人員管理程序的結(jié)構(gòu)棠众。大型的Web應(yīng)用程序可以有很多代碼,因此最好在一開始就擁有一個有效的結(jié)構(gòu)。這樣闸拿,即使是其他框架的用戶(甚至其他語言)也可以很容易地理解代碼空盼,因?yàn)樗麄儗VC已經(jīng)很熟悉了。
MVC把軟件系統(tǒng)分為三個基本部分:
- 模型新荤。用于呈現(xiàn)和修改的數(shù)據(jù)揽趾。在Python框架中,這個組件通常類來表示對象關(guān)系映射器苛骨。
- 視圖篱瞎。該組件的任務(wù)是向用戶展示模型的數(shù)據(jù)。通常痒芝,該組件通過模版實(shí)現(xiàn)俐筋。
- 控制器。負(fù)責(zé)轉(zhuǎn)發(fā)請求严衬,對請求進(jìn)行處理澄者。
可能有人會認(rèn)為MVC是一個復(fù)雜的設(shè)計(jì)模式,其實(shí)并不是请琳。它被用于Python闷哆,因?yàn)樗驯蛔C明可以用于創(chuàng)建干凈,可維護(hù)的網(wǎng)站单起。
構(gòu)建網(wǎng)站的工具
網(wǎng)站是很復(fù)雜的抱怔,有一些工具可以幫助Web開發(fā)人員使代碼更易于編寫和維護(hù)。所有編程語言嘀倒,所有框架中都有這樣的工具屈留。開發(fā)者并不會被強(qiáng)制要求使用這些工具,通常也不存在最好的工具测蘑。不過開發(fā)者有必要學(xué)一些這樣的工具灌危,來簡化網(wǎng)站的開發(fā)過程。
模版
可以通過一個庫來使HTML和Python代碼混合碳胳。這樣做剛開始的時(shí)候很方便勇蝙,但是會導(dǎo)致代碼變得不可維護(hù)。這就是模版誕生的背景挨约。在最簡單的情況下味混,模版只是帶有占位符的HTML文件。在填寫占位符后诫惭,HTML文件將會返回給用戶的瀏覽器翁锡。
Python已經(jīng)有兩種方式構(gòu)建簡單的模版了:
>>> template = "<html><body><h1>Hello %s!</h1></body></html>"
>>> from string import Template
>>> template = Template("<html><body><h1>Hello ${name}</h1></body></html>")
>>> print template.substitute(dict(name='Dinsdale'))
<html><body><h1>Hello Dinsdale</h1></body></html>
為了基于復(fù)雜的模型數(shù)據(jù)生成復(fù)雜的HTML,通常需要像Python的for
和if
這樣的控制語句夕土。模版引擎支持這樣復(fù)雜的模版馆衔。
Python有很多可用的模版引擎瘟判。其中的一些定義了一種易于學(xué)習(xí)的純文本編程語言,易學(xué)習(xí)的部分原因在于其范圍有限角溃。其他的引擎使用XML拷获,模版輸出保證始終是有效的XML。還有很多其他的變種减细。
一些框架自帶模版引擎或者推薦像用戶推薦一個匆瓜。在沒有理由使用其他引擎的情況下,最好使用由框架提供或者推薦的模版引擎邪财。
流行的模版引擎包括
數(shù)據(jù)持久化
聽起來非常復(fù)雜陕壹,但是數(shù)據(jù)持久化只是數(shù)據(jù)存儲。該數(shù)據(jù)可能是博客條目的內(nèi)容树埠,公告板上的帖子糠馆,或者Wiki頁面的文本。當(dāng)然,在Web服務(wù)器上存儲信息的方法有很多種。
通常會使用像MySQL和PostgreSQL這樣的關(guān)系數(shù)據(jù)庫引擎阵幸,因?yàn)樗鼈冊谔幚碛蓴?shù)百萬個條目組成的大型數(shù)據(jù)時(shí)具有良好的性能熙兔。也有像SQLite這樣的小型數(shù)據(jù)庫引擎椎扬,它通過sqlite3模塊和Python捆綁,僅使用一個文件。它沒有其他的依賴,對于小網(wǎng)站而言皂岔,使用SQLite就足夠了。
關(guān)系型數(shù)據(jù)庫通過SQL查詢數(shù)據(jù)展姐。Python程序員通常不太喜歡使用SQL躁垛,因?yàn)樗麄兿矚g使用對象』浚可以使用ORM(對象關(guān)系映射)技術(shù)將Python對象保存在數(shù)據(jù)庫中教馆。ORM將所有面向?qū)ο蟮脑L問轉(zhuǎn)換成SQL語句。大多數(shù)的框架都使用ORM擂达。
第二種做法是將數(shù)據(jù)存儲在普通的文本文件中(有時(shí)稱為“平面文件”)土铺。這對于簡單站點(diǎn)來說非常好用,但是如果網(wǎng)站對存儲的數(shù)據(jù)執(zhí)行許多更新操作板鬓,則難以保持?jǐn)?shù)據(jù)的正確悲敷。
第三種方案是面向?qū)ο蟮臄?shù)據(jù)庫(也稱為“對象數(shù)據(jù)庫”)。這些數(shù)據(jù)庫將數(shù)據(jù)與程序運(yùn)行時(shí)內(nèi)存中的數(shù)據(jù)以相同的結(jié)構(gòu)存儲穗熬。(相比之下镀迂,ORM將對象數(shù)據(jù)作為表中的數(shù)據(jù)行和這些行之間的關(guān)系存儲。)直接存儲對象的優(yōu)點(diǎn)在于幾乎所有的對象都可以以直接的方式保存唤蔗,而關(guān)系型數(shù)據(jù)庫中,很難用對象表示數(shù)據(jù)。
框架通常會對使用的存儲類型作出提示妓柜。最好使用框架推薦的類型箱季,除非應(yīng)用有特殊的有求。
框架
創(chuàng)建網(wǎng)站包括編寫代碼以提供各種服務(wù)棍掐。不論網(wǎng)站的復(fù)雜程度或者目的藏雏,提供特定服務(wù)的代碼通常以相同的方式工作。將這些常見的解決方案提取到可重用的代碼中作煌,產(chǎn)生了用于Web開發(fā)的所謂的“框架”掘殴。也許最有名的Web開發(fā)框架是Ruby on Rails,但是Python有自己的框架粟誓。其中的一部分來自Rails的啟發(fā)奏寨,或者借鑒了Rails的想法,但有很多框架在Rails之前就出現(xiàn)了鹰服。
最初病瞳,Python Web框架傾向于將開發(fā)網(wǎng)站所需的所有服務(wù)納入到一個巨大的集成工具中。任何兩個框架之間都是不能互相合作的:為一個框架開發(fā)的程序悲酷,不能不經(jīng)巨大修改就部署在另外一個的框架上套菜。這導(dǎo)致了“極簡”Web框架的開發(fā),這種框架提供工具來完成Python代碼和http協(xié)議之間的通信设易,其他的服務(wù)單獨(dú)將以組件的形式加入應(yīng)用逗柴。一些特殊的標(biāo)準(zhǔn)被開發(fā)出來,來允許框架之間的有限互操作性顿肺,例如允許不同的模版引擎互換使用的標(biāo)準(zhǔn)戏溺。
自從WSGI出現(xiàn)以來,Python Web框架向基于WSGI標(biāo)準(zhǔn)的互操作性的方向發(fā)展⌒冢現(xiàn)在于购,許多Web框架,無論是“全椫荆”(提供部署最復(fù)雜的網(wǎng)站所需的所有工具)和最簡單的肋僧,都是由可重復(fù)使用的組件的集合構(gòu)建的,這些組件可以在多個框架中使用控淡。
大多數(shù)用戶想要選擇的是一個具有活躍社區(qū)的“全椣臃停”框架。這些框架往往由很好的文檔掺炭,并提供了簡單的方式在最短時(shí)間內(nèi)生成功能完整的網(wǎng)站辫诅。
一些有名的框架
框架的數(shù)量多的令人難以置信,因此這里只介紹幾個最流行的框架涧狮。
Django
Django是由幾個耦合緊密的組件組成的框架炕矮。它包含了一個強(qiáng)大易用的ORM和數(shù)據(jù)在線管理平臺么夫。模版引擎是基于文本的,為不懂Python的設(shè)計(jì)人員設(shè)計(jì)肤视。它支持模版繼承和過濾器(類似于Unix管道)档痪。Django捆綁了很多方便的功能,如創(chuàng)建RSS源或通用視圖邢滑,這使得不寫一行Python代碼來創(chuàng)建網(wǎng)站變的可能腐螟。
它有一個人數(shù)眾多的國際化社區(qū),其中的成員已經(jīng)創(chuàng)建了很多網(wǎng)站困后。還有很多附加項(xiàng)目可以擴(kuò)展Django的正常功能乐纸。這部分歸功于Django維護(hù)良好的在線文檔和Django book。
TurboGears
另外一個流行的庫是TurboGears摇予。TurboGears采用已經(jīng)存在的組件汽绢,并通過膠水代碼來創(chuàng)建無縫體驗(yàn)的方法。TurboGears為用戶提供了選擇組件的靈活性趾盐。例如庶喜,ORM和模版引擎可以更改為使用與默認(rèn)庫不同的庫。
文檔見這里救鲤,其中可以找到Screencast的鏈接久窟。
“本譯文僅供個人研習(xí)、欣賞語言之用本缠,謝絕任何轉(zhuǎn)載及用于任何商業(yè)用途斥扛。本譯文所涉法律后果均由本人承擔(dān)。本人同意簡書平臺在接獲有關(guān)著作權(quán)人的通知后丹锹,刪除文章稀颁。”