Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将Flask路由与Apache和mod_wsgi一起使用?_Python_Apache_Mod Wsgi_Flask - Fatal编程技术网

Python 如何将Flask路由与Apache和mod_wsgi一起使用?

Python 如何将Flask路由与Apache和mod_wsgi一起使用?,python,apache,mod-wsgi,flask,Python,Apache,Mod Wsgi,Flask,我已经安装了Apache服务器,它正在通过mod_wsgi处理Flask响应。我已通过别名注册了WSGI脚本: [httpd.conf] WSGIScriptAlias /service "/mnt/www/wsgi-scripts/service.wsgi" 我已在上述路径中添加了相应的WSGI文件: [/mnt/www/wsgi scripts/service.wsgi] import sys sys.path.insert(0, "/mnt/www/wsgi-scripts") fro

我已经安装了Apache服务器,它正在通过mod_wsgi处理Flask响应。我已通过别名注册了WSGI脚本:

[httpd.conf]

WSGIScriptAlias /service "/mnt/www/wsgi-scripts/service.wsgi"
我已在上述路径中添加了相应的WSGI文件:

[/mnt/www/wsgi scripts/service.wsgi]

import sys
sys.path.insert(0, "/mnt/www/wsgi-scripts")

from service import application
我有一个简单的测试用例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()

当我转到我的网站URL[hostname]/服务时,它按预期工作,我得到了“Hello World!”回复。问题是,我不知道如何让其他路由工作,比如上面例子中的“上传”。这在独立烧瓶中运行良好,但在mod_wsgi下,我被难倒了。我唯一能想到的是在httpd.conf中为我想要的每个端点注册一个单独的WSGI脚本别名,但这会剥夺Flask奇特的路由支持。有什么方法可以实现这一点吗?

在您的wsgi文件中,您正在从服务导入应用程序执行
,该应用程序只导入您的
应用程序
方法

将其从服务导入应用程序更改为应用程序
,一切都将按预期工作

在你的评论之后,我想我应该把答案扩大一点:

您的wsgi文件是python代码——您可以在该文件中包含任何有效的python代码。Apache中安装的wsgi“handler”正在该文件中查找应用程序名称,它将请求转交给该文件。Flask类实例--
app=Flask(\uuuuu name\uuuu)
--提供了这样一个接口,但是由于它被称为
app
,而不是
application
,所以在导入它时必须给它起别名——这就是from行的作用

您可以—这很好—只需执行这个
application=Flask(\uuu name\uuu)
,然后将Apache中的wsgi处理程序指向您的
service.py
文件。如果
service.py
是可导入的(这意味着,在
PYTHONPATH
的某个地方),您就不需要中间wsgi脚本


尽管上述方法有效,但它是一种不好的做法。wsgi文件需要Apache进程的权限才能工作;您通常会将其与实际的源代码分开,而实际的源代码应该在文件系统的其他地方,并具有适当的权限

您是否尝试过浏览
/service/upload
?你可能会感到惊喜。当我点击/service/upload时,请求仍然会被发送到“application”函数。事实上,我可以在应用程序函数之前删除route语句,它仍然可以工作。就像mod_wsgi总是使用应用程序作为应用程序的入口点一样。我觉得我需要在“应用程序”内部做一些事情来启动Flask的路由逻辑。这就成功了。非常感谢。除了更改service.wsgi以符合您的指示之外,我还需要将我的service.py恢复为纯烧瓶。在最初的问题陈述中,我认为我把纯粹的mod_wsgi代码与Flask混合在一起已经脱离了轨道。我认为这种混乱的根源是将我的根路由处理程序命名为“应用程序”。我认为我不清楚mod_wsgi和Flask代码。我知道这都是Python。我一直坚持的是,在上面的示例中,我的
@app.route('/')
正在装饰函数
应用程序
。在我最初的设置中,我只导入应用程序,所以只调用该函数。当我将service.wsgi更改为使用service import app中的
作为应用程序时,该应用程序确实正确引用了Flask对象,但它似乎也与
应用程序
函数产生了命名冲突。我将此函数重命名为
@def root():
,现在它工作正常。再次感谢!好极了!这就是我痛苦的答案。