windowns下配置Apache+Python+Flask+mod_wsgi(详细部署步骤)

先介绍几个概念:
 
1、Flask是Python的一个Web开发框架,自己带了一个Web服务器,通过Werkzeug运行Flask,可以在开发环境中测试,如果在生产环境用Werkzeug启动Flask,会提示:Do not use the development server in a production environment.Use a production WSGI server instead.Flask 依赖的 Werkzeug 就是一个 WSGI 工具包,官方文档的定义是 Werkzeug 是为 Python 设计的 HTTP和 WSGI 实用程序库。
 
2、WSGI全称是Web Server Gateway Interface,也就是 Web 服务器网关接口。
 
它是 Python 语言定义出来的 Web 服务器和 Web 应用程序之间的简单而通用的接口,基于现存的 CGI 标准设计,后来在很多其他语言中也出现了类似的接口。 
 
总的来说,WSGI可以分为服务器和应用程序两个部分,实际上可以将WSGI理解为服务器与应用程序之间的一座桥,桥的一边是服务器,另一边是应用程序。
 
3、uWSGI是一个全站式的托管服务,它实现了应用服务器(支持多种编程语言)、代理、进程管理器、监视器。取名为 uWSGI 是因为它最早实现的是 Python 语言的 WSGI。
uWSGI 包括四个部分:
• uwsgi协议
• web server 内置支持协议模块
• application 服务器协议支持模块
• 进程控制程序
 
经过我半天的试错,结合网上的经验,总结:在Windowns下无法运行uWSGI服务器,所以就不要再试了,即便在官网下到了uwsgi-2.0.18.tar.gz的包,修改了uwsgiconfig.py中的os.uname()为platform.uname(),还是没用,要安装C和C++的编译器,装了也没有,总之是不行,这样就打消在Win平台使用Nginx代理uWSGI的方法。
 
还有一个办法:用Apache的mod_wsgi来运行Flask:
 
一、下载mod_wsgi-4.5.24+ap24vc14-cp37-cp37m-win_amd64.whl或者mod_wsgi-4.7.1+ap24vc15-cp37-cp37m-win_amd64.whl,按自己的Apache的Vc版本下载对应的Python版本的whl文件,这两个文件我都用了,我的Apache没报错,正常运行,可能没什么关系,如果有关系就换对应的版本。
 
二、在Flask的虚拟环境中安装:pip install mod_wsgi-4.7.1+ap24vc15-cp37-cp37m-win_amd64.whl
 
三、在虚拟环境Scripts中执行:mod_wsgi-express module-config
 
四、将上一步的这三行放到Apache的conf文件中:
 
LoadFile "....python 3.7.6/python37.dll"
LoadModule wsgi_module "...virtualenvs/mod_wsgi.cp37-win_amd64.pyd"
WSGIPythonHome "...virtualenvs/"
 
五、在项目的根目录创建文件:test.py
 
def application(environ,start_response):
    status = "200 Ok"
    output = b"Hello wsgi"
    response_headers=[('Content-type','text/plain'),('Content-                    Length',str(len(output)))]
    start_response(status,response_headers)
    return[output]
windowns下配置Apache+Python+Flask+mod_wsgi(详细部署步骤)
六、配置虚拟主机:
 
DocumentRoot 你的项目路径
WSGIScriptAlias / 你的项目路径\test.py
AllowOverride AuthConfig FileInfo
Require all granted
Order allow,deny
Allow from all
 
 
 
重启Apache,如果能看到“Hello wsgi”输出,就说明WSGI配置成功了。
 
七、配置Flask的app.run(),这一步比较简单,也比较麻烦,我按网上的说明配置,来来回回试了很多遍,一直是500Internal Server Error状态,索性在原项目下建了一个测试文件:flask-test.py
 
from flask import Flask
app = Flask(__name__)
 
@app.route("/test")
def index():
return "hello flask"
 
if __name__ == '__main__':
app.run()
 
单独运行Python flask-test.py是可以成功的。
 
八、配置上面的test.py文件:
 
import sys
sys.path.insert(0,'你项目的路径')
from flask-test import app as application
 
如果test.py和flask-test.py在同一个目录,前面两行可以不用加,一定要注意路径问题。
 
九、这里再打开网址,如果出现:hello flask,说明在WSGI下运行Flask没问题了。
 
所有在Windowns下的Apache+Flask+mod_wsgi配置到这里就结束了,但我的项目还是不行,用flask-test没问题,加载项目的入口app就是不行,查了路径问题,还是500的错误,后来无意中在刷新页面时发现在项目文件夹里,生成(更新)了一个:__pycache__ 文件夹,突然恍然大悟,赶紧删除了这个文件夹,再次运行项目:成功!
 
windowns下配置Apache+Python+Flask(详细)
 
所以,如果在Windowns+Flask+mod_wsgi下出现500服务器错误,重点检查这三项:
 
(1)路径问题,尤其是环境变量的,也就是上面第2步中的安装mod_wsgi必须要在对应虚拟环境中安装。
(2)目录下缓存问题,如__pycache__ ,有则删除再试。
(3)模块缺失问题,项目中用到的包如果没在虚拟环境中,这里是不提示的,直接给出500服务器错误,不像在cmd这类Terminal中一样有提示,告诉你缺哪个包。
 
官方配置方法:https://dormousehole.readthedocs.io/en/latest/deploying/mod_wsgi.html
 
 

返回列表
上一篇: