標籤:

Python 有哪些好的 Web 框架?

pylons 如何?


對初學者來說,循序漸進是最重要的,我推薦學習 Flask(Welcome | Flask (A Python Microframework))

Flask 很輕,花很少的成本就能夠開發一個簡單的網站。非常適合初學者學習。

Flask 框架學會以後,可以考慮學習插件的使用。例如使用 WTForm + Flask-WTForm 來驗證表單數據,用 SQLAlchemy + Flask-SQLAlchemy 來對你的資料庫進行控制。

BTW:果殼網基於 Flask 開發的。

另外也簡單介紹下其他框架:

1. Django。如樓上所說,是一個全能型框架。目前 Django 的使用面還是很廣的,有學習的價值,但是不建議初學者學習,因為要學習的東西太多了,一下子難以吸收會失去興趣。當然,Django 的目的是為了讓開發者能夠 快速 地開發一個網站,它提供了很多模塊,其中我最喜歡的就是 admin 模塊,http://your.site.com/admin 就進入了網站的後台(內置的哦~)方便地對數據進行操作,等等。。。。因此,如果對 Django 熟悉的話,papapa 一下子就寫好一個網站的原型了。

2. Tornado。傳說中性能高高的框架。Tornado 是一個很好的框架,支持非同步處理的功能,這是它的特點,其他框架不支持。另外一點是,Tornado 的設計似乎更注重 RESTful URL。但 Tornado 提供了網站基本需要使用的模塊外,剩下的則需要開發者自己進行擴展。例如資料庫操作,雖然內置了一個 database 的模塊(後來獨立出去了,現在叫做 torndb,bdarnell/torndb · GitHub)但是不支持 ORM,快速開發起來還是挺吃力的。如果需要 ORM 支持的話,還需要自己寫一層將 SQLAlchemy 和 Tornado 聯繫起來,而且這裡還有一個坑。

BTW:知乎就是基礎 Tornado 開發的。

3. Bottle。Bottle 和 Flask 都屬於輕量級的 Web 框架。但是 Bottle 似乎落寞了。我覺得跟他的 API 設計有關係。個人認為 Bottle 使用起來不那麼順手,因此也用得少。這裡不做太多介紹。

4. web.py。也是很輕的一個框架,使用不多,也不做介紹。

5. web2py。我看樓上都沒有對這個框架做介紹。這個框架是 Google 在 web.py 基礎上二次開發而來的,兼容 GAE 。性能據說很高,曾經用他來做自己的主頁,感覺也還不錯。缺點同樣是對擴展支持不太好,需要自己進行擴展。

6. Quixote。著名的 豆瓣 就是基於 Quixote 開發的。跟上面幾個框架不同,Quixote 的路由會有些特別。另外 Quixote 的性能據說也好。


樓上這麼多人都說了Flask和Django, 我就不重複了。

我在豆瓣2個產品線上使用了「小眾」的Pyramid(據我所知國內就《碼農周刊》在用)。其實它是一個很成熟的企業級別的Web框架。

它在官網上介紹自己的時候用過這麼一句:

pay only for what you eat

它的設計和Flask有些像,和Django相比內建的功能要少很多,但是相對於Flask又多了一些基本的(如auth),不過模板和資料庫管理方案都還是需要自己設置。假如你不希望應用使用Django那麼重,不妨看看我這2年從使用上把它和Flask的對比:

1. Pyramid更適合做一個想「長久」的應用。沒有人能預測你的應用未來的增長情況和項目複雜度,我發現Flask項目很容易在項目發展到一定階段需要做某些方面的重新設計,這種情況大部分出現在引用新的第三方擴展以及技術選型改變的時候。雖然同樣是優秀的可插拔設計,Pyramid由於自帶多一些的功能(比如HTTP緩存),以及擴展的設計等原因,會讓你做的改變盡量的少甚至於直接加代碼即可。

2. 插件豐富且由官方支持。Flask的插件雖然非常豐富,但是千萬別小看了這個框架,它的背後是Pylons,很多插件都是官方寫的,而Flask大部分都是第三方開發者寫的。穩定性和質量是有保證的。

3. 設計的要比其他框架快一些,我在實際環境中做過實驗對比,確實更快一些。雖然並不是什麼讓人心動的提升。

