目前,有非常多的Python框架,用來幫助你更輕鬆的建立web應用。這些框架把相應的模組組織起來,使得構建應用的時候可以更快捷,也不用去關注一些細節(例如socket和協議),所以需要的都在框架裡了。接下來我們會介紹不同的選項。
Python發源於八十年代後期。開發者是Centrum Wiskunde & Informatica的Guido van Rossum,這是位於荷蘭阿姆斯特丹科學園區的一個數學和電腦科學研究中心。之後Van Rossum一直是Python開發很有影響的人物。事實上,社群成員給了他一個榮譽稱號:終生仁慈獨裁者(BDFL)。
經過初期的不起眼,Python已經成為網際網路最流行的服務端程式語言之一。根據W3Techs的統計,它被用於很多的大流量的站點,超過了ColdFusion, PHP, 和ASP.NET。其中超過98%的站點執行的是Python 2.0,只有1%多一點的站點執行3.0。
框架讓開發更輕鬆
今天,有著大量的Python框架,它們可以讓web應用的開發更輕鬆。這些框架把不同的模組整合在一起,讓你更快的構架程式,而不用關注一些細節(例如socket和協議),框架提供了需要的所有功能。
作為分成兩部分的系列文章的第一部分,我們會介紹一些最流行的Python框架。雖然大部分現代的web框架都執行在服務端,也有一些框架開始嘗試與客戶端程式碼結合,可以在客戶端執行(例如Skulpt和Trinket)。Python框架通常分為全棧框架和非全棧框架。全棧框架設計從使用者體驗到資料庫的所有技術,非全棧框架則並不包含整個開發的全部技術。
此外還有一種微框架,也屬於非全棧框架,但是更輕量級。有的情況下,微框架是比較適合的,有時又適合使用全棧框架。在文章的第二部分我們會對全棧框架和微框架做一個比較。
Django
Django恐怕是最有代表性的Python框架了。它是一個遵循MMVC架構模式的開源框架。它的名字來自Django Reinhardt,一個法國作曲家和吉他演奏家,很多人認為他是歷史上最偉大的吉他演奏家。位於堪薩斯洲的Lawrence城的Lawrence Journal-World報社有兩位程式設計師,Adrian Holovaty和Simon Willison,他們在2003的時候開發出了Django,用於給報紙開發web程式。
Django內建了模板引擎,同時也通過OOTB來支援流行的Jinja2引擎。它還支援基於正則的URL分發,可以通過簡單的URL來完成複雜的對映。
Django的優勢之一是隻需要單獨的安裝包來安裝。其他的一些類似的框架需要下載很多元件才能開始工作。而且,Django還有完善的保持更新的文件,對於開源專案來說這通常是短板。它是一個健壯的框架,很好的整合了很多來自社群的外掛和擴充套件。專案背後的社群看上去也組織的很好,這從它非常完善的文件和教程就可以看出來。
我學習的第一個框架就是django,方便入門,上手也比較快。個人覺得django的model不好用,主要是跨庫聯表不友好。 django官網
建立一個專案:
$ pip install django
$ django-admin startproject djdemo
cd djdemo
$ django-admin startapp djapp
$ tree -L 3
.
├── djapp
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── djdemo
│ ├── __init__.py
│ ├── __pycache__
│ │ ├── __init__.cpython-37.pyc
│ │ └── settings.cpython-37.pyc
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
複製程式碼
下面我給出我一個專案的Django的目錄結構。是django的經典目錄結構形式:
django很簡單,Django生態很完備,基於django開發,一般需要的功能,都可以找到已經有的輪子。開發效率很高。django下的開發就是往框架中的填程式碼。另外就是不夠靈活,太重。
django很多好用的腳手架
[django]
check
compilemessages
createcachetable
dbshell
diffsettings
dumpdata
flush
inspectdb
loaddata
makemessages
makemigrations
migrate
runserver
sendtestemail
shell
showmigrations
sqlflush
sqlmigrate
sqlsequencereset
squashmigrations
startapp
startproject
test
testserver
複製程式碼
TurboGears
TurboGears是在幾個著名的Python專案上構建起來的一個框架,如SQLAlchemy,WebOb,Repoze,Genshi。在某種意義上,TurboGears是將多個已經建立的開放平臺粘合在一起。和Django一樣,它採用MVC架構。它最近還包含一個“最小模式”,使其可以作為一個微框架。
TurboGears是由Kevin Dangoor在2005年開發的。他在當年9月將其作為一個開源專案釋出。2013年,專案開發人員遷移到支援Python 3,拋棄了他們曾經寫的Pylons程式碼。TurboGears的優點包括:
- 支援聚合
- 強大的物件關係對映器
- 事務系統支援多資料庫間事務
- 多資料庫支援
- 以可重用的程式碼片段為模板
- 具有很多的靈活性,可以對接非標準元件
- 支援分片
- 模板系統使設計師的設計更輕鬆
TurboGears
安裝
$ pip install tg.devtools
$ gearbox --help
usage: gearbox [--version] [-v | -q] [--log-file LOG_FILE] [-h] [--debug]
[--relative]
TurboGears2 Gearbox toolset
optional arguments:
--version show program's version number and exit
-v, --verbose Increase verbosity of output. Can be repeated.
-q, --quiet Suppress output except warnings and errors.
--log-file LOG_FILE Specify a file to log output. Disabled by default.
-h, --help Show this help message and exit.
--debug Show tracebacks on errors.
--relative Load plugins and applications also from current path.
Commands:
help print detailed help for another command
makepackage Creates a basic python package
patch Patches files by replacing, appending or deleting text.
quickstart Creates a new TurboGears2 project
scaffold Creates a new file from a scaffold template
serve Serves a web application that uses a PasteDeploy configuration file
setup-app Setup an application, given a config file
tgext Creates a tgext.* package
複製程式碼
建立專案
$ gearbox quickstart tgdemo
// 會生成很多檔案
.
├── MANIFEST.in
├── README.txt
├── __pycache__
│ └── setup.cpython-37.pyc
├── development.ini
├── migration
│ ├── env.py
│ ├── script.py.mako
│ └── versions
│ └── empty.txt
├── setup.cfg
├── setup.py
├── test.ini
├── tgdemo
│ ├── __init__.py
│ ├── config
│ │ ├── __init__.py
│ │ ├── app_cfg.py
│ │ ├── environment.py
│ │ └── middleware.py
│ ├── controllers
│ │ ├── __init__.py
│ │ ├── controller.py.template
│ │ ├── error.py
│ │ ├── root.py
│ │ └── secure.py
│ ├── i18n
│ │ └── ru
│ ├── lib
│ │ ├── __init__.py
│ │ ├── app_globals.py
│ │ ├── base.py
│ │ └── helpers.py
│ ├── model
│ │ ├── __init__.py
│ │ ├── auth.py
│ │ └── model.py.template
│ ├── public
│ │ ├── css
│ │ ├── favicon.ico
│ │ ├── fonts
│ │ ├── img
│ │ └── javascript
│ ├── templates
│ │ ├── __init__.py
│ │ ├── __pycache__
│ │ ├── about.xhtml
│ │ ├── data.xhtml
│ │ ├── environ.xhtml
│ │ ├── error.xhtml
│ │ ├── index.xhtml
│ │ ├── login.xhtml
│ │ ├── master.xhtml
│ │ └── template.xhtml.template
│ ├── tests
│ │ ├── __init__.py
│ │ ├── functional
│ │ └── models
│ └── websetup
│ ├── __init__.py
│ ├── bootstrap.py
│ └── schema.py
└── tgdemo.egg-info
├── PKG-INFO
├── SOURCES.txt
├── dependency_links.txt
├── entry_points.txt
├── not-zip-safe
├── requires.txt
└── top_level.txt
22 directories, 48 files
複製程式碼
上面?是按python包的方式生成的程式碼形式,方便打包分發。
使用者只需要修改下面目錄中的程式碼即可
TurboGears使用示例
from wsgiref.simple_server import make_server
from tg import expose, TGController, AppConfig
class RootController(TGController):
@expose()
def index(self):
return "<h1>Hello World</h1>"
config = AppConfig(minimal=True, root_controller=RootController())
print "Serving on port 8080..."
httpd = make_server('', 8080, config.make_wsgi_app())
httpd.serve_forever()
複製程式碼
web2py
web2py是一個開源框架,允許開發者快速建立動態互動式的網站。它的設計目標是消除拖慢開發的大量重複程式設計任務,比如建立基本的表格。它在最初是作為工具開發的。隨後被Django和Ruby on Rails模仿,Ruby on Rails是個Ruby的框架。同TurboGears一樣,它使用MVC架構。
最開始的原始碼是由Massimo DiPierro在2007年開放的。在那時,它被稱為Enterprise Web Framework(EWF)。由於命名衝突,它改過好幾次名字,最後在1.16版確定為當前的web2py。使用web2py開發的應用包括Movuca內容管理系統,音樂網站NoobMusic,名為LinkFindr的網路診斷工具,以及Instant Press部落格平臺。在2011年,web2py被評為最好的開源開發軟體,榮獲Bossie Award。第二年,又斬獲InfoWorld的年度技術獎。
與Django一樣,web2py也具有廣泛的文件。新開發者和高階開發者可以免費下載它的完整開發手冊。
web2py的一些優點包括:
- 容易使用——作為一個魯棒的全棧式框架,它無需其他依賴就可以工作,容易學習和部署,安裝也無需任何配置檔案,一旦下載完成,安裝完畢,就可以用了。開發者會獲得一個資料庫,一個基於web的IDE,web伺服器以及一個有多個核心物件組成的強大API。
- 安全性出色——Web2py的模板語言減少了黑客使用跨站指令碼的危險,抽象層在建立表單時有表單域有效性檢查,避免SQL隱碼攻擊,也阻止了跨站請求偽造攻擊(csrf攻擊)。會話被儲存在伺服器上,阻止壞的執行者把瀏覽器cookie弄亂,並且每個密碼都是雜湊後儲存的。
web2py的一些缺點包括:
- 在常規基礎上使用管理的介面不太容易
- 管理的介面沒有許可權
- 沒有內建的單元測試支援
- 開發速度迅速,所有的函式都有預設行為,表單時自動生成的,高層次的小部件和應用網格都是內建的
目錄結構
project/
README
LICENSE
VERSION > this web2py version
web2py.py > the startup script
anyserver.py > to run with third party servers
... > other handlers and example files
gluon/ > the core libraries
packages/ > web2py submodules
dal/
contrib/ > third party libraries
tests/ > unittests
applications/ > are the apps
admin/ > web based IDE
...
examples/ > examples, docs, links
...
welcome/ > the scaffolding app (they all copy it)
ABOUT
LICENSE
models/
views/
controllers/
sessions/
errors/
cache/
static/
uploads/
modules/
cron/
tests/
... > your own apps
examples/ > example config files, mv .. and customize
extras/ > other files which are required for building web2py
scripts/ > utility and installation scripts
handlers/
wsgihandler.py > handler to connect to WSGI
... > handlers for Fast-CGI, SCGI, Gevent, etc
site-packages/ > additional optional modules
logs/ > log files will go in there
deposit/ > a place where web2py stores apps temporarily
複製程式碼
Flask
Flask是一個基於Jinja2和Werkzeug的python微框架,和其他框架類似,它是BSD授權的,一個有少量限制的免費軟體許可。使用Flask的網站包括領英LinkedIN和Pinterest。Flask有以下特點:
- 內建的單元測試支援
- 模板使用Jinjia2
- 大量文件
- 客戶端會話使用安全cookies
- 開發伺服器和偵錯程式
- Restful請求
- 與WSGI 1.0相容
- 基於unicode
- 大量的擴充套件
Flask是一個年輕的框架,2010年誕生,Flask的目標是不給程式設計師強加限制,允許你使用自己的資料庫物件關係對映,模板引擎,會話中介軟體以及你的專案所需的其他元件,在我看來這就是這個微框架的用意。
我想說像Flask這樣的框架更適合有經驗的開發者,並不是小規模應用程式所必須的,當然,如果你只想做一個簡單的REST API,那麼Flask當然再好不過了。
flask我個人使用的也是比較多的。flask是微框架,比較靈活,適合小型專案。
示例程式碼
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello, World!'
複製程式碼
flask的生態也很全,社群也是很活躍的,下面?給出需要的資源。文件
Bottle
和flask一樣,Bottle是一個伺服器閘道器介面(WSGI)網路框架。作為一個檔案,它不依賴於Python標準庫外的任何庫。Marcel Hellkamp於2009年寫它的時候,它僅由包含模板、路由和一個WSGI抽象層的最小工具開始。對於程式設計師尋找靈活性和基本功能、構建簡單的應用程式和網站、建立一個Web API來說,這小並且強大的框架是極好的。
它的優點包括:
- 內建的快速模板引擎和對Jinja2,Mako和Cheetah的支援
- 可以訪問上傳,cookies,表單資料,標題,和其他後設資料的大量工具
- 支援fapws3,Google App Engine,CherryPyPaste的內建HTTP開發伺服器
- 支援動態URLs
Bottle的另一個優點是,它的小巧精幹便於嵌入在一個較大應用程式中而不必擔心繫統依賴關係。如果你想用一個簡單的,乾淨的和快速的框架並且它沒有過多冗餘,來建立小的應用程式,Bottle是適合你的。
示例程式碼:
from bottle import route, run, template
@route('/hello/<name>')
def index(name):
return template('<b>Hello {{name}}</b>!', name=name)
run(host='localhost', port=8080)
複製程式碼
多框架
雖然很難相信,但這些只是少數幾十個開發人員可以使用Python框架,。Python.org報導,Django,TurboGears和web2py是最受歡迎的完整選項。為了在框架優化方面提供一個全面的觀察,這裡我們新增了兩個高階形態的微型框架。有著熱情的追隨者其他框架包括 Pyramid, web.py, Bobo, Albatross, 和 CherryPy。
找到正確的適合選擇
正確框架的選擇取決於專案的規模,它的通訊需求,它是否是一個獨立的應用程式,定製需求的級別,開銷,和許多其他因素。同樣重要的是,它取決於哪個框架適合你個人的工作方式。回顧這些專案並下載他們最新的版本。在計劃一個主要旅行之前,試開一下確保你在一個合適的車輛中。