引言
以前,学习前端的时候用过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 compile
yum install gcc
但我们执行
pip install uwsgi
的时候会报错。我忘了截图了。不要慌张,在一堆红字中,他提示我们fatal error: Python.h: No such file or directory
查看
Python development headers
yum list *python*devel
找一个和python版本对应的版本,安装
Python development headers
yum 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,必须是appprocesses
,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();
结果你猜怎么着,成了!运行完全如预期。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。