導航:首頁 > 編程語言 > python實現模板引擎

python實現模板引擎

發布時間:2023-01-27 07:44:02

python學習的框架是哪些

從GitHub中整理出的15個最受歡迎的Python開源框架。這些框架包括事件I/O,OLAP,Web開發,高性能網路通信,測試,爬蟲等。
Django: Python Web應用開發框架
Django 應該是最出名的Python框架,GAE甚至Erlang都有框架受它影響。Django是走大而全的方向,它最出名的是其全自動化的管理後台:只需要使用起ORM,做簡單的對象定義,它就能自動生成資料庫結構、以及全功能的管理後台。
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,你可以寫出在不同進程或線程中運行一個或多個活動的非同步伺服器。
Web2py:全棧式Web框架
Web2py是一個為Python語言提供的全功能Web應用框架,旨在敏捷快速的開發Web應用,具有快速、安全以及可移植的資料庫驅動的應用,兼容Google App Engine。
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 可以通過編程命令行方式調用。
Bottle: 微型Python Web框架
Bottle是一個簡單高效的遵循WSGI的微型python Web框架。說微型,是因為它只有一個文件,除Python標准庫外,它不依賴於任何第三方模塊。
Tornado:非同步非阻塞IO的Python Web框架
Tornado的全稱是Torado Web Server,從名字上看就可知道它可以用作Web伺服器,但同時它也是一個Python Web的開發框架。最初是在FriendFeed公司的網站上使用,FaceBook收購了之後便開源了出來。
webpy: 輕量級的Python Web框架
webpy的設計理念力求精簡(Keep it simple and powerful),源碼很簡短,只提供一個框架所必須的東西,不依賴大量的第三方模塊,它沒有URL路由、沒有模板也沒有資料庫的訪問。
Scrapy:Python的爬蟲框架
Scrapy是一個使用Python編寫的,輕量級的,簡單輕巧,並且使用起來非常的方便

② python模塊中使用了hadoop框架

1、什麼是python?

2、python的10大Web框架有哪些,以及它們各自的特點?
3、本文只是這10大框架做了簡單介紹,讓你對它們有個初步的了解。

Python 是一門動態、面向對象語言。其最初就是作為一門面向對象語言設計的,並且在後期又加入了一些更高級的特性。除了語言本身的設計目的之外,Python標准 庫也是值得大家稱贊的,Python甚至還自帶伺服器。其它方面,Python擁有足夠多的免費數據函數庫、免費的Web網頁模板系統、還有與Web服務 器進行交互的庫、這些都可以設計到你的Web應用程序裡面。在這篇文章里,我們將為Python Web開發者介紹基於Python的10大Web應用框架。
1、CubicWeb

1.jpg (101.51 KB, 下載次數: 2)

2015-7-16 11:04 上傳

CubicWeb的最重要的支柱就是代碼的可重用性。CubicWeb宣揚自己不僅是一個Web開發框架,而且還是一款語義Web開發框架。CubicWeb使用關系查詢語言(RQL Relation Query Language)與資料庫之間進行通信。

2、Zope2

2.jpg (53.86 KB, 下載次數: 1)

2015-7-16 11:04 上傳

Zope 2是一款基於Python的Web應用框架,是所有Python Web應用程序、工具的鼻祖,是Python家族一個強有力的分支。Zope 2的「對象發布」系統非常適合面向對象開發方法,並且可以減輕開發者的學習曲線,還可以幫助你發現應用程序里一些不好的功能。

3、Web2py

3.jpg (99.94 KB, 下載次數: 1)

2015-7-16 11:04 上傳

Web2py是一個用Python語言編寫的免費的開源Web框架,旨在敏捷快速的開發Web應用,具有快速、可擴展、安全以及可移植的資料庫驅動的應用,遵循LGPLv3開源協議。

Web2py提供一站式的解決方案,整個開發過程都可以在瀏覽器上進行,提供了Web版的在線開發,HTML模版編寫,靜態文件的上傳,資料庫的編寫的功能。其它的還有日誌功能,以及一個自動化的admin介面。

4、TurboGears

4.jpg (95.37 KB, 下載次數: 1)

2015-7-16 11:04 上傳

它是另外一個基於 Python 的 MVC 風格的 Web 應用程序框架。