4. 我最喜歡的就是它的「可擴展的模板」。Pyramid把模板的使用插件化,切換模板引擎非常方便,而且同一個項目,你還可以使用多種模板系統!

由於中文文檔太匱乏,英文文檔寫得不夠細緻,以至於有時候得自己讀源碼找靈感,另外Django和Flask等框架光芒太耀眼了,它被嚴重低估了。


我覺得新手還是不要用Django這樣龐大的東西,建議Flask,很多東西自己實現。有一定的認識之後,再用Django,會覺得很順心。

越是大的項目,越會覺得框架能幫助的太少,更多的是定製.Django修改起來相當麻煩.但微框架你從一開始就差不多是在定製了.


Tornado

Tornado Web Server

Tornado is an open source version of the scalable, non-blocking web server and tools that power FriendFeed. The FriendFeed application is written using a web framework that looks a bit like web.py or Google"s webapp, but with additional tools and optimizations to take advantage of the underlying non-blocking infrastructure.

用tornado的一個很明顯的好處是,有些輪子自己造才能學到東西。

中文官網鏡像 Tornado Web伺服器

另一個好處是因為是facebook開源的,加上自身優秀的代碼質量和傲嬌的效率表現,目前非常火,誕生了一大批的優秀產品,如你在它上面提出這個問題的 知乎, quora,INK361 ,42區 . 遇見 等等。


來,自己動手寫一個:不超過1000行代碼

http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0014023080708565bc89d6ab886481fb25a16cdc3b773f0000

再貼上源碼,1500行,一半都是注釋:

https://github.com/michaelliao/awesome-python-webapp/blob/release/www/transwarp/web.py


  • Aiohttp 0.21.6 — http client/server for Asyncio.
  • Bottle 0.12.9 — Fast, simple and lightweight WSGI micro web-framework
  • Django 1.9.7 — The Web framework for perfectionists with deadlines
  • Falcon 1.0.0 — A high-performance Python framework for building cloud APIs
  • Flask 0.11.1 — A microframework based on Werkzeug, Jinja2 and good intentions
  • Muffin 0.7.3 — A web-framework based on Asyncio stack
  • Pyramid 1.7 — A small, fast, down-to-earth, open source Python web framework
  • Weppy 0.7.1 — The webframework for humans
  • Wheezy Web 0.1.485 — A lightweight, high performance, high concurrency WSGI web framework

原文:Python#x27;s Web Framework Benchmarks


只想推薦 web2py。

不要說這個框架很冷門,推薦flask 的大部分是沒有做過真正項目的玩家而已。

因為真的很爽。

希望喜歡這個框架的人能點個贊。

我完整的把他的home 從頭看到了尾,有些東西反覆的去看,真的收穫良多。

不過看個人愛好吧,和公司要求。

以上就是我的意見

用起來真的很舒服,哈哈。


web.py不錯,簡單,小巧,靈活


新手建議Gunicorn + Flask.


我學python web開發,是django -&> web.py -&> tornado -&> bottle -&> flask,現在團隊內部使用的是基於flask的二次開發框架。

最初學django,因為隨手搜一下python web開發框架,滿屏都是講django的,就學學咯。

後來覺得,太tmd重了。逆反心理作用下,就去看web.py了。

web.py其實挺不錯的,可惜驚聞作者仙逝無人維護,心裡一涼。剛好又聽說tornado性能好、像web.py,學學也不壞。其實一直都喜歡這種非阻塞IO的高性能

後來接觸到gevent,知道非阻塞IO還有更優雅的實現方式。而tornado確實不滿足我內心對「簡潔」的苛求,於是又一頭栽進bottle這個簡單到只有一個文件的庫中,相見恨晚

後來朋友推薦flask,原因是極像bottle但對大項目組織支持更好,而且插件更多、生態更好。抱著試試的心態學起來。然後就用到現在了


