引言

以前,学习前端的时候用过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


BreezingSummer
45 声望0 粉丝

引用和评论

0 条评论