注:本文前题是你已懂得怎么使用python flask建站。这里只是提供一种方法,使用apache + mod_wsgi来部署你的python项目
环境:
- windows 2008
- python 3.7 64bit
- apache 2.4.35 x64(ApacheHaus) 下载地址:http://httpd.apache.org/download.cgi ->Files for Microsoft Windows ->ApacheHaus->Apache 2.4.35 x64
- mod_wsgi‑4.6.4+ap24vc15‑cp37‑cp37m‑win_amd64.whl 下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#mod_wsgi
注意选择好对应的apache、python版本下载
- 项目路径:d:\pyproject\test\
- 建议使用pycharm开发,新建项目默认使用venv。
步骤:
- 安装python37 64bit,默认安装目录。
- 下载并解压ApacheHaus至:“d:\Apache24”。进入"d:\Apache24\bin",执行httpd.exe,使用浏览器打开localhost:80,若没问题则可看到一个apache默认的页面。若是出错,此时一般就是默认端口被占用。
- 下载mod_wsgi‑4.6.4+ap24vc15‑cp37‑cp37m‑win_amd64.whl,将其扩展名.whl改为.zip,打开并将"mod_wsgi\server\mod_wsgi.cp37-win_amd64.pyd"拷贝至"d:\Apache24\modules"。
网上很多博客介绍都是在python项目的虚拟环境中安装mod_wsgi,若是主机里有多个项目部署的话,就需要每个项目都安装mod_wsgi,所以还不如直接将mod_wsgi-*.pyd放到"d:\Apache24\modules\",一次搞定。
- 使用pycharm创建新项目test,并先建wsgi.py(很多人建议使用"项目名称.wsgi",但为了方便在pycharm中编辑,我还是用了wsgi.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]
- 修改d:\Apache24\conf\httpd.conf:
将LoadModule vhost_alias_module modules/mod_vhost_alias.so前面的#去掉,意思是让其有效,这个是为之后的虚拟主机启用做准备。
在最底下加入以下代码。重启d:\Apache24\bin\httpd.exe,在浏览器中打开localhost:5002(监听端口改为5002),应该可以看到"Hello wsgi"。至此说明mod_wsgi运作正常,以后就是怎么与python程序连接的问题了。
LoadModule wsgi_module "modules/mod_wsgi.cp37-win_amd64.pyd"
Listen 5002 # (监听端口)
<VirtualHost *:5002>
WSGIScriptAlias / D:\pyproject\test\wsgi.py
<Directory D:\pyproject\test>
Require all granted
</Directory>
</VirtualHost>
6.在 pycharm的虚拟环境中安装flask:pip install flask。并创建test.py与wsgi.py同一目录:
from flask import *
app=Flask(__name__)
@app.route('/')
def index():
return '<center><h1>Hello Flask-test</h1></center>'
if __name__ == '__main__':
app.run()
- 修改 wsgi.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]
# import sys
#
# sys.path.insert(0, 'D:\\pyproject\\test\\')
# 如果你的test.py与wsgi.py放在同一目录下,就不需要sys.path.insert()。若是在部署时出现找不到你的项目文件、包之类的错误,可以尝试在这里加上这一句。
from test import app as application
- 在d:\Apache24\conf\httpd.conf中加入WSGIPythonHome(指向系统中安装python的路径)和WSGIPythonPath(python项目路径,和该项目的虚拟环境包路径,以“;”号隔开。不同项目不同路径,也可在这里添加,同样以“;”号隔开。)
LoadModule wsgi_module "modules/mod_wsgi.cp37-win_amd64.pyd"
WSGIPythonHome "C:\Users\Administrator\AppData\Local\Programs\Python\Python37"
WSGIPythonPath "D:/pyproject/test;D:\pyproject\test\venv\Lib\site-packages"
Listen 5002 # (监听端口)
<VirtualHost *:5002>
WSGIScriptAlias / D:\pyproject\test\wsgi.py
<Directory D:\pyproject\test>
Require all granted
</Directory>
</VirtualHost>
- 再次重启d:\Apache24\bin\httpd.exe,浏览器中打开localhost:5002,可以看到“Hello Flask-test”,意味着python项目已启动了。
我的部署主要参考了mod_wsgi (Apache)和python + mod_wsgi + apache 部署用flask框架的py程序----window环境(亲测成功)两篇文章,但在部署过程中出现了很多问题,到处找不到解决方法,差点就要放弃了。直到看了
WSGIPythonPath和WSGIPythonHome的作用和区别这个文章才最终成功完成部署。
以下是我遇到的错误和解决方法:
-
:
Fatal Python error: initfsencoding: unable to load the file system codec
ModuleNotFoundError: No module named ‘encodings’
这个错误是因为找不到python解释器,在httpd.conf中加入:
WSGIPythonHome “C:\Users\Administrator\AppData\Local\Programs\Python\Python37”
路径是你系统中python的安装路径。
网上也有博客介绍是在系统环境中加入:PYTHONHOME=“C:\Users\Administrator\AppData\Local\Programs\Python\Python37”
PYTHONPATH=“C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Lib”
系统环境中设置PYTHONHOME和PYTHONPATH可能和在httpd.conf中设置WSGIPythonHome和WSGIPythonPath是同一个道理,但我没有回头再去尝试。因为觉得把所有设置都放在同一个地方会更好。
-
:
Traceback (most recent call last):\r, referer: http://localhost:5002/
File “D:/pyproject/test/wsgi.py”, line 3, in \r, referer: http://localhost:5002/
from test import app as application\r, referer: http://localhost:5002/
ImportError: cannot import name ‘app’ from ‘test’ (C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Lib\test\init.py)\r, referer: http://localhost:5002/
这个错误是找不到你的项目,在httpd.conf中加入:
WSGIPythonPath “D:/pyproject/test”
路径是你的项目路径。用分号隔开,可以有多个项目同时运行。 -
:
Traceback (most recent call last):\r
File “D:/pyproject/test/wsgi.py”, line 7, in \r
from test import app as application\r
File “D:\pyproject\test\test.py”, line 1, in \r
from flask import Flask\r
ModuleNotFoundError: No module named ‘flask’\r
这个错误是找不到你项目(虚拟环境)中的依赖包,在httpd.conf中的WSGIPythonPath 在加入"D:\pyproject\test\venv\Lib\site-packages",即最终是:
WSGIPythonPath “D:/pyproject/test;D:\pyproject\test\venv\Lib\site-packages”