博客 / 詳情

返回

python flask + uwsgi初體驗

引言

以前,學習前端的時候用過nodejs做後端,當時用if...else...寫路徑判斷寫的很臃腫。現在想試試其他語言,就選了python試試水。從nodejs到flask絕對是個巨大的挑戰,尤其是對想我這樣很久沒有看過js的人來説。之前用的nodejs+react,現在有點看不懂了,感慨年輕真好。

選型

python的主流web框架有django,flask,tornado,twisted。。。年輕、輕量、順口,所以我選用flask。關於什麼是web框架可以看下圖。
webServerFlowChart
wsgi解釋一套大家約定的接口標準;
wsgi有很多可以選擇的flaskWsgi
web framework就是各個語言自己規定的一套標準,旨在方便開發人員開發業務相關;
http server理解為處理網絡協議相關的服務。

看文檔的時候,很多web framework也能提供http server。不過,他們也説了,大部分用來debug用,不建議生產上使用flaskHttpServer

安裝

安裝flask

我使用了centos 8 stream。使用yum命令。

yum install flask

安裝uWSGI

官網:uwsgi官網
上述地址是uwsgi關於快速入手python的文檔。安裝相關節選如下截圖:
uwsgi_python
你很容易看到via pip; pip install uwsgi;

  1. 那麼首先,需要獲得pip,這意味着我們需要先安裝python(哈哈哈,當然,我們搞的就是python的web框架)

    看一下我們能安裝什麼版本

    yum list *python*

    yumListPython

    安裝一個能安裝的最新的版本

    yum install python39

    yumInstallPython1
    yumInstallPython2
    現在,我們應該可以看到像python3python3.9pip等python相關的命令了。

  2. 但我們執行pip install uwsgi的時候會報錯。我忘了截圖了。不要慌張,在一堆紅字中,他提示我們Exception: you need a C compiler to build uWSGI

    安裝一個c compile

    yum install gcc
  3. 但我們執行pip install uwsgi的時候會報錯。我忘了截圖了。不要慌張,在一堆紅字中,他提示我們fatal error: Python.h: No such file or directory

    查看Python development headers

    yum list  *python*devel

    yumListPythonDevel

    找一個和python版本對應的版本,安裝Python development headers

    yum install python39-devel
  4. 這些都安裝完成後,執行pip install uwsgi,應該沒有問題了。我安裝的時候比較卡,多執行幾次,總能成功的。
    yumInstallPythonDevel_uwsgi

其實,uwsgi的文檔中寫了。再回到這張截圖,看下高亮的句子“uWSGI is a (big) C application, so you need a C compiler (like gcc or clang) and the Python development headers.”
uwsgi_python

使用

這部分可以按照上面【安裝uWSGI】裏的文檔擼一下就行了。連接裏往下翻有一節就叫做【Deploying Flask】。就是下面這一段。
uwsgi_flask
然後結合【flask的這篇文檔】flask_uwsgi_nginx配置,配置一下nginx。就是下面這一段。
flask_uwsgi_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
processesthreads - 要啓幾個進程幾個線程
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();

結果你猜怎麼着,成了!運行完全如預期。
flaskFirstAPI

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.