python實現(xiàn)一個簡單的web應用框架
引言
本篇文章所依賴的python
環(huán)境是:
如果你還沒了解過什么是WSGI
,建議先查詢一下相關資料,或者查看上一篇文章:
寫應用框架需要寫底層服務器么?
這個要區(qū)分2種情況,如果應用框架,你沒有參考WSGI
標準,那么在寫應用框架之前,你就必須要定義一套屬于自己的服務器,當然本文不采取這種方式,專業(yè)的事情應該專業(yè)的人來做。我們將編寫符合WSGI
標準的框架 ,所以僅需要引入符合WSGI
的服務器即可,如果你還不明白什么是WSGI
,建議您查看一下相關資料,或者看一下上一篇介紹WSGI
的文章。
那么有哪些wsgi
服務器呢? 這里簡單列舉2個
uwsgi
:該服務器是使用c
編寫的,具有廣泛的應用場景的應用程序容器。除了支持WSGI
外,還支持其他協(xié)議,例如HTTP
、WebSocket
等等。不僅如此,它還提供了多進程、多線程、協(xié)程、異步IO等多種運行模式,還提供了很多高級功能,如內(nèi)存共享、定時任務、快速熱部署等。waitress
:該服務器是使用python
寫的,是一個很輕量級、非??煽俊⒅С侄嗑€程的WSGI
服務器,可以用來運行Python Web
應用。
我們本篇文章的web
框架采用的就是uswgi
。
uwsgi基本使用
上面已經(jīng)簡單介紹了uwsgi
的信息,本段落會簡單介紹一下uwsgi
安裝和簡單的配置。
安裝uwsgi
安裝uwsgi
,在python
中,直接使用pip
安裝即可,例如:
pip3 install uwsgi
配置uwsgi
uwsgi
支持多種格式,可以直接在命令行上,例如:
uwsgi --http :8080 --wsgi-file myapp.py --callable app
還可以將上述寫到命令中,例如:
uwsgi --ini myapp.ini
其中myapp.ini
內(nèi)容如下:
[uwsgi] http = :8080 wsgi-file = myapp.py callable = app
不僅如此,uwsgi
還支持多個格式,例如: xml
、yaml
、json
等。
配置文件也可以是url
的形式,例如:
uwsgi --ini http://127.0.0.1:8080/myapp.ini
uwsgi常用配置
指定啟動uwsgi
進程的用戶和用戶組
uid=pdudo gid=pdudoGroups
上述啟動uwsgi
進程使用pdudo
用戶,而組的話是使用pdudoGroups
指定項目名稱
使用project
來指定項目名稱,如project=pdudoProject
指定進程家目錄
使用base
來指定進程家目錄,如base=/home/pdudo/
設置進程數(shù)
要設置進程數(shù),需要先將master
設置為True
, 而后再設置process
個數(shù),一把建議進程數(shù)不超過cpu
核數(shù),例如:
master=True process=16
設置對外http
地址
若想對外,有很多中配置,如socket
等,但是一般用的最多的還是http
,我們直接指向一個套接字地址即可,例如:
http=0.0.0.0:8000
uwsgi啟服和停服
啟動服務器
直接使用uwsgi
即可啟動配置,如:
uwsgi
若不想設置配置文件,直接可以在命令行啟動,如:
uwsgi --http :8080
若想通過配置文件啟動,則可以使用加載配置選項即可,例如:
從ini
中讀取配置啟動服務器
uwsgi -ini app.ini
從json
中讀取配置啟動服務器
uwsgi --json app.json
在uwsgi
中,可以通過向進程發(fā)送信號的方式,來關閉服務器,對應的信號為: SIGINT
。
關閉服務器
kill -2 uwsgiPID
啟動一個demo
我們將使用uwsgi
來啟動一個簡單的demo
,首先我們來編寫符合WSGI
標準的應用,例如,我們的demo
為:
def application(environ, start_response): status = "200 OK" headers = [("Content-type","text/html"),("Server","pdudo_web_sites")] start_response(status,headers) return [b'Hello, pdudos.']
上述代碼,我們定義了一個函數(shù)application
,形參為environ
以及start_response
,前則是一個字典,后則是一個函數(shù),在application
中,需要定義請求的狀態(tài)和短語,以及響應頭。 而后調用start_response
函數(shù),需要傳入狀態(tài)和響應頭。最后將返回一個報文主體。
如果這塊,不太明白的話,可以看一下wsgi
標準。
我們將這個上述代碼保存為main.py
,而后使用uwsgi
來啟動該項目:
uwsgi --http :8080 --wsgi-file main.py
上述代碼,使用的命令行的方式來啟動uwsgi
,指定http
端口為8080
,監(jiān)聽的網(wǎng)卡沒有指定,默認是所有網(wǎng)卡,從swgi-file
將指定我們自己寫的wsgi
應用程序。
啟動后,我們使用curl -v 127.0.0.1:8080/123
可以得到如下信息:
寫一個簡單的web應用框架
本篇文章,很大部分都在描述uwgi
,這是因為我們將選用其為web
服務器,所以很大的篇章都在描述它,現(xiàn)在,我們已經(jīng)會基本的操作了,我們應該來寫一個簡單的web
框架了。
我們寫的web
框架如下:
webRoute = {} def application(environ, start_response): path = environ['PATH_INFO'] if webRoute[path]: func = webRoute[path] code , body = func(environ) status = "%d OK" % (code) headers = [("Content-type","text/html"),("Server","pdudo_web_sites")] start_response(status,headers) return [body.encode()] def Routes(path,func): print("add routes: %s %s" %(path,func)) webRoute[path] = func
哎,短短17行,我們基本的框架就寫完了,厲害吧,我們將次代碼保存到本地,命名為myWeb.py
,目的是和邏輯代碼分開。上述代碼,我們定義了一個webRoute
字典來存儲路由信息,我們想要存儲key
為請求的url
,值為可被調用的函數(shù)。
我們?yōu)榇藢iT寫了一個Routes
函數(shù),該函數(shù)將傳入2個值,第一個是請求的url
,第二個是可被調用的函數(shù)。
在application
中,會首先獲取請求的路徑,而后再根據(jù)webRoute
的值,進行匹配,若匹配到了,則執(zhí)行該函數(shù),該函數(shù)必須2個值,第一個是狀態(tài)碼,第二個是響應報文主體。 我們將根據(jù)返回的信息,組合成狀態(tài)碼以及響應頭,通過調用start_response
函數(shù),將2個參數(shù)攜帶上,最后return
一個報文主體。
接下里,我們就可以寫我們的邏輯代碼了,我們編寫如下:
import myWeb app = myWeb.application def index(*args): return (200,"hello world") def d345(*args): return (400,"dasda") myWeb.Routes("/index",index) myWeb.Routes("/123",d345)
我們將上述代碼保存到本地,命名為main.py
。
上述代碼,我們先引用了剛剛保存到本地的myWeb
文件,定義一個變量app
用于引用myWeb.application
函數(shù)。接著,我們便定義了2個函數(shù),分別是index
和d345
,2個函數(shù)的共同之處是返回了一個元組,元組前者是int類型,將用于狀態(tài)碼,后則是str
類型,將用于返回響應報文主體。
最后,我們通過myWeb.Routes
將2個函數(shù)于路由串聯(lián)起來,分別對應為:
/index
:index
函數(shù)。/123
:d456
函數(shù)
我們應用框架就寫完了,我們需要使用uwsgi
來啟動一下我們寫的框架:
uwsgi --http :8080 --wsgi-file main.py --callable app
這里新增了一個配置項,callable
該參數(shù)的意思是,指定應用起始函數(shù),默認是application
,如果不是這個名稱,則需要額外指定,我們定義的是app
,所以需要將其指定為app
。
啟動后,我們可以觀察一下,我們之前在框架Routes
函數(shù)中,我們打印了路由和函數(shù)的信息,我們可以看下uwsgi
輸出的信息,是有有我們定義的函數(shù)。
發(fā)現(xiàn)沒問題后,我們使用curl
再來請求一下路由,驗證是否有問題:
如上結果,結果正確輸出。
總結
上一篇文章,我們初步了解了什么是WSGI
,這是一個很有意思的東西,它是一個標準,我們僅需要按照它的標準,來寫一個web
應用,我們就可以放到任何符合WSGI
的服務器上,不論是上一篇提及的wsgiref
還是本篇文章所講述的uswgi
都可以來調用我們的框架并且運行。最后我們也寫了一個非常簡單的應用框架。
以上就是python|寫一個簡單的web應用框架的詳細內(nèi)容,更多關于python web應用框架的資料請關注腳本之家其它相關文章!
相關文章
python 根據(jù)csv表頭、列號讀取數(shù)據(jù)的實現(xiàn)
這篇文章主要介紹了python 根據(jù)csv表頭、列號讀取數(shù)據(jù)的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05python實現(xiàn)的批量分析xml標簽中各個類別個數(shù)功能示例
這篇文章主要介紹了python實現(xiàn)的批量分析xml標簽中各個類別個數(shù)功能,涉及Python針對xml文件的遍歷、讀取、解析等相關操作技巧,需要的朋友可以參考下2019-12-12