window2008下,部署apache+mod_msgi+flask

注:本文前题是你已懂得怎么使用python flask建站。这里只是提供一种方法,使用apache + mod_wsgi来部署你的python项目
环境:

步骤:

  1. 安装python37 64bit,默认安装目录。
  2. 下载并解压ApacheHaus至:“d:\Apache24”。进入"d:\Apache24\bin",执行httpd.exe,使用浏览器打开localhost:80,若没问题则可看到一个apache默认的页面。若是出错,此时一般就是默认端口被占用。
  3. 下载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\",一次搞定。
  4. 使用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]
  1. 修改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()
  1. 修改 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

  1. 在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>
  1. 再次重启d:\Apache24\bin\httpd.exe,浏览器中打开localhost:5002,可以看到“Hello Flask-test”,意味着python项目已启动了。

我的部署主要参考了mod_wsgi (Apache)python + mod_wsgi + apache 部署用flask框架的py程序----window环境(亲测成功)两篇文章,但在部署过程中出现了很多问题,到处找不到解决方法,差点就要放弃了。直到看了
WSGIPythonPath和WSGIPythonHome的作用和区别
这个文章才最终成功完成部署。
以下是我遇到的错误和解决方法:


  1. 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是同一个道理,但我没有回头再去尝试。因为觉得把所有设置都放在同一个地方会更好。


  2. 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”
    路径是你的项目路径。用分号隔开,可以有多个项目同时运行。


  3. 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”

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值