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

來源:互聯網
上載者:User

回複內容:

首先要記得,最早的、最基本的 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 反向 Proxy;但我在 Windows 下開發,我可以用標準庫內建的 wsgiref 來做 WSGI Server,我的應用程式不需要做任何改動。

至於 Python 能不用像 PHP 一樣內嵌到模版中,曆史上到曾經有過一個叫 PSP(不是那個 PSP,是 Python Server Page)的東西,現在應該記得的人不多了吧。用一個領域邏輯、持久化、控制流程、視圖邏輯層層分的清清楚楚的開發方式,不是比什麼都堆在一個頁面裡面要優雅的多嗎?

另外,如果樓主是阿達的話,可以讓副站長把深大場地申請系統的代碼給你看看。那是一個 ASP 寫成的系統,曆經將近五年的運行和維護,所有邏輯都寫在 ASP/PHP 風格的模版裡。現在就算團委提要求也已經沒有人敢維護它了,因為不動還好,一動炸彈就爆炸。用 Python 寫一個 PHP 解譯器不就行了,看樓上扯的如果你說的“類似PHP的語句”是指在HTML中嵌入程式碼的話,那麼有一些template engine是可以實作類別似功能的,比如jinja2可以(部分地)在模板中嵌入python代碼,再配合一些其它庫,可以做到讓你像寫php一樣用python開發web應用——但是個人認為這種東西已經可以被稱為架構了。

但是,這種把邏輯和視圖混雜在一起的開發方式已經落後了,所以目前可能還沒有一個python架構讓你完全像php那樣開發。一般的python架構都會把MVC清晰地分開,模板引擎也不會鼓勵在裡面寫太多邏輯。

像Python,Perl,Ruby這些指令碼語言設計初衷本來就不是為了Web,所以它們才需要各種庫啊架構啊什麼的,php,asp什麼的本身設計時就考慮到嵌入到html中去,但是也不是說不是為Web開發而生的語言不能開發Web,只要你自己足夠強大,哪怕用c也是可以寫web程式的。一般來說過於小巧或者過於大型的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,受益匪淺,強烈建議看看。
  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.