我正在尝试将 WSGI 与我需要能够在 Apache 2 下发布到的 URL 一起使用(使用
flask
)。 我能够独立于 Apache (.wsgi
) 运行我的 python cfg.wsgi
,并且它可以正确处理 GET 和 POST 请求(使用 curl
进行测试),但在 Apache 下运行时它无法运行:对 curl
的 GET 请求相关 URL (/watchdog.cfg
) 返回“404 Not Found”(如果我删除映射 GET 的 WSGI工作得非常好,完全在 Apache 中,但是当然我没有得到我想要的 POST 功能)
Apache 正在加载
.wsgi
文件(其错误日志如此说明,并且 .wsgi
文件顶部的调试打印出现在调试日志中),因此 Python 路径和解释器可能是正确的;问题似乎是 Apache 没有调用 .wsgi
路由函数(即,当相关 URL (application
) 为要求)。我的 Apache /watchdog.cfg
文件是:
.conf
<VirtualHost *:80>
DocumentRoot /home/http/
WSGIScriptAlias /watchdog.cfg /home/http/cfg.wsgi
<Directory /home/http>
AllowOverride none
Require all granted
</Directory>
</VirtualHost>
返回“wsgi_module(共享)”,所以我相信Apache已经安装了WSGI模块。 文件
apache2ctl -M | grep wsgi
的权限为 0644,文件 watchdog.cfg
的权限为 0755。我的cfg.wsgi
文件是:
cfg.wsgi
这是在 Raspbian Linux 上。 关于为什么我的路由函数没有被 Apache 调用有什么建议吗?
from flask import Flask, request, send_file
from os import path
FILE_NAME = 'watchdog.cfg'
application = Flask(__name__)
@application.route('/' + FILE_NAME, methods=['GET', 'POST'])
def cfg():
file_path = '/home/http/' + FILE_NAME;
if request.method == 'POST':
jsonString = request.json
with open(file_path, 'w') as f:
f.write(jsonString)
return "File updated successfully.", 200
elif request.method == 'GET':
if path.exists(file_path):
return send_file(file_path, mimetype='application/json')
else:
return "File not found.", 404
if __name__ == '__main__':
application.run(host='0.0.0.0', port=80)
的无 Flask 版本,它确实有效(相同的 Apache
cfg.wsgi
文件内容):.conf