日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

 前言

Python/ target=_blank class=infotextkey>Python的便利性和多功能性意味著它幾乎被用于構建各行各業的軟件。一個主要的利基是web服務,Python的開發速度和靈活性使其可以很容易地快速建立和運行網站。正如您可能猜到的那樣,Python在web框架中為您提供了大量的選擇和自由度,無論大小。畢竟,不是每個web項目都需要是企業級的。大多數應該能足夠完成工作就可以了,而不是追逐更大。本文將8個最知名的Python框架,它們強調簡單性、輕量級交付,接下來就具體點地了解下這些框架。

1. Bottle

Bottle(http://bottlepy.org/)可以被認為是一種迷型Flask,因為它甚至比其他的“微框架”更緊湊和簡潔。由于Bottle占用的空間很小(最小化封裝),所以它非常適合包含在其他項目中,或者用于快速交付像REST APIs這樣的小項目。(后面會討論Flask。)

Python的Web框架介紹

 

Bottle的整個代碼庫都可以放在一個文件中,并且完全沒有外部依賴關系。即便如此,Bottle還是配備了足夠的功能來構建常見的web應用程序,而不需要依賴外界的幫助。

Bottle中的路由系統將url映射到函數,其語法與Flask幾乎完全相同。應用中你也不會被局限于一組硬連接的路徑,而是可以動態地創建它們。請求和響應數據、cookie、查詢變量、POST操作的表單數據、HTTP報頭和文件上傳都可以通過Bottle的對象訪問和操作。

每一項能力的實現都很注意細節。例如,對于文件上傳,如果文件的命名約定與目標文件系統沖突(例如在windows中文件名中的斜杠),則不必重命名文件。Bottle可以幫你做到這一點。

Bottle包含有它自己的簡單html模板引擎。同樣,盡管模板引擎很小,但它具有所有的基本功能。模板中包含的變量默認使用安全HTML渲染;同時你必須指出,哪些變量是安全的,以便按照字面意思重新生成。如果您愿將Bottle的模板引擎換為另一個模板引擎,比如Jinja2,那么Bottle可以讓您輕松地這樣做。我更喜歡與Bottle捆綁的簡單模板系統;它速度快,語法樸實無華,并且允許您在不太困難的情況下混合代碼和模板文本。

Bottle甚至支持多個服務器后端。它自帶了用于快速測試的內置迷你服務器(內置了開發服務器),而且還支持通用的WSGI、各種與WSGI兼容的HTTP服務器,如果需要,也可支持普通的舊式CGI。比如,在Bottle中的“Hello World”程序:

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控制臺,然后將瀏覽器指向

http://localhost:8080/hello/world。就這樣實現了編程中“經典”。

與其他框架相比,Bottle不需要那么多的文檔,但是它的文檔也絕不少。所有的關鍵內容都適用于單頁面(雖然很長的)。除此之外,您還可以找到每個API的完整文檔、在各種基礎設施上部署的示例、對內置模板語言的解釋和大量常用方法。

與Flask一樣,您可以手動或通過插件擴展Bottle的功能。Bottle插件遠沒有Flask插件那么多,但是擁有著一些有用的部分,如與各種數據庫層的集成和基本的用戶身份驗證。對于異步支持,Bottle可用現有的異步運行的服務器適配器,比如aiohttp/uvloop,但是sync/await不是原生支持。

Bottle的極簡設計的一個后果就是有些東西根本就不存在。表單驗證,包括CSRF(cross-site request forgery,跨站點請求偽造)保護特性沒有包括在內。如果您想構建一個支持高度用戶交互的web應用程序,您需要自己添加這種支持。

Bottle的另一個問題是發展已經遲滯很久了,最新版本是0.12,最開始是在2013年發布的,后又小版本更新(最新穩定版是2019年12月發布的0.12.18,開發中的0.13版還沒正式發布)。也就是說,Bottle將繼續被維護,并且它的開發版本仍然可以用于生產。開發人員打算交付新的版本,以擺脫對Python的遺留版本的支持。

關于Bottle下載與安裝

使用pip install bottle安裝最新的穩定版本,或者將bottle.py(不穩定)下載到您的項目目錄中。除了Python標準庫之外,Bottle沒有硬依賴項。Bottle支持Python 2.7和Python 3。

注意,自0.13版本開始不推薦在Python 2.5和2.6下使用Bottle,此版本去掉了對它們的支持。

概要總結一下:Bottle是一個快速和簡單的微型框架,用于小型web應用程序。它提供了url參數支持、模板、內置HTTP服務器和許多用于第三方WSGI/HTTP- Server和模板引擎的適配器服務于請求分派(路由)——所有這些都在一個文件中,除了Python標準庫之外沒有其他依賴關系。

2. CherryPy

CherryPy(http://www.cherrypy.org/)已經以這樣或那樣的形式存在了將近20年,但并沒有失去它從一開始就與眾不同的極簡主義和優雅。

Python的Web框架介紹

 

CherryPy背后的目標,除了只包含服務web頁面所需要的少量內容之外,是盡可能讓人感覺不像“web框架”,而是像任何其他類型的Python應用程序。像Hulu?.NETflix這樣的網站已經在生產中使用了CherryPy,因為這個框架提供了一個非常包容的構建基礎。CherryPy在底層使用線程池,更好地支持多線程服務器適配器。

CherryPy可以讓您的web應用程序遠離核心邏輯。要將應用程序的函數映射到CherryPy提供的url或路由,需要創建一個類,其中對象的名稱空間直接映射到需要提供服務的url。例如,網站的根目錄由一個名為“index”的函數提供。傳遞給這些函數的參數用于相應的處理GET或POST方法提供的變量。

CherryPy包含的比特意味著作為低級構建塊工作。包含了Session標識符和cookie處理,但沒有包含HTML模板。與Bottle一樣,CherryPy提供了一種將路由映射到磁盤目錄的方法,用于靜態文件服務。

CherryPy通常會遵從現有的第三方庫來支持某個特性,而不是本地化(原生)提供它。例如,WebSocket應用程序不是由CherryPy直接支持的,而是通過ws4py庫支持的。

CherryPy的文檔包含一個方便的教程,介紹了該程序的各個方面。與其他一些框架教程不同,它不會帶您了解完整的端到端應用程序,但仍然很有用。文檔中有關于虛擬主機部署、通過Apache和Nginx進行反向代理以及許多其他場景的便簽筆記式說明。

應用示例代碼如下:

import cherrypy
 
class HelloWorld(object):
    @cherrypy.expose
    def index(self):
        return "Hello World!"
 
cherrypy.quickstart(HelloWorld())

3. Falcon

如果您正在構建基于REST的APIs,那么Falcon(

http://falconframework.org/)就是專門為您設計的。精悍、快速,除了標準庫之外幾乎沒有依賴,Falcon提供了REST api所需的一切,僅此而已。2019年發布的Falcon2.0廢除了對Python 2.x支持,并且至少需要Python 3.5。

Python的Web框架介紹

 

Falcon獲得“輕薄”(light & slender)標簽的很大一部分原因與框架中的代碼行數無關。這是因為Falcon幾乎沒有將自己的結構強加給應用程序。Falcon應用程序所要做的就是指出哪些函數映射到哪些API端點。從端點返回的JSON只涉及設置路由以及經由Python標準庫json.dumps函數返回的數據。對異步的支持還沒有在Falcon中實現,但是正在努力在Falcon 3.0中實現。

Falcon還采用了健全的開箱即用的默認設置,所以安裝時不需要什么修改。例如,對于沒有顯式聲明的任何路由,默認情況下都會引發404s。如果希望向客戶機返回錯誤,可以拋出與框架捆綁在一起的大量常規異常(如HTTPBadRequest)中的一個,或者使用通用的falcon.HTTPError異常。如果需要對路由進行預處理或后處理,Falcon也為它們提供了鉤子。

Falcon對APIs的關注意味著這里很少有使用傳統HTML用戶界面構建web應用程序的內容。例如,不要對表單處理函數和CSRF保護工具抱有太多期望。但是,Falcon提供了優雅的選項來擴展其功能,因此可以構建更復雜的項目。除了上述鉤子機制之外,您還可以找到一個用于創建中間件的接口,該接口可用于包裝所有Falcon的APIs。

與其他框架相比,Falcon的文檔比較少,但這只是因為覆蓋的內容比較少。用戶指南包括對所有主要特性的正式的逐步演示,以及快速啟動部分,允許您查看有或沒有注釋的樣例代碼。

示例代碼如下:

class QuoteResource:
 
    def on_get(self, req, resp):
        """Handles GET requests"""
        quote = {
            'quote': (
                "I've always been more interested in "
                "the future than in the past."
            ),
            'author': 'Grace Hopper'
        }
 
        resp.media = quote
 
 
api = falcon.API()
api.add_route('/quote', QuoteResource())

4. FastAPI

FastAPI(

https://fastapi.tiangolo.com/)的名稱很好地總結了它所做的事情。它被構建為快速創建API端點而服務,且運行速度也很快。

Python的Web框架介紹

 

FastAPI利用Starlette項目作為其高速網絡核心,但是要使用FastAPI,您不需要了解Starlette的內部原理。定義端點的方式與Flask或Bottle應用程序非常相似——使用裝飾器(decorator)來指明哪個函數處理哪個路由——然后返回自動轉換成JSON的字典。

您可以很容易地重寫返回內容的方式。例如,如果希望從某些端點返回HTML/XML,只需返回一個自定義響應對象即可。如果您想要添加自定義中間件,您可以彈出任何遵循ASGI標準的內容。

FastAPI使用Python的類型提示來提供路由所接受的數據類型的約束。例如,如果您有一個類型為Optional[int]的路由,FastAPI將拒絕除整數以外的所有提交。你不需要添加數據校驗代碼到你的端點,可以只使用類型提示,然后讓FastAPI來完成這項工作。

當然,有些東西被省略了。例如,沒有原生HTML模板引擎,但并不缺少填補這一空白的第三方解決方案。數據庫連接也是如此,但是文檔中包含了關于如何協同某些ORMs(例如Peewee)使用FastAPI的異步行為而工作的細節。

示例代碼如下:

from typing import Optional
 
from fastapi import FastAPI
 
App = FastAPI()
 
 
@app.get("/")
def read_root():
    return {"Hello": "World"}
 
 
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):
    return {"item_id": item_id, "q": q}

5. Flask框架

許多關于Python web框架的討論都從Flask(http://flask.pocoo.org/)開始,這是有原因的。Flask構建良好,易于理解的框架,很容易使用并且很穩定。在輕量級web項目或基本REST API中使用Flask幾乎是不可能出錯的,但是如果您試圖構建任何更大的東西,你將會面臨很大的負擔。

Python的Web框架介紹

 

Flask的主要吸引力在于它的低門檻。一個基本的“hello world”應用程序可以用不到10行Python代碼完成。Flask包含了一個廣泛使用的HTML模板系統Jinja2,它可以使文本的渲染更加容易,但是Jinja2可以被替換為任意數量的其他模板引擎(比如Mustache:

https://github.com/defunkt/pystache
),或者您也可以使用自己的模板引擎。

Flask版Hello World 應用:

from flask import Flask
app = Flask(__name__)
 
@app.route('/')
def hello_world():
    return 'Hello, World!'

把這個保存為hello.py或其它不是flask.py的文件,然后就可以按照一定的模式來運行程序了:

$ export FLASK_APP=hello.py
$ flask run
 * Running on http://127.0.0.1:5000/

或者在windows下

命令行窗口:C:pathtoapp>set FLASK_APP=hello.py
Powershell:PS C:pathtoapp> $env:FLASK_APP = "hello.py"

或者可以使用 python -m flask:

$ export FLASK_APP=hello.py
$ python -m flask run
 * Running on http://127.0.0.1:5000/

(詳情可以參考官網進一步了解)

出于簡單性的考慮,Flask省略了一些細節,比如數據層或者ORM,并且沒有提供類似表單驗證的功能。然而,Flask可通過擴展支持機制進行擴展,已有的擴展有幾十個,覆蓋了許多常見的用例場景,比如緩存,表單處理和驗證,以及數據庫連接。這種缺省設計允許你以絕對最小的功能開始設計一個Flask應用程序,然后在你需要的時候將它們分層。

Flask的文件是親切和容易閱讀??焖匍_始文檔很好地幫助您入門,同時還解釋了簡單的Flask應用程序的默認選擇的重要性,并且API文檔中有很多很好的例子。同樣優秀的還有Flash示例片段的集合,是一些如何完成特定任務的快速而粗糙的示例,例如,如果對象存在如何返回,或者如果對象不存在,如何返回404錯誤。

在2018年,Flask發布了具有里程碑意義的1.0版本,其中Python 2.6和Python 3.3是最小的支持版本,并且它的許多行為最終都是固定不變的。Flask不顯式地支持Python的異步語法,但是一個API兼容的Flask變體Quart已經被分離出來以滿足這個需求。

6. Pyramid框架

小巧輕便的Pyramid(https://trypyramid.com/)非常適合于一些這樣的任務,比如將現有的Python代碼作為REST API公開,或者為開發人員承擔大部分繁重工作的web項目提供核心支持。

Python的Web框架介紹

 

“Pyramid會讓你迅速變得富有成效,并與你一起成長,”文檔簡述中說。“當你的應用程序很小的時候,它不會阻礙你;當你的應用程序變大的時候,它也不會妨礙你。”

描述Pyramid的極簡主義的一個好方法是“不受策略約束”,在文檔中討論Pyramid如何與其他web框架相比較的部分使用了這個術語?;旧?,“無策略”意味著您選擇使用哪種數據庫或哪種模板語言不是Pyramid所關心的。

建立一個基本的Pyramid應用程序需要非常少的工作。與Bottle和Flask一樣,除了框架本身的文件外,Pyramid應用程序可以由單個Python文件組成。一個簡單的單路由API只需要十來行代碼。大部分都是樣板文件,比如…import語句和設置WSGI服務器。

默認情況下,Pyramid包括一些在web應用程序中常見的事項,但它們是作為組件提供的,并將其拼接在一起,而不是作為成熟的解決方案。例如,對用戶會話的支持甚至附帶了CSRF保護。但對用戶帳戶的支持,如登錄或帳戶管理,不在處理的一部分。你必須自己處理它或通過插件來添加支持它。表單處理和數據庫連接也是如此。

Pyramid甚至提供了一種從以前的Pyramid項目創建模板的方法來重用以前的工作。這些被稱為“腳手架”的模板生成了一個金字塔應用程序,具有簡單的路由和一些初始HTML/css模板。捆綁的腳手架包括一個示例啟動程序項目和一個通過流行的Python庫SQLAlchemy

http://www.sqlalchemy.org/)連接到數據庫的項目。

Pyramid體貼入微的測試和調試工具提供了優秀的功能。在Pyramid應用程序中捆綁debugtoolbar擴展組件,你可在每個網頁上得到一個可點擊的圖標,它會生成應用程序執行的詳細信息,包括發生錯誤時的詳細回溯。還提供了日志記錄和單元測試。

Pyramid的文件是優秀的。除了對基礎知識的快速瀏覽和教程風格的演練外,還可以找到一組社區貢獻的教程和一本常見食譜式的“烹飪指南”書。后者包括了針對一系列目標環境的部署技術,從谷歌App Engine到Nginx。

Pyramid同時支持python2和python3,但是不使用python3的異步語法。如果想在Pyramid中利用異步,請參閱aiopyramid項目,它包括一個用于異步驅動的“hello world”應用程序的腳手架。

應用示例代碼如下:

from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response
 
def hello_world(request):
    return Response('Hello World!')
 
if __name__ == '__main__':
    with Configurator() as config:
        config.add_route('hello', '/')
        config.add_view(hello_world, route_name='hello')
        app = config.make_wsgi_app()
    server = make_server('0.0.0.0', 6543, app)
    server.serve_forever()

7. Sanic框架

Sanic為快速和簡單而設計,與Python 3.6或更高版本一起工作,并使用Python的async/await語法(從Python 3.5開始可用)來讓您創建高效的web應用程序。

Python的Web框架介紹

 

與Flask或Bottle一樣,一個基礎的Sanic程序“hello world”大約需要運行10行代碼,其中大部分是導入和其他樣板文件。關鍵的區別是,應用程序路由必須聲明為異步定義函數(async def functions),并且必須在異步代碼中使用await來調用這些函數。如果您以前編寫過異步驅動的應用程序,那么你應已經掌握了最困難的部分。

Sanic用于處理連接和響應的許多機制大家都很熟悉。請求和響應只是具有相似屬性的對象,比如上傳的文件、表單、JSON對象、頭等等。

具有許多路由的應用程序變得難以管理。Sanic用“藍圖(blueprints)”來解決這個問題,這些對象可以描述一組路由,并允許你通過高級界面來管理它們。不用顯式地編寫每個路由,也不用使用過多的帶變量的路由,你可以編寫一些藍圖來描述路由在你的應用程序中是如何工作的(例如,/object/object_id/action)。藍圖可以有通用的中間件,如果您想將管理功能應用到某些路由而不是其他路由,那么這是非常有用的。

Sanic還可以處理HTTP以外的協議。WebSocket端點只需要不同的裝飾器和更多的內部邏輯(例如,等待和處理響應)。可以通過子類化asyncio.protocol來支持自定義網絡協議。

Sanic故意省略了數據庫連接和HTML模板等功能,而保留了用于插入這些功能的特性:中間件、集中式應用配置,等等。

示例代碼如下:

from sanic import Sanic
from sanic.response import json
 
app = Sanic("App Name")
 
@app.route("/")
async def test(request):
    return json({"hello": "world"})
 
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000)

8. Tornado框架

Tornado

http://www.tornadoweb.org/)是另一個針對特定用例的微型框架:異步網絡應用程序。Tornado非常適合創建那些打開大量網絡連接并使其保持活力的服務——即任何涉及WebSockets或長輪詢的服務。Tornado 6.0需要Python 3.5或更高版本,完全不支持Python 2。

Python的Web框架介紹

 

像Bottle 或 Falcon一樣,Tornado忽略了與它的中心目的無關的特征。Tornado有一個用于生成HTML和其他輸出的內置模板系統,并提供了用于國際化、表單處理、cookie設置、用戶身份驗證和CSRF保護的機制。但是它忽略了一些主要用于面向用戶的web應用程序的特性,比如表單驗證和ORM。

Tornado擅長為需要對異步網絡進行嚴密控制的應用程序提供基礎設施。例如,Tornado不僅提供一個內置的異步HTTP服務器,而且還提供一個異步HTTP客戶機。因此,Tornado非常適合構建并行查詢其他站點并對返回的數據進行操作的應用程序,例如網絡爬蟲或網絡機器人(web scraper或bot)。

如果您想創建一個使用HTTP以外的協議的應用程序,Tornado已經為您提供了幫助。Tornado提供對諸如DNS解析器等實用程序的低級TCP連接和套接字的訪問,以及對第三方認證服務的訪問,它還通過WSGI標準支持與其他框架的互操作。文檔雖小但并不稀疏寬泛,其中包含了實現所有這些特性的豐富示例。

Tornado利用并補充了Python用于異步行為的本機功能。如果您使用的是Python 3.5, Tornado支持內置的async和await關鍵字,這可以提高應用程序的速度。您還可以使用futures或回調來處理對事件的響應。

Tornado提供了一個同步原語庫(信號量、鎖等)來協調異步協程之間的事件。請注意,Tornado通常運行為單線程模式,因此這些原語與它們的線程名稱不同。但是,如果您希望在并行進程中運行Tornado以利用多個套接字和內核,那么可以使用一些工具來實現這一點。

Tornado的文檔涵蓋了框架中的每個主要概念以及模型中的所有主要api。盡管它包含一個示例應用程序(一個web爬蟲),但它主要用于演示Tornado的排隊模塊。

應用示例代碼如下:

import tornado.ioloop
import tornado.web
 
class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")
 
def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])
 
if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

另外,相比前面小而美的框架較而言,Django

https://www.djangoproject.com/)
是個完整的技術棧了,基本有各種支持,悠久而龐大,這里沒有提出來更多介紹。概而言之,Django是一個高級Python Web框架,它鼓勵快速開發和干凈、實用的設計。它由經驗豐富的開發人員構建,解決了Web開發中的許多麻煩,因此您可以專注于編寫應用程序,而無需重新發明輪子。它是免費和開源的,學習曲線相對來說較高,有興趣的可以去官網詳細研究一下。

分享到:
標簽:框架 Web
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定