目前主流的Web框架有:

  • Bottle:這是一個微框架,代碼不到千行,不過很少有商業項目拿Bottle做開發的,一般用在個人等Demo項目中。bottlepy/bottle
  • Django:這是Python界中最流行的Web框架,沒有之一。很多大廠都在用,比如Instagram、Disqus,它是一個 All In One 的框架,從模板到ORM都是內嵌的,最大的特色是還自帶Admin管理後台。把 models 定義好之後,就可以在後台管理數據了 django/django
  • Flask:它也是主流框架之一,它的特點是靈活性非常高,可以自定義模塊。pallets/flask
  • Tornado:它的特點之一是非同步Web框架,適合做長連接,它不僅是Web框架,還是一個Web Server,同時提供了非同步庫。tornadoweb/tornado
  • Sanic:它是一個類似Flask的非同步web框架,基於Python3.5的 async/await 原生非同步語法實現的。根據官方文檔所說,性能非常高 channelcat/sanic,


現在Python成為了刺手可熱的一門語言,在如何快速入門的同時,如何進行高效的開發是一門語言非常重要的優勢,可能大家更關注Web框架,但是其實還有很多其他的框架你值得關注。

我們收集馬哥Python了超過2000名學員的意見和建議,對Python常用的框架進行了梳理,這些框架包括事件I/O,OLAP,Web開發,高性能網路通信,測試,爬蟲等。

Python目前主流的應用包括:Web開發、圖形界面開發、系統網路運維、網路編程、科學數字計算、3D遊戲開發,而我們特別針對這6個方向進行了框架和庫的整理。

一、Python的幾大主流Web開發框架

1.Django: Python Web應用開發框架

Django 應該是最出名的Python框架,GAE甚至Erlang都有框架受它影響。Django是走大而全的方向,它最出名的是其全自動化的管理後台:只需要使用起ORM,做簡單的對象定義,它就能自動生成資料庫結構、以及全功能的管理後台。

網址:The Web framework for perfectionists with deadlines

2.Bottle: 微型Python Web框架

Bottle是一個簡單高效的遵循WSGI的微型python Web框架。說微型,是因為它只有一個文件,除Python標準庫外,它不依賴於任何第三方模塊。

網址:Bottle: Python Web Framework

3.Flask:也是一個Web應用框架

不同於Django它是輕量級Web應用框架。基於Werkzeug WSGI工具箱和Jinja2 模板引擎。Flask也被稱為「microframework」,因為它使用簡單的核心,用extension增加其他功能。Flask沒有默認使用的資料庫、窗體驗證工具。 但是Flask是可以擴增的,你可以使用可以用Flask-extension增加前邊沒有的一些功能。

網址:Flask (A Python Microframework)

4.Tornado:非同步非阻塞IO的Python Web框架

Tornado的全稱是Torado Web Server,從名字上看就可知道它可以用作Web伺服器,但同時它也是一個Python Web的開發框架。最初是在FriendFeed公司的網站上使用,FaceBook收購了之後便開源了出來。Tornado 和現在的主流 Web 伺服器框架和大多數Python框架有著明顯的區別:它是非阻塞式伺服器,而且速度相當快。也是比較常被使用的Python開源框架之一。

網址:Tornado Web Server - Tornado 4.5.1 documentation

Web2py:全棧式Web框架

Web2py是一個為Python語言提供的全功能Web應用框架,旨在敏捷快速的開發Web應用,具有快速、安全以及可移植的資料庫驅動的應用,兼容Google App Engine。

網址:http://www.web2py.com/

webpy: 輕量級的Python Web框架

webpy的設計理念力求精簡(Keep it simple and powerful),源碼很簡短,只提供一個框架所必須的東西,不依賴大量的第三方模塊,它沒有URL路由、沒有模板也沒有資料庫的訪問。

網址:Welcome to web.py! (web.py)

二、Python的爬蟲框架

Scrapy:Python的爬蟲框架

Scrapy是一個使用Python編寫的,輕量級的,簡單輕巧,並且使用起來非常的方便。

網址:A Fast and Powerful Scraping and Web Crawling Framework

三、圖形界面開發框架

PyQt

PyQt能夠實現高人氣Qt庫,因此如果大家熟知如何利用其它語言進行Qt開發,那麼上手PyQt也不會出現什麼障礙。其能夠讓Python應用具備跨平台外觀風格與使用感受,同時繼承Qt社區所帶來的龐大知識支持與工具選項。

PyQt同時提供商用與GPL許可(這一點與Qt項目本身有所不同),感興趣的朋友也可點擊此處了解與PyQt許可相關的常見問題(英文原文)。

網址:Riverbank | Software | PyQt | What is PyQt?

Tkinter

