Python web 開發一定要用框架嗎?有沒其它方法,類似 PHP 的語句?
首先要記得,最早的、最基本的 CGI 程序,所謂的 web 輸出不過就是由 web server 將這個程序輸出的內容重定向給瀏覽器而已。
#!/bin/bash
cat &<&HTTP/1.0 200 OK HelloEOF
這都可以做一個最簡單的 CGI 程序運行起來
因為 CGI 依賴於 one-proc-per-request 模型,效率低下,所以後來有了內嵌到 Apache 伺服器中的模塊設計,比如 mod_php 等。PHP 最常見(傳統?)的部署形式,mod_php 就是作為 web server 附加組件運行的,所以很多事情是由設計默認、環境代為完成的,比如和 HTTP server 的通信等。Python 更偏向於通用編程語言,如果要做 Web 開發,可以有兩種方式:通過 Apache / Nginx 做前端;自己做 HTTP server。用 Apache / Nginx 做前端的話,排除 CGI 不說,所需要了解的是 Python 和 HTTP server 介面的協議,如現在流行的 FastCGI 協議。Python 使用 FastCGI 協議最常見的介面是 WSGI API。web.py / cherrypy 等許多框架就是從提供 WSGI 協議支持和簡單回調介面相應客戶請求作為設計起點的輕量級框架。除此之外,Python 還可以不依賴 web server (Apache / Nginx),自己實現 HTTP 協議,如:
基於 Base / Simple / CGIHTTPServer 基於 SocketServer.TCPServer基於 asyncore
基於 Twisted 等方法不一而足。狼大人 已經回答的很精彩了,本不想再答,但問題是針對 Python Web 開發問的,我就略說一下我的看法。首先如狼大人所說,所有伺服器端 HTTP 處理都是類 CGI 的原理,接受符合協議的標準輸入文本流,從標準輸出流輸出同樣符合協議的文本,也就是「請求」和「響應」。然後說到樓主拿出來和 Python 進行比較的 PHP, PHP 本質上是四部分組成,我按照最小子集開始逐漸擴大的順序列出來:
- 語言和語言運行時環境(PHP Script),寫一個 *.php 的腳本然後在終端運行,往往可以和 sh 腳本或者 python 腳本等價,這裡就只用到了 PHP 的語言運行時。
- 標準庫,也就是除了上述的最小子集外,PHP 中可以用到的一系列內置函數、內置類。
- Web 運行時,這部分負責的就是將 CGI 模式的文本輸入流封裝,產生 $_GET、$_POST、$_COOKIE 和一系列和 Web 相關的支持,同時在腳本執行時候將標準輸出(echo 列印出來的內容)也添加協議中的附加內容(Content-Type、狀態碼、響應頭等)輸出。
- 模版引擎:PHP 比較不同的是還內置模版引擎,這個模版引擎和其他語言中作為工具的模版有點不同,PHP 在語法解析的層面上是原生支持和模版混寫的,所有沒有包在 &中的文本都不作為語法解析,而是直接作為輸出,PHP 的模版也籍此實現。
再看看 Python,Python 一開始就不像 PHP 一樣是專門為 Web 設計的,所以 Python 在設計上類似 Java、Ruby,目標是作為通用工具語言。一個新安裝的 Python 包含以下兩部分:
- 語言和語言運行時環境(Python 虛擬機)
- 標準庫(Python 的標準庫是出名的給力,覆蓋面極廣)
不同於 PHP,Python 的 Web 並不作為語言的一部分實現。因為通用語言的設計目標,Python 通過 C extension 形式的標準庫,有原生的網路編程支持。也就是說,任何人都可以用 Python 的 socket 介面自己編寫 Web 伺服器。由於圖靈機的等價性,用 Python 實現一個 PHP VM 也是技術可行的。
但是絕大多數人用 Python 做 Web 開發的時候不會選擇自己用 socket 去實現一個伺服器,因為 Python 官方有 Web 設計的標準—— WSGI (PEP 333 http://www.python.org/dev/peps/pep-0333/)。WSGI 定義的標準將 Web 應用劃分為 WSGI Application 和 WSGI Server。後者類似 PHP 的 Web 運行時,提供對標準輸入輸出流的封裝,前者則類似自己寫的 PHP 應用,在封裝後的環境中對具體應用進行 Web 開發。強烈建議閱讀一下 PEP 333,對於理解 WSGI 的這種劃分很有幫助。目前為止,WSGI 在主流 Python 應用中得到廣泛支持,樓主所謂的 Python Web 框架,其實都是符合 WSGI Application 規範下,對 Web 開發中環境進行的封裝,如果樓主有精力,閱讀一下 Bottle 框架的源碼,就會非常有收穫——只有一個文件,但是完整實現 WSGI 並封裝為自己風格的一個環境(一個 Bottle 的實例就是一個 WSGI Application,實現了 __call__ 方法)。像 Django 這種框架已經逾越了 Web 框架範圍的了,將 ORM、表單驗證等等聚集成一塊,有點像 RoR 的感覺。真正和 PHP 的 Web 環境等價的,是類似 Bottle 這樣的微內核框架。現在比起 PHP,Python 還欠缺的是一個模版引擎。Python 本身並不提供像 PHP 一樣和模版文本的混寫方式,我建議樓主也忘了這種方式吧,即使在 PHP 中也別濫用,因為這是噩夢滋生的溫床。真正的模版應該指負責應用中的視圖顯示邏輯,在 Python 中 jinja2、mako 等就是提供這類服務的,PHP 中一定記得管好自己不該寫在模版中的別寫在模版中。回到問題主線,Python 開發一定要用 Web 框架嗎?不一定,但是用一個良好封裝了的 WSGI Application 框架可以讓你不用自己去解析請求頭、拼接響應頭,如果不用 Web 框架相當於把 PHP 剝離到只能寫腳本。而用一個框架,尤其是 WSGI Application 框架,不僅為低層協議提供了良好的封裝,還能在 WSGI 公約下和廣大 WSGI Server 協作。比如在 Linux 下部署 Python Web 應用,我可以使用 uwsgi 然後用 nginx 反向代理;但我在 Windows 下開發,我可以用標準庫內置的 wsgiref 來做 WSGI Server,我的應用不需要做任何改動。
至於 Python 能不用像 PHP 一樣內嵌到模版中,歷史上到曾經有過一個叫 PSP(不是那個 PSP,是 Python Server Page)的東西,現在應該記得的人不多了吧。用一個領域邏輯、持久化、控制流、視圖邏輯層層分的清清楚楚的開發方式,不是比什麼都堆在一個頁面裡面要優雅的多嗎?
另外,如果樓主是阿達的話,可以讓副站長把深大場地申請系統的代碼給你看看。那是一個 ASP 寫成的系統,歷經將近五年的運行和維護,所有邏輯都寫在 ASP/PHP 風格的模版里。現在就算團委提要求也已經沒有人敢維護它了,因為不動還好,一動炸彈就爆炸。用 Python 寫一個 PHP 解釋器不就行了,看樓上扯的
像Python,Perl,Ruby這些腳本語言設計初衷本來就不是為了Web,所以它們才需要各種庫啊框架啊什麼的,php,asp什麼的本身設計時就考慮到嵌入到html中去,但是也不是說不是為Web開發而生的語言不能開發Web,只要你自己足夠強大,哪怕用c也是可以寫web程序的。
如果你說的「類似PHP的語句」是指在HTML中嵌入程序代碼的話,那麼有一些template engine是可以實現類似功能的,比如jinja2可以(部分地)在模板中嵌入python代碼,再配合一些其它庫,可以做到讓你像寫php一樣用python開發web應用——但是個人認為這種東西已經可以被稱為框架了。
但是,這種把邏輯和視圖混雜在一起的開發方式已經落後了,所以目前可能還沒有一個python框架讓你完全像php那樣開發。一般的python框架都會把MVC清晰地分開,模板引擎也不會鼓勵在裡面寫太多邏輯。
一般來說過於小巧或者過於大型的web項目不需要使用框架,前者沒必要,後者受限制。框架是給中小型傳統web項目用的,目的是快速開發,約束細節,方便招聘。
還有很多非侵入性,庫類型的web開發組件可以用到不適於框架的web項目中。
建議去看 Flask 框架的 tutorial
樓上幾位都說的很清楚了。就不多說了你可以看下http://www.modpython.org/或是http://karrigell.sourceforge.net/en/index.html
python和php不同,他不是一個純粹為web開發設計的語言。
所以你得理解他首先是一種腳本語言,然後基於這種語言有各種豐富的庫可以實現各種功能。例如cgi庫就是非常基礎的web開發庫,當然太基礎了所以還有很多web框架來做進一步抽象優化。
最終回答,如果你想找php那樣包括語法和內置庫絕大部分都面向web開發的python實現是沒有的。不過這樣作你也許web開發會費點事,但是學會了你可以做更多php做不到的事。
看了下PEP 333,受益匪淺,強烈建議看看。
推薦閱讀:
※在 Python 中,為什麼 pow 這樣的函數可以直接調用,而 floor 這樣的函數得先導入模塊?
※如何開始在github上學習東西?
※gitbash中只調用python沒反應但如果後面添加了具體.py文件可以執行,是怎麼回事?
※在matlab2015a中如何調用python?
※最好的 Python 網站開發方面的學習教程有哪些?