引言
以前,學習前端的時候用過nodejs做後端,當時用if...else...寫路徑判斷寫的很臃腫。現在想試試其他語言,就選了python試試水。從nodejs到flask絕對是個巨大的挑戰,尤其是對想我這樣很久沒有看過js的人來説。之前用的nodejs+react,現在有點看不懂了,感慨年輕真好。
選型
python的主流web框架有django,flask,tornado,twisted。。。年輕、輕量、順口,所以我選用flask。關於什麼是web框架可以看下圖。
wsgi解釋一套大家約定的接口標準;
wsgi有很多可以選擇的
web framework就是各個語言自己規定的一套標準,旨在方便開發人員開發業務相關;
http server理解為處理網絡協議相關的服務。
看文檔的時候,很多web framework也能提供http server。不過,他們也説了,大部分用來debug用,不建議生產上使用
安裝
安裝flask
我使用了centos 8 stream。使用yum命令。
yum install flask
安裝uWSGI
官網:uwsgi官網
上述地址是uwsgi關於快速入手python的文檔。安裝相關節選如下截圖:
你很容易看到via pip; pip install uwsgi;。
-
那麼首先,需要獲得
pip,這意味着我們需要先安裝python(哈哈哈,當然,我們搞的就是python的web框架)看一下我們能安裝什麼版本
yum list *python*安裝一個能安裝的最新的版本
yum install python39
現在,我們應該可以看到像python3,python3.9,pip等python相關的命令了。 -
但我們執行
pip install uwsgi的時候會報錯。我忘了截圖了。不要慌張,在一堆紅字中,他提示我們Exception: you need a C compiler to build uWSGI安裝一個
c compileyum install gcc -
但我們執行
pip install uwsgi的時候會報錯。我忘了截圖了。不要慌張,在一堆紅字中,他提示我們fatal error: Python.h: No such file or directory查看
Python development headersyum list *python*devel找一個和python版本對應的版本,安裝
Python development headersyum install python39-devel - 這些都安裝完成後,執行
pip install uwsgi,應該沒有問題了。我安裝的時候比較卡,多執行幾次,總能成功的。
其實,uwsgi的文檔中寫了。再回到這張截圖,看下高亮的句子“uWSGI is a (big) C application, so you need a C compiler (like gcc or clang) and the Python development headers.”
使用
這部分可以按照上面【安裝uWSGI】裏的文檔擼一下就行了。連接裏往下翻有一節就叫做【Deploying Flask】。就是下面這一段。
然後結合【flask的這篇文檔】flask_uwsgi_nginx配置,配置一下nginx。就是下面這一段。
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:3031;
}
這樣的意思很明顯,就是所有的請求到這個 / 路徑,通過nginx,都被轉到3031端口是那個的服務處理。3031端口起着uwsgi,uwsgi連接着flask的應用。
我們看到,上述uwsgi是通過命令行的方式啓動的,他在終端會不停的刷新請求的信息。想讓他在後台啓動,請參考這篇文檔:uwsgi config file。
如下配置文件放入uwsgi.ini中。後綴.ini是必須的
其實就是把命令行的參數放到文件中
# uwsgi --socket 127.0.0.1:3031 --wsgi-file flask/index.py --callable app --processes 2 --threads 2 --stats 127.0.0.1:9191
[uwsgi]
daemonize = uwsgi.log
socket=127.0.0.1:3031
stats=127.0.0.1:9191
chdir=/xx/xx/xx
wsgi-file=%(chdir)/myflask.py
callable=app
processes=2
threads=2
master=True
safe-pidfile=%(chdir)/uwsgi.pid
解釋:
daemonize - 表示後台啓動,和日誌位置
socket - uwsgi啓動的端口
stats - 狀態監控服務啓動端口
chdir - uwsgi的根目錄
wsgi-file - flask文件
callable - 如果要啓動flask,必須是app
processes,threads - 要啓幾個進程幾個線程
safe-pidfile - 進程號存放文件
使用命令啓動。就不會在終端輸出了。
uwsgi uwsgi.ini
其他命令
變更index.py後需要reload一下uwsgi
uwsgi --reload uwsgi.pid
和諧停止可以用下面命令
uwsgi --stop uwsgi.pid
理解
我一開始復讀nodejs的代碼,我發現,nodejs也會去處理根路徑,返回給訪問者一個index.html,然後也會去處理其他路徑,返回給訪問者一個狀態或者一些數據。
用同樣的思路接觸flask,發現如果在nginx的根路徑下配置flask,然後在flask裏也配置根路徑,那就需要在flask中去返回一大串index.html,我沒找到咋搞。只有return render_template('index.html', name=name)像這樣。難辦,難辦那就別辦啦!!!
後面想了想,換個思路呢,index.html還是用nginx返回,flask就專心做一些接口得了。
所以實驗了一下像這樣的nginx配置:
location / {
index index.html;
}
location /xxx/ {
include uwsgi_params;
uwsgi_pass 127.0.0.1:3031;
}
像這樣子的flask配置:
from flask import Flask
app = Flask(__name__)
@app.route("/xxx/yyy", methods=['GET', 'POST'])
def login():
return "successfully into /xxx/yyy"
像這樣子編寫前端請求(js):
// 定義請求頭
login_request.open("POST", "xxx/yyy", true);
// 發送頁面登陸信息到服務器
login_request.send(login_data);
event.preventDefault();
結果你猜怎麼着,成了!運行完全如預期。