如果要為Python選出一款能夠稱得上「標準」的GUI工具包,那麼答案應該是Tkinter。Tkinter是一款以Tcl/Tk為基礎的打包工具,而後者則屬於誕生自上世紀九十年代初的高人氣圖形界面與語言組合。Tkinter的最大優勢在於擁有豐富的資源,其中包括文本與代碼示例以及龐大的用戶社區。通過示例,我們能夠輕鬆上手這套圖形界面實現方案。

Tkinter遵循Python許可,同時基於Tcl/Tk的BSD許可。

網址:24.1. Tkinter - Python interface to Tcl/Tk - Python 2.7.13 documentation

WxPython

WxPython 將針對C++的wxWidgets跨平台GUI庫帶給了Python。WxPython是一套較為現代的方案,其外觀的原生程度高於Tkinter,這主要歸功於其更傾向於針對不同系統平台建立控制項成果。其易於上手,同時擁有快速發展的開發者社區。不過大家需要自行將wxPython與應用相綁定,因為其無法通過Python自動進行安裝。

WxPython採用其父項目wxWindows的庫許可,這一許可獲得了OSI批准。

網址:Welcome to wxPython!

四、Python系統運維常用庫

1、psutil是一個跨平台庫(http://code.google.com/p/psutil/)

能夠實現獲取系統運行的進程和系統利用率(內存,CPU,磁碟,網路等),主要用於系統監控,分析和系統資源及進程的管理。

2、IPy(http://github.com/haypo/python-ipy),輔助IP規劃。

3、dnspython(http://dnspython.org)Python實現的一個DNS工具包。

4、difflib:difflib作為Python的標準模塊,無需安裝,作用是對比文本之間的差異。

5、filecmp:系統自帶,可以實現文件,目錄,遍歷子目錄的差異,對比功能。

6、smtplib:發送電子郵件模塊

7、pycurl(http://pycurl.sourceforge.net)是一個用C語言寫的libcurl Python實現,功能強大,支持的協議有:FTP,HTTP,HTTPS,TELNET等,可以理解為Linux下curl命令功能的Python封裝。

8、XlsxWriter:操作Excel工作表的文字,數字,公式,圖表等。

9、rrdtool:用於跟蹤對象的變化,生成這些變化的走走勢圖

10、scapy(http://www.wecdev.org/projects/scapy/)是一個強大的互動式數據包處理程序,它能夠對數據包進行偽造或解包,包括發送數據包,包嗅探,應答和反饋等功能。

11、Clam Antivirus免費開放源代碼防毒軟體,pyClamad,可以讓Python模塊直接使用ClamAV病毒掃描守護進程calmd。

12、pexpect:可以理解成Linux下expect的Python封裝,通過pexpect我們可以實現對ssh,ftp,passwd,telnet等命令行進行自動交互,而無需人工干涉來達到自動化的目的。

13、paramiko是基於Python實現的SSH2遠程安裝連接,支持認證及密鑰方式。可以實現遠程命令執行,文件傳輸,中間SSH代理等功能。相對於Pexpect,封裝的層次更高,更貼近SSH協議的功能,官網地址:http://paramiko.org(依賴:Crypto,Ecdsa,Python開發包python-devel)

14、fabric是基於Python實現的SSH命令行工具,簡化了SSH的應用程序部署及系統管理任務,它提供了系統基礎的操作組件,可以實現本地或遠程shell命令,包括命令執行,文件上傳,下載及完整執行日誌輸出等功能。Fabric在paramiko的基礎上做了更高一層的封裝,操作起來更加簡單。官網地址:http://www.fabfile.org(依賴setuptools,Crypto,paramiko包支持)

15、CGIHTTPRequestHandler實現對CGI的支持。

16、ansible(http://www.ansibleworks.com/)一種集成IT系統的配置管理,應用部署,執行特定任務的開源平台。基於Python實現,由Paramiko和PyYAML兩個關鍵模塊構建。Ansibl與Saltstack最大的區別是Ansible無需在被控主機上部署任何客戶端,默認直接通過SSH通道進行遠程命令執行或下發功能。

17、YAML:是一種用來表達數據序列的編程語言。

18、playbook:一個非常簡單的配置管理和多主機部署系統。

19、saltstack(http://saltstack.com)是一個伺服器基礎架構集中化管理平台,一般可以理解為簡化版的puppet和加強版的func。Saltstack基於Python語言實現,結合輕量級消息隊列ZeroMQ,與Python每三方模塊(Pyzmq,PyCrypto,Pyjinja2,python-msgpack和PyYAML等)構建。

20、func,為解決集群管理,監控問題需設計開發的系統管理基礎框架。

四、Python科學數字計算的框架

Python中的數據科學計算庫有Numpy、Scipy、pandas、matplotlib

Numpy是一個基礎性的Python庫,為我們提供了常用的數值數組和函數。numpy(Numerical Python extensions)是一個第三方的Python包,用於科學計算。這個庫的前身是1995年就開始開發的一個用於數組運算的庫。經過了長時間的發展,基本上成了絕大部分Python科學計算的基礎包,當然也包括所有提供Python介面的深度學習框架。

網址:NumPy - NumPy

Scipy是Python的科學計算庫,對Numpy的功能進行了擴充,同時也有部分功能是重合的。Numpy和Scipy曾經共享過基礎代碼。

網址:SciPy.org - SciPy.org

pandas是一個流行的開源Python項目,它的名稱取panel data(面板數據,一個計量經濟學的術語)和Python data analysis(Python數據分析)的意思。matplotlib是一個基於Numpy的繪圖庫。

網址:Python Data Analysis Library

Matplotlib是Python中最常用的可視化工具之一,可以非常方便地創建海量類型地2D圖表和一些基本的3D圖表。Matplotlib最早是為了可視化癲癇病人的腦皮層電圖相關的信號而研發,因為在函數的設計上參考了MATLAB,所以叫做Matplotlib。Matplotlib首次發表於2007年,在開源和社區的推動下,現在在基於Python的各個科學計算領域都得到了廣泛應用。Matplotlib的原作者John D. Hunter博士是一名神經生物學家,2012年不幸因癌症去世,感謝他創建了這樣一個偉大的庫。

網址:Python plotting - Matplotlib 2.0.2 documentation

四、Python的3D遊戲開發框架

Pygame是跨平台Python模塊,專為電子遊戲設計。包含圖像、聲音。pygame建立在SDL基礎上,允許實時電子遊戲研發而無需被低級語言(如機器語言和彙編語言)束縛。基於這樣一個設想,所有需要的遊戲功能和理念都(主要是圖像方面)都完全簡化為遊戲邏輯本身,所有的資源結構都可以由高級語言提供,如Python。

網址:http://www.pygame.org/news

ocos2d-python上面很多都用pyglet這個庫的,裡面主要的精靈什麼的也是針對pyglet的封裝,另外還封裝了些音頻庫什麼的。

網址:cocos2d

五、Python的其他流行的開發框架

Diesel:基於Greenlet的事件I/O框架

Diesel提供一個整潔的API來編寫網路客戶端和伺服器。支持TCP和UDP。

Flask:一個用Python編寫的輕量級Web應用框架

Flask是一個使用Python編寫的輕量級Web應用框架。基於Werkzeug WSGI工具箱和Jinja2

模板引擎。Flask也被稱為「microframework」,因為它使用簡單的核心,用extension增加其他功能。Flask沒有默認使用的數

據庫、窗體驗證工具。

Cubes:輕量級Python OLAP框架

Cubes是一個輕量級Python框架,包含OLAP、多維數據分析和瀏覽聚合數據(aggregated data)等工具。

Kartograph.py:創造矢量地圖的輕量級Python框架

Kartograph是一個Python庫,用來為ESRI生成SVG地圖。Kartograph.py目前仍處於beta階段,你可以在virtualenv環境下來測試。

Pulsar:Python的事件驅動並發框架

Pulsar是一個事件驅動的並發框架,有了pulsar,你可以寫出在不同進程或線程中運行一個或多個活動的非同步伺服器。

Falcon:構建雲API和網路應用後端的高性能Python框架

Falcon是一個構建雲API的高性能Python框架,它鼓勵使用REST架構風格,儘可能以最少的力氣做最多的事情。

Dpark:Python版的Spark

DPark是Spark的Python克隆,是一個Python實現的分散式計算框架,可以非常方便地實現大規模數據處理和迭代計算。DPark由豆瓣實現,目前豆瓣內部的絕大多數數據分析都使用DPark完成,正日趨完善。

Buildbot:基於Python的持續集成測試框架

Buildbot是一個開源框架,可以自動化軟體構建、測試和發布等過程。每當代碼有改變,伺服器要求不同平台上的客戶端立即進行代碼構建和測試,收集並報告不同平台的構建和測試結果。

Zerorpc:基於ZeroMQ的高性能分散式RPC框架

Zerorpc是一個基於ZeroMQ和MessagePack開發的遠程過程調用協議(RPC)實現。和 Zerorpc 一起使用的 Service API 被稱為 zeroservice。Zerorpc 可以通過編程或命令行方式調用。

好了,最後我們再來看看,到底是哪些人學習呢?

目前來學的人群分為以下幾類:

第一類:入行編程新手:大學剛畢業或者其他行業轉崗,想從事編程開發的工作,目前認為Python比較火,想入行;

第二類:Linux系統運維人員:Linux運維以繁雜著稱,對人員系統掌握知識的能力要求非常高,那麼也就需要一個編程語言能解決自動化的問題,Python開發運維工作是首選,Python運維工資的薪資普遍比Linux運維人員的工資高。

第三類:做數據分析或者人工智慧:不管是常見的大數據分析或者一般的金融分析、科學分析都比較大程度的應用了數據分析,人工智慧的一些常見應用也使用了Python的一些技術。

第四類:在職程序員轉Python開發:平常只關注div+css這些頁面技術,很多時候其實需要與後端開發人員進行交互的,現在有很多Java程序在轉到Python語言,他們都被Python代碼的優美和開發效率所折服

第五類:其他:一些工程師以前在做很多SEO優化的時候,苦於不會編程,一些程序上面的問題,得不到解決,只能做做簡單的頁面優化。 現在學會Python之後,可以編寫一些查詢收錄,排名,自動生成網路地圖的程序,解決棘手的SEO問題

如果你有更好的建議,歡迎留言和討論。

你想更深入了解學習Python知識體系,你可以看一下我們花費了一個多月整理了上百小時的幾百個知識點體系內容:

【超全整理】《Python自動化全能開發從入門到精通》筆記全放送


自己都試試唄,反正文檔都很全,用了Django和Flask覺得Flask就是python版的springmvc,用起來不要太順手!


回答問題的朋友們都沒錯,我來說說我的觀點,Python有很多框架可以用來web開發,我自己就學過很多框架,一開始就是學,也沒有目的,感覺花了很多時間,後來有了一定的認識以後發現可以把各種框架結合在一起打造一個系統,我慶幸現在意識到這一點,因為當你把不同的系統結合起來的時候,你會發現那是你的思想與技術的結合,這一點是那些單純學習Python的朋友們無法體會的。目前我已經經歷過那段沒有目的的時期了,如今我把我遇到的問題,如何解決問題,如何獲得更多的收穫彙集成一個個的Live,知乎 Live - 全新的實時問答

可以幫大家減少學習Python的時間,獲得巨大的收穫,最重要的是它是一套互聯網架構的方法,同時也教會你如何讓自己的想法變成現實,而不是為技術而學技術。


如果是學習,可以自己手擼一個框架

python模擬Django框架

Day 5 - 編寫Web框架

Bottle: Python Web Framework

照著抄,然後改。反正Python造輪子簡單,擼唄,擼多了就好,換哪個框架都不怕。


我的推薦是輕量級的 Flask,全能型的 Django,重型的 Pyramid。

學習目的的話,推薦從 Django 入手,了解後轉 Flask。


在各種語言平台中,python湧現的web框架恐怕是最多的,是一個百花齊放的世界,各種micro-framework、framework不可勝數;猜想原因應該是在python中構造框架十分簡單,使得輪子不斷被發明。所

以在Python社區總有關於Python框架孰優孰劣的話題。下面就給大家介紹一下python的幾大框架:

Django

Django 應該是最出名的py框架,Google App Engine甚至Erlang都有框架受它影響。

Django是走大而全的方向,它最出名的是其全自動化的管理後台:只需要使用起ORM,做簡單的對象定義,它就能自動生成資料庫結構、以及全功能的管理後台。

Django提供的方便,也意味著Django內置的ORM跟框架內的其他模塊耦合程度高。

應用程序必須使用Django內置的ORM,否則就不能享受到框架內提供的種種基於其ORM的便利;理論上可以切換掉其ORM模塊,但這就相當於要把裝修完畢的房子拆除重新裝修,倒不如一開始就去毛胚房做

全新的裝修。

Django的賣點是超高的開發效率,其性能擴展有限;採用Django的項目,在流量達到一定規模後,都需要對其進行重構,才能滿足性能的要求。

而Django的缺點主要源自Django堅持自己造所有的輪子,整個系統相對封閉,Django最為人詬病的地方有:

· 系統緊耦合,如果你覺得Django內置的某項功能不是很好,想用喜歡的第三方庫來代替是很難的,比如下面將要說的ORM、Template。要在Django里用SQLAlchemy或Mako幾乎是不可能,即使打了一

些補丁用上了也會讓你覺得非常非常彆扭。

· Django自帶的ORM遠不如SQLAlchemy強大,除了在Django這一畝三分地,SQLAlchemy是Python世界裡事實上的ORM標準,其它框架都支持SQLAlchemy了,唯獨Django仍然堅持自己的那一套。Django的

開發人員對SQLAlchemy的支持也是有 過討論和嘗試的,不過最終還是放棄了,估計是代價太高且跟Django其它的模塊很難合到一塊。

· Template功能比較弱,不能插入Python代碼,要寫複雜一點的邏輯需要另外用Python實現Tag或Filter。Django的模板系統設計十分有意思,也應該其框架內影響最大、爭議最大的部分。

Django模板的設計哲學是徹底的將代碼、樣式分離;http://asp.net提倡將代碼/模板分離,但技術上還是可以混合;而Django則是從根本上杜絕在模板中進行編碼、處理數據的可能。

比方說,http://asp.net模板中可以寫:

&<%

int i;

for(i==0;i&<10;i++){

....

}

%&>

Django是徹底不支持嵌入類似上面的代碼,僅能使用其模板內置的函數;這實際上,是為其模板構造了一種「新語言」;由於此「新語言」十分簡單,所以也能夠將其模板移植到不同平台。

大多數情況下,Django的模板功能是足夠的,但對於特殊(有時「特殊」也不是十分特殊)的情況,還是需要在模板中嵌入代碼,那麼就需要根據其模板系統的規則做模板擴展。有時候,模板中直接寫

一行代碼能夠解決的問題,用模板擴展實現後,會變成十幾行代碼。

是否容忍在模板中編程,正是Django模板爭議最大之處。

Pylons TurboGears repoze.bfg

除了Django另一個大頭就是Pylons了,因為TurboGears2.x是基於Pylons來做的,而repoze.bfg也已經併入Pylons project里這個大的項目里,後面不再單獨討論TurboGears和repoze.bfg了。

Pylons和Django的設計理念完全不同,Pylons本身只有兩千行左右的Python代碼,不過它還附帶有一些幾乎就是Pylons御用 的第三方模塊。Pylons只提供一個架子和可選方案,你可以根據自己的喜好自

由的選擇Template、ORM、form、auth等組件,系統高度可 定製。我們常說Python是一個膠水語言(glue language),那麼我們完全可以說Pylons就是一個用膠水語言設計的膠水框架。

選擇Pylons多是選擇了它的自由,選擇了自由的同時也預示著你選擇了噩夢:

· 學習噩夢,Pylons依賴於許多第三方庫,它們並不是Pylons造,你學Pylons的同時還得學這些庫怎麼使用,關鍵有些時候你都不知道你 要學什麼。Pylons的學習曲線相對比Django要高的多,而之

前Pylons的官方文檔也一直是人批評的對象,好在後來出了The Definitive Guide to Pylons這本書,這一局面有所改觀。因為這個原因,Pylons一度被譽為只適合高手使用的Python框架。

· 調試噩夢,因為牽涉到的模塊多,一旦有錯誤發生就比較難定位問題處在哪裡。可能是你寫的程序的錯、也可能是Pylons出錯了、再或是SQLAlchemy出錯了、搞不好是formencode有bug,反正很凌

亂了。這個只有用的很熟了才能解決這個問題。

· 升級噩夢,安裝Pylons大大小小共要安裝近20個Python模塊,各有各自的版本號,要升級Pylons的版本,哪個模塊出了不兼容的問題都有可能,升級基本上很難很難。至今reddit的Pylons還停留在

古董的0.9.6上,SQLAlchemy也還是0.5.3的版本,應該跟這條有關係。

Pylons和repoze.bfg的融合可能會催生下一個能挑戰Django地位的框架。

Tornado web.py

Tornado( http://www.tornadoweb.org )是Facebook開源出來的框架,其哲學跟Django近乎兩個極端。Tornado即是一個Web server(對此本文不作詳述),同時又是一個類web.py的micro-framework。

Tornado走的是少而精的方向,它也有提供模板功能;雖然不鼓勵,但作者是可以允許在模板進行少量編碼(直接嵌入單行py代碼)的。

如果跟http://asp.net相比,Tornado有點類似僅實現了AsyncHttpHandler;除此之外,全部需要自己去實現。

好吧,其實它有模板,有國際化支持,甚至還有內置的OAuth/OpenID模塊,方便做第三方登錄,它其實也直接實現了Http伺服器。

但它沒有ORM(僅有一個mysql的超簡單封裝),甚至沒有Session支持,更不要說Django那樣自動化的後台。

假設是一個大型網站,在高性能的要求下,框架的各個部分往往都需要定製,可以復用的模塊非常少;一個以Django開發的網站,各部分經過不斷的定製,Django框架剩下的,很有可能也就是tornado一

開始所能提供的這部分。

殊途同歸。

HTTP伺服器

Tornado為了高效實現Comet/後端非同步調用HTTP介面,是直接內嵌了HTTP伺服器。

前端無需加apache / lighttpd / nginx等也可以供瀏覽器訪問;但它並沒有完整實現HTTP 1.1的協議,所以官方文檔是推薦用戶在生產環境下在前端使用nginx,後端反向代理到多個Tornado實例。

Tornado本身是單線程的非同步網路程序,它默認啟動時,會根據CPU數量運行多個實例;充分利用CPU多核的優勢。

單線程非同步

網站基本都會有資料庫操作,而Tornado是單線程的,這意味著如果資料庫查詢返回過慢,整個伺服器響應會被堵塞。

資料庫查詢,實質上也是遠程的網路調用;理想情況下,是將這些操作也封裝成為非同步的;但Tornado對此並沒有提供任何支持。

一個系統,要滿足高流量;是必須解決資料庫查詢速度問題的!

資料庫若存在查詢性能問題,整個系統無論如何優化,資料庫都會是瓶頸,拖慢整個系統!

非同步並**不能**從本質上提到系統的性能;它僅僅是避免多餘的網路響應等待,以及切換線程的CPU耗費。

如果資料庫查詢響應太慢,需要解決的是資料庫的性能問題;而不是調用資料庫的前端Web應用。

對於實時返回的數據查詢,理想情況下需要確保所有數據都在內存中,資料庫硬碟IO應該為0;這樣的查詢才能足夠快;而如果資料庫查詢足夠快,那麼前端web應用也就無將數據查詢封裝為非同步的必要

就算是使用協程,非同步程序對於同步程序始終還是會提高複雜性;需要衡量的是處理這些額外複雜性是否值得。

如果後端有查詢實在是太慢,無法繞過,Tornaod的建議是將這些查詢在後端封裝獨立封裝成為HTTP介面,然後使用Tornado內置的非同步HTTP客戶端進行調用。


bottle 也不錯,短小精悍啊


剛開始接觸python是大四時(14年初),後來照著網上視頻用django跟著做了個網站demo,發現代碼量確實小(一直學的是java web),對python了解的少,看來知識得不斷的學習,不斷的運用,才不會忘了。


推薦uliweb:

文檔: Uliweb-Doc

郵件列表: http://groups.google.com/group/uliweb

QQ討論組: 162487035

有一些針對初學者的教程,QQ群里也有不少初學者在討論,在郵件列表和QQ群中都可以和作者討論問題


推薦閱讀:

Python 2 和 Python 3 有哪些主要區別?
python exec in d 是往d中填充數據?
python作為腳本語言和c/c++ 等語言的優勢和劣勢在哪裡地方?python比較成熟用途在哪裡方面?
什麼樣的 Python 編輯器比較適合新手?

TAG:Python |