TurboGears 開發人員稱這個項目是一個 「大框架(megaframework)」,這是因為它是由現有的子項目構成的。TurboGears 可以幫助將很多主要組件集成在一起:MochiKit:javaScript 庫

Kid:模板語言

CherryPy:基本 Web 框架

SQLObject:對象關系映射器(ORM)

5、Pylons

5.jpg (131.51 KB, 下載次數: 1)

2015-7-16 11:04 上傳

Pylons是一個開放源代碼的Web應用框架,使用python語言編寫。它對WSGI標准進行了擴展應用,提升了重用性且將功能分割到獨立的模塊中。

Pylons是最新的Web應用框架中的典型,類似於Django和TurboGears。Pylons受Ruby on Rails影響很深:它的兩個組件,Routes和WebHelpers是Rails特性的Python實現。

6、Grok

6.jpg (79.28 KB, 下載次數: 0)

2015-7-16 11:04 上傳

Grok 是一個為 Python 開發者提供的Web應用開發框架,Grok 的重點是敏捷開發,是一個易用而且功能強大的開發框架,基於 Zope 3 技術。

7、Web.py

7.jpg (69.53 KB, 下載次數: 2)

2015-7-16 11:10 上傳

Web.py是一個輕量級的開源Python Web框架,小巧靈活、簡單並且非常強大,在使用時沒有任何限制。目前Web.py被廣泛運用在許多大型網站,如西班牙的社交網站Frinki、主頁日平均訪問量達7000萬次的Yandex等。

8、Pyramid

8.jpg (98 KB, 下載次數: 2)

2015-7-16 11:10 上傳

Pyramid也是一款輕量級的開源Python Web框架,是Pylons項目的一部分。Pyramid只能運行在Python 2.x或2.4以後的版本上。在使用後端資料庫時無需聲明,在開發時也不會強制使用一些特定的模板系統。

9、CherryPy

9.jpg (83.16 KB, 下載次數: 2)

2015-7-16 11:11 上傳

CherryPy是一個基於Python的Web使用程序開發框架,它極大地簡化了運用 Python 的web開發人員的工作。它為Python開發人員提供了友好的HTTP協議介面。大家知道,HTTP可是萬維網的支柱協議,而CherryPy將HTTP協議簡化成Python API來供Python 開發人員使用,這極大地簡化了Web開發人員對HTTP協議的操作。CherryPy自身內置了一個HTTP伺服器,或者稱為Web伺服器。這樣,對於CherryPy的用戶來說,不用另外搭設Web伺服器就能直接運行 CherryPy應用程序了。實際上,Web伺服器是到達CherryPy應用程序的關口,是所有的HTTP請求和響應的必經之地。因此,可以這樣理解 CherryPy內建的Web伺服器:它是位於處理客戶端與伺服器端之間的一層軟體,用於把底層TCP套按字傳輸的信息轉換成Http請求,並傳遞給相應 的處理程序;同時,還把上層軟體傳來的信息打包成Http響應,並向下傳遞給底層的TCP套按字。

10、Flask

10.jpg (52.97 KB, 下載次數: 2)

2015-7-16 11:10 上傳

Flask是一個輕量級的Web應用框架, 使用Python編寫。基於 WerkzeugWSGI工具箱和 Jinja2模板引擎。使用 BSD 授權。

Flask也被稱為 「microframework」 ,因為它使用簡單的核心,用 extension 增加其他功能。Flask沒有默認使用的資料庫、窗體驗證工具。然而,Flask保留了擴增的彈性,可以用Flask-extension加入這些功 能:ORM、窗體驗證工具、文件上傳、各種開放式身份驗證技術

③ python常用到哪些庫

