当前位置: 首页 > 面试题库 >

如何在Apache和mod_wsgi中使用Flask路由?

傅越
2023-03-14
问题内容

我已经安装了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

我有一个简单的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()

当我转到我的网站URL [主机名] /服务时,它可以按预期运行,并且显示“ Hello World!”。问题是我不知道如何使其他路由正常工作,例如上例中的“上传”。这在独立的Flask中可以正常工作,但是在mod_wsgi下我很困惑。我能想象的唯一一件事就是在httpd.conf中为我想要的每个端点注册一个单独的WSGI脚本别名,但这剥夺了Flask的高级路由支持。有没有办法使这项工作?


问题答案:

在wsgi文件中,你正在执行from service import application,该操作仅导入你的application方法。

更改为from service import app as application,一切将按预期工作。

在你发表评论后,我想我会扩大答案:

你的wsgi文件是python代码-你可以在此文件中包含任何有效的python代码。安装在Apache中的wsgi“处理程序”正在此文件中查找应用程序名称,它将把请求传递给该文件。Flask类实例- app = Flask(__name__)提供了这样的接口,但是由于调用app not application,因此在导入时必须为它加上别名-这就是from行的作用。

你可以-这样做很好-只需执行此操作application = Flask(__name__),然后将Apache中的wsgi处理程序指向你的service.py文件即可。如果service.py是可导入的(表示在中的某处PYTHONPATH),则不需要中间的wsgi脚本。

尽管以上方法可行,但实践不佳。wsgi文件需要Apache进程的许可才能工作。并且通常将其与实际源代码分开,后者应具有适当的权限,该源代码应位于文件系统上的其他位置。



 类似资料:
  • 问题内容: 我已经运行了一个基本的“ hello world” Flask应用程序。 我在使用Apache 2.4的Ubuntu 14.04上。我已经安装了mod_wsgi。 我创建了一个以容纳安装了flask的virtualenv创建的Python2。 但是,我希望我的flaskapp导入我编写的Python3.x模块。 我需要怎么做才能做到这一点? 我尝试创建一个并修改 但是我认为这还不够。这

  • 我正在尝试部署我构建的用于部署在Apache服务器上的Flask Web应用程序。我在Raspberry Pi 3上使用Raspbian(Jessie)OS。该应用程序在flask内置的开发Web服务器上运行完美,但我无法在Apache服务器上部署它。 这就是我所做的: conf文件为:etc/apach2/sites available/arduinoweb。形态: 中的WSGI脚本文件: Ap

  • 问题内容: 我正在尝试使用wsgi从Flask站点通过apache2运行基本的hello.py。这是我的代码: /var/www/flask_dev/hello.py /var/www/flask_dev/start.wsgi /etc/apache2/sites-available/flask_dev.conf / etc / hosts 在运行和之后,仅提供webroot中的文件。 我已经检查

  • 问题内容: 我在我的错误日志中得到了这个: ImportError:没有名为flask的模块 它看起来完全像在Django + mod_wsgi + apache中:ImportError at /没有名为djproj.urls的模块,但是我尝试了该解决方案,但它似乎不起作用…我正确地将应用程序home和parent文件夹插入到系统路径,但此错误仍然出现。 导航到我的页面仍会弹出500页。 更多信

  • 我想在Apache服务器上部署我的Flask应用程序。我在服务器上有一个帐户,并被告知“服务器可用于运行用Python编写的脚本和Web应用程序(使用django和mod_wsgi)”。 我在Windows上,要传输文件,我必须使用FTP客户端,所以我使用WinSCP。 安装mod_wsgi并不像我预期的那样简单,我无法在线获得任何清晰的文档。 因为服务器已经可以使用mod_wsgi运行Pytho

  • 问题内容: 是否可以渲染模板并在同一路径中使用? 现在,我正在使用序列化数据,但是这样做确实有些奇怪。我想使用,因为执行此操作时,我得到一个非常漂亮的输出,似乎可以更好地与之配合使用: 有什么办法可以将两者结合起来吗? 问题答案: 如果你需要在一条路由中针对不同的情况返回不同的响应对象:转换转换为有效并返回已经存在的对象,因此可以在同一路由中使用这两种方法: