2017-02-24 1 views
1

J'ai une application Flask fonctionnant sous Apache en utilisant mod_wsgi. L'application doit effectuer une certaine initialisation, notamment en définissant des variables de niveau supérieur qui doivent être accessibles dans les gestionnaires de requêtes, avant de recevoir des demandes. À l'heure actuelle ce code d'initialisation est seulement des déclarations de haut niveau dans app.py avant que les méthodes de traitement de la demande:Initialisation d'une application Flask fonctionnant avec Apache et mod_wsgi

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 

fichier wsgi de l'application ressemble à ceci:

#!/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> 

J'ai remarqué que le code d'initialisation n'est pas appelé avant la réception de la première demande. Comment puis-je faire exécuter le code d'initialisation lorsque l'application est chargée par mod_wsgi, avant que toutes les demandes soient reçues?

+0

Veuillez montrer un exemple de votre code d'installation. – MKesper

+0

Il s'agit simplement de définir le codage par défaut, de définir les constantes nécessaires aux gestionnaires de requêtes dans 'app.py' et de configurer la journalisation. –

+0

J'ai déplacé tout ce code d'initialisation de l'application vers le paquet init, et à partir des logs Apache je peux encore voir que le code wsgi de l'application est d'abord exécuté quand la première requête est reçue. Il doit sûrement y avoir un moyen de le faire quand l'application est chargée par mod_wsgi. –

Répondre

1

Cela se passe à la première demande car, par défaut, mod_wsgi ne chargera votre fichier de script WSGI qu'à l'arrivée de la première requête. Autrement dit, il charge paresseusement votre application WSGI.

Si vous voulez le forcer à charger votre application WSGI au démarrage du processus, vous devez indiquer à mod_wsgi de le faire.

Si vous avez la configuration comme:

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

changement à:

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

Il est seulement lorsque le groupe de processus et le groupe d'application sont indiqués sur WSGIScriptAlias, plutôt que d'utiliser les directives particulières, que mod_wsgi peut savoir à l'avance quel contexte de processus/interpréteur l'application WSGI s'exécutera et ainsi précharger le fichier de script WSGI. Par ailleurs, si vous n'utilisez pas déjà le mode démon mod_wsgi (la directive WSGIDaemonProcess) et que vous forcez le contexte de l'interpréteur principal (la directive WSGIApplicationGroup %{GLOBAL}), vous devriez l'être, car c'est la configuration préférée.

+0

J'ai une autre question - J'ai suivi votre suggestion concernant l'utilisation du mode démon et l'utilisation des directives du groupe d'applications global. Mais j'aimerais que mon application Flask gère plusieurs requêtes en utilisant plusieurs processus ou threads. Pour le moment, le fichier conf de mon application ressemble à ceci: '' 'ServerName localhost' ' WSGIDaemonProcess myapp' 'WSGIScriptAlias ​​/ /var/www/myapp/myapp.wsgi processus-groupe = application myapp- group =% {GLOBAL} '' WSGIApplicationGroup% {GLOBAL} ' –

+0

Avez-vous examiné la documentation de la directive WSGIDaemonProcess? http://modwsgi.readthedocs.io/en/develop/configuration-directives/WSGIDaemonProcess.html –