Python作為一個設計優秀的程序語言,現在已廣泛應用於各種領域,依靠其強大的第三方類庫,Python在各個領域都能發揮巨大的作用。
下面我們就來看一下python中常用到的庫:
數值計算庫:
1. NumPy
支持多維數組與矩陣運算,也針對數組運算提供大量的數學函數庫。通常與SciPy和Matplotlib一起使用,支持比Python更多種類的數值類型,其中定義的最重要的對象是稱為ndarray的n維數組類型,用於描述相同類型的元素集合,可以使用基於0的索引訪問集合中元素。
2. SciPy
在NumPy庫的基礎上增加了眾多的數學、科學及工程計算中常用的庫函數,如線性代數、常微分方程數值求解、信號處理、圖像處理、稀疏矩陣等,可進行插值處理、信號濾波,以及使用C語言加速計算。
3. Pandas
基於NumPy的一種工具,為解決數據分析任務而生。納入大量庫和一些標準的數據模型,提供高效地操作大型數據集所需的工具及大量的能快速便捷處理數據的函數和方法,為時間序列分析提供很好的支持,提供多種數據結構,如Series、Time-Series、DataFrame和Panel。
數據可視化庫:
4. Matplotlib
第一個Python可視化庫,有許多別的程序庫都是建立在其基礎上或者直接調用該庫,可以很方便地得到數據的大致信息,功能非常強大,但也非常復雜。
5. Seaborn
利用了Matplotlib,用簡潔的代碼來製作好看的圖表。與Matplotlib最大的區別為默認繪圖風格和色彩搭配都具有現代美感。
6. ggplot
基於R的一個作圖庫ggplot2,同時利用了源於《圖像語法》(The Grammar of Graphics)中的概念,允許疊加不同的圖層來完成一幅圖,並不適用於製作非常個性化的圖像,為操作的簡潔度而犧牲了圖像的復雜度。
7. Bokeh
跟ggplot一樣,Bokeh也基於《圖形語法》的概念。與ggplot不同之處為它完全基於Python而不是從R處引用。長處在於能用於製作可交互、可直接用於網路的圖表。圖表可以輸出為JSON對象、HTML文檔或者可交互的網路應用。
8. Plotly
可以通過Python notebook使用,與Bokeh一樣致力於交互圖表的製作,但提供在別的庫中幾乎沒有的幾種圖表類型,如等值線圖、樹形圖和三維圖表。
9. pygal
與Bokeh和Plotly一樣,提供可直接嵌入網路瀏覽器的可交互圖像。與其他兩者的主要區別在於可將圖表輸出為SVG格式,所有的圖表都被封裝成方法,且默認的風格也很漂亮,用幾行代碼就可以很容易地製作出漂亮的圖表。
10. geoplotlib
用於製作地圖和地理相關數據的工具箱。可用來製作多種地圖,比如等值區域圖、熱度圖、點密度圖。必須安裝Pyglet(一個面向對象編程介面)方可使用。
11. missingno
用圖像的方式快速評估數據缺失的情況,可根據數據的完整度對數據進行排序或過濾,或者根據熱度圖或樹狀圖對數據進行修正。
web開發庫:
12. Django
一個高級的Python Web框架,支持快速開發,提供從模板引擎到ORM所需的一切東西,使用該庫構建App時,必須遵循Django的方式。
13. Socket
一個套接字通訊底層庫,用於在伺服器和客戶端間建立TCP或UDP連接,通過連接發送請求與響應。
14. Flask
一個基於Werkzeug、Jinja 2的Python輕量級框架(microframework),默認配備Jinja模板引擎,也包含其他模板引擎或ORM供選擇,適合用來編寫API服務(RESTful rervices)。
15. Twisted
一個使用Python實現的基於事件驅動的網路引擎框架,建立在deferred object之上,一個通過非同步架構實現的高性能的引擎,不適用於編寫常規的Web Apps,更適用於底層網路。
資料庫管理:

