標籤:

Python web 開發一定要用框架嗎?有沒其它方法,類似 PHP 的語句?


首先要記得,最早的、最基本的 CGI 程序,所謂的 web 輸出不過就是由 web server 將這個程序輸出的內容重定向給瀏覽器而已。

#!/bin/bash

cat &<&HTTP/1.0 200 OK

Hello

EOF

這都可以做一個最簡單的 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 網站開發方面的學習教程有哪些?

TAG:Python | PHP |