初始化使用 Apache 和 mod_wsgi 运行的 Flask 应用程序

Posted

技术标签:

【中文标题】初始化使用 Apache 和 mod_wsgi 运行的 Flask 应用程序【英文标题】:Initialising a Flask app running with Apache and mod_wsgi 【发布时间】:2017-07-15 07:39:39 【问题描述】:

我有一个使用 mod_wsgi 在 Apache 下运行的 Flask 应用程序。应用程序需要做一些初始化,包括在接收任何请求之前设置一些需要在请求处理程序中访问的***变量。目前这个初始化代码只是请求处理方法之前app.py中的***语句:

from flask import Flask, Response, request

<other app imports>

APP = Flask(__name__)

# initialisation code

@APP.route(<URL for request #1>)
def request_handler_1():
    # request handler code

@APP.route(<URL for request #2>)
def request_handler_2():
    # request handler code

应用程序的 wsgi 文件如下所示:

#!/usr/bin/python
import sys
import logging
logging.basicConfig(stream=sys.stderr)
sys.path.insert(0,"/var/www/myapp")

from myapp.app import APP as application
application.secret_key = <secret key>

我注意到在收到第一个请求之前不会调用初始化代码。在收到任何请求之前,如何在 mod_wsgi 加载应用程序时执行初始化代码?

【问题讨论】:

请显示您的设置代码示例。 这只是设置默认编码、定义app.py 中的请求处理程序所需的常量以及设置日志记录。 我将所有初始化代码从应用程序移动到包 init,并且从 Apache 日志中我仍然可以看到应用程序 wsgi 代码在收到第一个请求时首先被执行。当应用程序由 mod_wsgi 加载时,肯定有办法完成此操作。 【参考方案1】:

这是在第一个请求时发生的,因为默认情况下 mod_wsgi 只会在第一个请求到达时加载您的 WSGI 脚本文件。也就是说,它会延迟加载您的 WSGI 应用程序。

如果你想在进程第一次启动时强制它加载你的 WSGI 应用程序,那么你需要告诉 mod_wsgi 这样做。

如果你有这样的配置:

WSGIDaemonProcess myapp
WSGIProcessGroup myapp
WSGIApplicationGroup %GLOBAL
WSGIScriptAlias / /some/path/app.wsgi

改成:

WSGIDaemonProcess myapp
WSGIScriptAlias / /some/path/app.wsgi process-group=myapp application-group=%GLOBAL

只有在WSGIScriptAlias 上同时指定进程组和应用程序组时,而不是使用单独的指令,mod_wsgi 才能预先知道 WSGI 应用程序将在哪个进程/解释器上下文中运行,从而预加载 WSGI 脚本文件。

顺便说一句,如果您还没有使用 mod_wsgi 守护程序模式(WSGIDaemonProcess 指令),并强制使用主解释器上下文(WSGIApplicationGroup %GLOBAL 指令),那么您应该使用,因为这是首选设置。

【讨论】:

我还有一个问题 - 我已遵循您关于使用守护程序模式和使用全局应用程序组指令的建议。但我希望我的 Flask 应用程序使用多个进程或线程来处理多个请求。目前我的应用程序的conf文件如下所示:&lt;VirtualHost *:80&gt;ServerName localhostWSGIDaemonProcess myappWSGIScriptAlias / /var/www/myapp/myapp.wsgi process-group=myapp application-group=%GLOBALWSGIApplicationGroup %GLOBAL 你看过 WSGIDaemonProcess 指令的文档吗? modwsgi.readthedocs.io/en/develop/configuration-directives/…

以上是关于初始化使用 Apache 和 mod_wsgi 运行的 Flask 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

使用 mod_wsgi 和 django 运行 Apache

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

使用 Apache 和 mod_wsgi 在 Centos 上设置 Django

在生产中,Apache + mod_wsgi 还是 Nginx + mod_wsgi?

python看门狗模块在redhat服务器下不能与django/mod_wsgi一起使用

在 linux 中使用 apache 和 mod_wsgi 配置 Python flask 应用程序