16. MySQL-python
又稱MySQLdb,是Python連接MySQL最流行的一個驅動,很多框架也基於此庫進行開發。只支持Python 2.x,且安裝時有許多前置條件。由於該庫基於C語言開發,在Windows平台上的安裝非常不友好,經常出現失敗的情況,現在基本不推薦使用,取代品為衍生版本。
17. mysqlclient
完全兼容MySQLdb,同時支持Python 3.x,是Django ORM的依賴工具,可使用原生SQL來操作資料庫,安裝方式與MySQLdb一致。
18. PyMySQL
純Python實現的驅動,速度比MySQLdb慢,最大的特點為安裝方式簡潔,同時也兼容MySQL-python。
19. SQLAlchemy
一種既支持原生SQL,又支持ORM的工具。ORM是Python對象與資料庫關系表的一種映射關系,可有效提高寫代碼的速度,同時兼容多種資料庫系統,如SQLite、MySQL、PostgreSQL,代價為性能上的一些損失。
自動化運維:
20. jumpsever跳板機
一種由Python編寫的開源跳板機(堡壘機)系統,實現了跳板機的基本功能,包含認證、授權和審計,集成了Ansible、批量命令等。
支持WebTerminal Bootstrap編寫,界面美觀,自動收集硬體信息,支持錄像回放、命令搜索、實時監控、批量上傳下載等功能,基於SSH協議進行管理,客戶端無須安裝agent。主要用於解決可視化安全管理,因完全開源,容易再次開發。
21. Mage分布式監控系統
一種用Python開發的自動化監控系統,可監控常用系統服務、應用、網路設備,可在一台主機上監控多個不同服務,不同服務的監控間隔可以不同,同一個服務在不同主機上的監控間隔、報警閾值可以不同,並提供數據可視化界面。
22. Mage的CMDB
一種用Python開發的硬體管理系統,包含採集硬體數據、API、頁面管理3部分功能,主要用於自動化管理筆記本、路由器等常見設備的日常使用。由伺服器的客戶端採集硬體數據,將硬體信息發送至API,API負責將獲取的數據保存至資料庫中,後台管理程序負責對伺服器信息進行配置和展示。
23. 任務調度系統
一種由Python開發的任務調度系統,主要用於自動化地將一個服務進程分布到其他多個機器的多個進程中,一個服務進程可作為調度者依靠網路通信完成這一工作。
24. Python運維流程系統
一種使用Python語言編寫的調度和監控工作流的平台,內部用於創建、監控和調整數據管道。允許工作流開發人員輕松創建、維護和周期性地調度運行工作流,包括了如數據存儲、增長分析、Email發送、A/B測試等諸多跨多部門的用例。
GUI編程:
25. Tkinter
一個Python的標准GUI庫,可以快速地創建GUI應用程序,可以在大多數的UNIX平台下使用,同樣可以應用在Windows和Macintosh系統中,Tkinter 8.0的後續版本可以實現本地窗口風格,並良好地運行在絕大多數平台中。
26. wxPython
一款開源軟體跨平台GUI庫wxWidgets的Python封裝和Python模塊,是Python語言的一套優秀的GUI圖形庫,允許程序員很方便地創建完整的、功能健全的GUI用戶界面。
27. PyQt
一個創建GUI應用程序的工具庫,是Python編程語言和Qt的成功融合,可以運行在所有主要操作系統上,包括UNIX、Windows和Mac。PyQt採用雙許可證,開發人員可以選擇GPL和商業許可,從PyQt的版本4開始,GPL許可證可用於所有支持的平台。
28. PySide
一個跨平台的應用程式框架Qt的Python綁定版本,提供與PyQt類似的功能,並相容API,但與PyQt不同處為其使用LGPL授權。
更多Python知識請關注Python自學網。

④ python補充代碼輸出數字11

