Sir*_*wer 16 python apache mod-wsgi flask
我已经安装了Apache服务器,它正在通过mod_wsgi处理Flask响应.我通过别名注册了WSGI脚本:
[httpd.conf中]
WSGIScriptAlias /service "/mnt/www/wsgi-scripts/service.wsgi"
Run Code Online (Sandbox Code Playgroud)
我在上面的路径中添加了相应的WSGI文件:
[/mnt/www/wsgi-scripts/service.wsgi]
import sys
sys.path.insert(0, "/mnt/www/wsgi-scripts")
from service import application
Run Code Online (Sandbox Code Playgroud)
我有一个简单的测试Flask Python脚本,它提供了服务模块:
[/mnt/www/wsgi-scripts/service.py]
from flask import Flask
app = Flask(__name__)
@app.route('/')
def application(environ, start_response):
status = '200 OK'
output = "Hello World!"
response_headers = [('Content-type', 'text/plain'),
('Content-Length', str(len(output)))]
start_response(status, response_headers)
return [output]
@app.route('/upload')
def upload(environ, start_response):
output = "Uploading"
status = '200 OK'
response_headers = [('Content-type', 'text/plain'),
('Content-Length', str(len(output)))]
start_response(status, response_headers)
return [output]
if __name__ == '__main__':
app.run()
Run Code Online (Sandbox Code Playgroud)
当我访问我的网站URL [hostname]/service时,它按预期工作,我得到"Hello World!" 背部.问题是我不知道如何使其他路由工作,如上例中的"上传".这在独立的Flask中工作正常但在mod_wsgi下我很难过.我唯一可以想象的是在httpd.conf中为我想要的每个端点注册一个单独的WSGI脚本别名,但这会消除Flask的奇特路由支持.有没有办法让这项工作?
Bur*_*lid 18
在您正在执行的wsgi文件中from service import application,该文件仅导入您的application方法.
改变它from service import app as application,一切都将按预期工作.
在你的评论之后,我想我会稍微扩展一下答案:
你的wsgi文件是python代码 - 你可以在这个文件中包含任何有效的python代码.安装在Apache中的wsgi"handler"正在查找此文件中的应用程序名称,它将把请求移交给.Flask类实例 - app = Flask(__name__)提供了这样的接口,但由于它被调用app而不是application,所以在导入时必须使用别名 - 这就是from行所做的.
你可以 - 这完全没问题 - 只需这样做application = Flask(__name__),然后将Apache中的wsgi处理程序指向你的service.py文件.如果service.py是可导入的(也就是说,某处PYTHONPATH),则不需要中间的wsgi脚本.
虽然上述作品,但其做法不好.wsgi文件需要Apache进程的权限才能工作; 并且您通常将其与实际源代码(应该是文件系统中的其他位置)分开,并具有适当的权限.