print(eval(「1」 + 「1」)如何使用python實現一個簡單的模板引擎, 支持傳入變數, 使用if判斷和for循環語句, 最終能達到這樣的效果:

⑤ 花了2萬多買的Python70個項目,現在分享給大家,練手進廠靠它了

前言:

不管學習哪門語言都希望能做出實際的東西來,這個實際的東西當然就是項目啦,不用多說大家都知道學編程語言一定要做項目才行。

這里整理了70個Python實戰項目列表,都有完整且詳細的教程,你可以從中選擇自己想做的項目進行參考學習練手,你也可以從中尋找靈感去做自己的項目。

1、【Python 圖片轉字元畫】

2、【200行Python代碼實現2048】

3、【Python3 實現火車票查詢工具】

4、【高德API+Python解決租房問題 】

5、【Python3 色情圖片識別】

6、【Python 破解驗證碼】

7、【Python實現簡單的Web伺服器】

8、【pygame開發打飛機 游戲 】

9、【Django 搭建簡易博客】

10、【Python基於共現提取《釜山行》人物關系】

11、【基於scrapy爬蟲的天氣數據採集(python)】

12、【Flask 開發輕博客】

13、【Python3 圖片隱寫術】

14、【Python 實現簡易 Shell】

15、【使用 Python 解數學方程】

16、【PyQt 實現簡易瀏覽器】

17、【神經網路實現手寫字元識別系統 】

18、【Python 實現簡單畫板】

19、【Python實現3D建模工具】

20、【NBA常規賽結果預測——利用Python進行比賽數據分析】

21、【神經網路實現人臉識別任務】

22、【Python文本解析器】

23、【Python3 & OpenCV 視頻轉字元動畫】

24、【Python3 實現淘女郎照片爬蟲 】

25、【Python3實現簡單的FTP認證伺服器】

26、【基於 Flask 與 MySQL 實現番劇推薦系統】

27、【Python 實現埠掃描器】

28、【使用 Python 3 編寫系列實用腳本】

29、【Python 實現康威生命 游戲 】

30、【川普撞臉希拉里(基於 OpenCV 的面部特徵交換) 】

31、【Python 3 實現 Markdown 解析器】

32、【Python 氣象數據分析 -- 《Python 數據分析實戰》】

33、【Python實現鍵值資料庫】

34、【k-近鄰演算法實現手寫數字識別系統】

35、【ebay在線拍賣數據分析】

36、【Python 實現英文新聞摘要自動提取 】

37、【Python實現簡易區域網視頻聊天工具】

38、【基於 Flask 及爬蟲實現微信 娛樂 機器人】

39、【Python實現Python解釋器】

40、【Python3基於Scapy實現DDos】

41、【Python 實現密碼強度檢測器】

42、【使用 Python 實現深度神經網路】

43、【Python實現從excel讀取數據並繪製成精美圖像】

44、【人機對戰初體驗:Python基於Pygame實現四子棋 游戲 】

45、【Python3 實現可控制肉雞的反向Shell】

46、【Python打造漏洞掃描器 】

47、【Python應用馬爾可夫鏈演算法實現隨機文本生成】

48、【數獨 游戲 的Python實現與破解】

49、【使用Python定製詞雲】

50、【Python開發簡單計算器】

51、【Python 實現 FTP 弱口令掃描器】

52、【Python實現Huffman編碼解壓縮文件】

53、【Python實現Zip文件的暴力破解 】

54、【Python3 智能裁切圖片】

55、【Python實現網站模擬登陸】

56、【給Python3爬蟲做一個界面.妹子圖網實戰】

57、【Python 3 實現圖片轉彩色字元】

58、【自聯想器的 Python 實現】

59、【Python 實現簡單濾鏡】

60、【Flask 實現簡單聊天室】

61、【基於PyQt5 實現地圖中定位相片拍攝位置】

62、【Python實現模板引擎】

63、【Python實現遺傳演算法求解n-queens問題】

64、【Python3 實現命令行動態進度條】

65、【Python 獲取掛號信息並郵件通知】

66、【Python實現java web項目遠端自動化更新部署】

67、【使用 Python3 編寫 Github 自動周報生成器】

68、【使用 Python 生成分形圖片】

69、【Python 實現 Redis 非同步客戶端】

70、【Python 實現中文錯別字高亮系統】

最後:

以上項目列表希望可以給你在Python學習中帶來幫助~

獲取方式:轉發 私信「1」

⑥ python可以開發網頁嗎

python可以開發網頁嗎?
python是可以開發網頁的,比如Django和Flask等基於Python的Web框架最近在Web開發中非常流行。這些Web框架可以幫助你用Python編寫伺服器端代碼(後端代碼)。這是在你的額伺服器上運行的代碼,而不是運行在用戶設備和瀏覽器的代碼(前端代碼)。
Django是由Python寫成一個開放源代碼的Web應用框架。採用了MTV的框架模式,即模型M,視圖V和模版T。它最初是被開發來用於管理勞倫斯出版集團旗下的一些以新聞內容為主的網站的,即是CMS(內容管理系統)軟體。
Flask是一個使用 Python 編寫的輕量級 Web 應用框架。其 WSGI 工具箱採用 Werkzeug ,模板引擎則使用 Jinja2 。Flask使用 BSD 授權。
Flask也被稱為 「microframework」 ,因為它使用簡單的核心,用 extension 增加其他功能。Flask沒有默認使用的資料庫、窗體驗證工具。
Python主要有以下三大主要應用:
● Web開發
● 數據科學:包括機器學習、數據分析和數據可視化
● 腳本
相關推薦:《Python教程》以上就是小編分享的關於python可以開發網頁嗎的詳細內容希望對大家有所幫助,更多有關python教程請關注環球青藤其它相關文章!

⑦ 怎麼用python架設一個網站

你可以使用python的django來架設網站,步驟如下:
Django的安裝運行環境:Windows vista, python2.7
python安裝路徑:C:\Python27
從 https://www.djangoproject.com/ 下載django安裝包。
解壓後,進入django目錄,運行 python setup.py install,啟動安裝。
Django被安裝在 C:\Python27\Lib\site-packages
第一個工程的創建
生成工程框架:
c:\test\mysite>python C:\Python27\Lib\site-packages\django\bin\django-admin.py startproject mysite1

運行開發伺服器:
python manage.py runserver
在瀏覽器中,訪問 http://127.0.0.1:8000/,看到 「Welcome to Django」 的提示。

如果解決了您的問題請採納!
如果未解決請繼續追問!

⑧ 【Python基礎】flask是什麼意思

Flask 是一個微框架(Micro framework),其官方文檔的前言部分對Flask做了很清楚的定性介紹:
「微」(Micro)是什麼意思?
「微」(micro) 並不意味著你要把整個web應用放到一個python文件里(雖然確實可以),也不意味著Flask 在功能上有所欠缺。微框架中的「微」意味著 Flask 旨在保持核心功能的簡單而易於擴展。Flask 不會替你做出太多決策,比如使用何種資料庫。而那些 Flask 幫你做好的決策(比如使用哪種模板引擎),都是很容易替換。除此之外的一切都由可由你掌握。
默認情況下,Flask 不包含資料庫抽象層、表單驗證,或是任何已在其它已庫中處理的很好的功能。相反,Flask 支持通過擴展來給應用添加這些功能,如同是 Flask 本身實現的一樣。眾多的擴展提供了資料庫集成、表單驗證、上傳處理及各種各樣的開放認證技術等功能。Flask 也許是「微小」的,但它已准備好在復雜的生產環境中投入使用。
Flask盡量避免重復製造輪子,而是與已有的優秀輪子去結合,這使得Flask靈活、強大,且定製性更強。 Flask 配置選項眾多,均設置了合理的默認值,並會遵循一些慣例;配置選項均可以修改,但通常沒必要修改,尤其是剛開始的時候。這使得Flask易於上手。

⑨ 純 Python 寫一個 Web 框架,就是這么簡單

造輪子是最好的一種學習方式,本文嘗試從0開始造個Python Web框架的輪子,我稱它為 ToyWebF 。

本文操作環境為:MacOS,文中涉及的命令,請根據自己的系統進行替換。

ToyWebF的簡單特性:

下面我們來實現這些特性。

首先,我們需要安裝gunicorn,回憶一下Flask框架,該框架有內置的Web伺服器,但不穩定,所以上線時通常會替換成uWSGI或gunicorn,這里不搞這個內置Web服務,直接使用gunicorn。

我們創建新的目錄與Python虛擬環境,在該虛擬環境中安裝gunicorn

在啥都沒有的情況下,構建最簡單的Web服務,在ToyWebF目錄下,創建app.py與api.py文件,寫入下面代碼。

運行 gunicorn app:app 訪問 http://127.0.0.1:8000 ,可以看見 Hello, World! ,但現在請求體中的參數在environ變數中,難以解析,我們返回的response也是bytes形式。

我們可以使用webob庫,將environ中的數據轉為Request對象,將需要返回的數據轉為Response對象,處理起來更加直觀方便,直接通過pip安裝一下。

然後修改一下API類的 __call__方法 ,代碼如下。

上述代碼中,通過webob庫的Request類將environ對象(請求的環境信息)轉為容易處理的request,隨後調用handle_request方法對request進行處理,處理的結果,通過response對象返回。

handle_request方法在ToyWebF中非常重要,它會匹配出某個路由對應的處理方法,然後調用該方法處理請求並將處理的結果返回,在解析handle_request前,需要先討論路由注冊實現,代碼如下。

其實就是將路由和方法存到self.routes字典中,可以通過route裝飾器的形式將路由和方法關聯,也可以通過add_route方法關聯,在app.py中使用一下。

因為url中可以存在變數,如 @app.route("/hello/{name}") ,所以在匹配時,需要進行解析,可以使用正則匹配的方式進行匹配,parse這個第三方庫已經幫我們實現了相應的正則匹配邏輯,pip安裝使用一下則可。

這里定義find_handler方法來實現對self.routes的遍歷。

了解了路由與方法關聯的原理後,就可以實現handle_request方法,該方法主要的路徑就是根據路由調度對應的方法,代碼如下。

在該方法中,首先實例化webob庫的Response對象,然後通過self.find_handler方法獲取此次請求路由對應的方法和對應的參數,比如。

它將返回hello方法對象和name參數,如果是 /hello/二兩 ,那麼name就是二兩。

因為route裝飾器可能裝飾器的類對象,比如。

此時self.find_handler方法返回的hanler就是個類,但我們希望調用的是類中的get、post、delete等方法,所以需要一個簡單的判斷邏輯,通過inspect.isclass方法判斷handler如果是類對象,那麼就通過getattr方法獲取類對象實例的中對應的請求方法。

如果類對象中沒有該方法屬性,則拋出該請求類型不被允許的錯誤,如果不是類對象或類對象中存在該方法屬性,則直接調用則可。

此外,如果方法的路由並沒有注冊到self.routes中,即404的情況,定義了defalut_response方法返回其中內容,代碼如下。

如果handle_request方法中調度的過程出現問題,則直接raise將錯誤拋出。

至此,一個最簡單的web服務就編寫完成了。

回顧Flask,Flask可以支持HTML、CSS、JavaScript等靜態文件,利用模板語言,可以構建出簡單但美觀的Web應用,我們讓TopWebF也支持這一功能,最終實現圖中的網站,完美兼容靜態文件。

Flask使用了jinja2作為其html模板引擎,ToyWebF同樣使用jinja2,jinja2其實實現一種簡單的DSL(領域內語言),讓我們可以在HTML中通過特殊的語法改變HTML的結構,該項目非常值得研究學習。

首先 pip install jinja2 ,然後就可以使用它了,在ToyWebF項目目錄中創建templates目錄,以該目錄作為默認的HTML文件根目錄,代碼如下。

首先利用jinja2的FileSystemLoader類將file system中的某個文件夾作為loader,然後初始化Environment。

在使用的過程中(即調用template方法),通過get_template方法獲得具體的某個模板並通過render方法將對應的內容傳遞給模板中的變數。

這里我們不寫前端代碼,直接去互聯網中下載模板,這里下載了Bootstrap提供的免費模板,可以自行去 https://startbootstrap.com/themes/freelancer/ 下載,下載完後,你會獲得index.html以及對應的css、jss、img等文件,將index.html移動到ToyWebF/templates中並簡單修改了一下,添加一些變數。

然後在app.py文件中為index.html定義路由以及需要的參數。

至此html文件的支持就完成了,但此時的html無法正常載入css和js,導致頁面布局非常醜陋且交互無法使用。

接著就讓ToyWebF支持css、js,首先在ToyWebF目錄下創建static文件夾用於存放css、js或img等靜態文件,隨後直接將前面下載的模板,其中的靜態文件復制到static中則可。

通過whitenoise第三方庫,可以通過簡單的幾行代碼讓web框架支持css和js,不需要依賴nginx等服務,首先 pip install whitenoise ,隨後修改API類的 __init__ 方法,代碼如下。

其實就是通過WhiteNoise將self.wsgi_app方法包裹起來,在調用API的 __call__ 方法時,直接調用self.whitenoise。

此時,如果請求web服務獲取css、js等靜態資源,WhiteNoise會獲取其內容並返回給client,它在背後會匹配靜態資源在系統中對應的文件並將其讀取返回。

至此,一開始的網頁效果就實現好了。

web服務如果出現500時,默認會返回 internal server error ,這顯得比較丑,為了讓框架使用者可以自定義500時返回的錯誤,需要添加一些代碼。

首先API初始化時,初始self.exception_handler對象並定義對應的方法添加自定義的錯誤

在handler_request方法進行請求調度時,調度的方法執行邏輯時報500,此時不再默認將錯誤拋出,而是先判斷是否有自定義錯誤處理。

在app.py中,自定義錯誤返回方法,如下。

custom_exception_handler方法只返回自定義的一段話,你完全可以替換成美觀的template。

我們可以實驗性定義一個路由來看效果。

Web服務的中間件也可以理解成鉤子,即在請求前可以對請求做一些處理或者返回Response前對Response做一下處理。

為了支持中間件,在TopWebF目錄下創建middleware.py文件,在編寫代碼前,思考一下如何實現?

回顧一下現在請求的調度邏輯。

1.通過routes裝飾器關聯路由和方法 2.通過API.whitenoise處理 3.如果是請求API介面,那麼會將參數傳遞給API.wsgi_app 4.API.wsgi_app最終會調用API.handle_request方法獲取路由對應的方法並調用該方法執行相應的邏輯

如果希望在request前以及response後做相應的操作,那麼其實就需要讓邏輯在API.handle_request前後執行,看一下代碼。

其中add方法會實例化Middleware對象,該對象會將當前的API類實例包裹起來。

Middleware.handle_request方法其實就是在self.app.handle_request前調用self.process_request方法處理request前的數據以及調用self.process_response處理response後的數據,而核心的調度邏輯,依舊交由API.handle_request方法進行處理。

這里的代碼可能會讓人感到疑惑, __call__ 方法和handle_request方法中都有self.app.handle_request(request),但其調用對象似乎不同?這個問題暫時放一下,先繼續完善代碼,然後再回來解釋。

接著在api.py中為API創建middleware屬性以及添加新中間件的方法。

隨後,在app.py中,自定義一個簡單的中間件,然後調用add_middleware方法將其添加。

定義好中間件後,在請求調度時,就需要使用中間件,為了兼容靜態文件的情況,需要對css、js、ing文件的請求路徑做一下兼容,在其路徑中加上/static前綴

緊接著,修改API的 __call__ ,兼容中間件和靜態文件,代碼如下。

至此,中間件的邏輯就完成了。

但代碼中依舊有疑惑,Middleware類中的 __call__ 方法和handle_request方法其調用的self.app到底是誰?

為了方便理解,這里一步步拆解。

如果沒有添加新的中間件,那麼請求的調度邏輯如下。

在沒有添加中間件的情況下,self.app其實就是API本身,所以 middleware.__call__ 中的self.app.handle_request就是調用API.handle_request。

如果添加了新的中間件,如上述代碼中添加了名為SimpleCustomMiddleware的中間件,此時的請求調度邏輯如下。

因為注冊中間件時,Middleware.add方法替換了原始Middleware實例中的app對象,將其替換成了SimpleCustomMiddleware,而SimpleCustomMiddleware也有app對象,SimpleCustomMiddleware中的app對象,才是API類實例。

在請求調度的過程中,就會觸發Middleware類的handle_request方法,該方法就會執行中間件相應的邏輯去處理request和response中的數據。

當然,你可以通過Middleware.add方法添加多個中間件,這就會構成棧式調用的效果,代碼如下。

啟動web服務後,其執行效果如下。

閱讀全文

與python實現模板引擎相關的資料

熱點內容
用圖片的地圖再編譯的地方 瀏覽:462
python監控系統進程 瀏覽:236
群暉怎麼取消照片共享文件夾 瀏覽:156
程序員那麼可愛第幾集陸璃懷孕 瀏覽:615
西門子st編程手冊 瀏覽:59
mt4編程書籍 瀏覽:21
單片機模擬實驗設置電壓 瀏覽:948
如何用電腦打開安卓手機內存 瀏覽:860
java數據訪問層 瀏覽:181
代碼優化是編譯程序的必要階段 瀏覽:623
程序員那麼可愛孩子還在嗎 瀏覽:513
以下哪些是資料庫編程技術 瀏覽:164
水冷壓縮冷凝機組 瀏覽:177
小米路由器app怎麼加黑名單 瀏覽:433
證券交易2012pdf 瀏覽:208
單線程和多線程編譯 瀏覽:155
游戲被加密了刪不了怎麼辦 瀏覽:475
二建6米的柱子加密多少箍筋 瀏覽:648
怎麼簡單易懂的了解伺服器 瀏覽:356
mcpe怎麼看伺服器地址 瀏覽:994