La réponse dépend de la manière dont vous diffusez cette application.
Sous-monté à l'intérieur d'un autre conteneur WSGI
En supposant que vous allez exécuter cette application à l'intérieur d'un conteneur WSGI (mod_wsgi, uwsgi, gunicorn, etc.); vous devez réellement monter, à ce préfixe, l'application en tant que sous-partie de ce conteneur WSGI (tout ce qui parle WSGI fera l'affaire) et définir votre APPLICATION_ROOT
valeur de configuration sur votre préfixe:
app.config["APPLICATION_ROOT"] = "/abc/123"
@app.route("/")
def index():
return "The URL for this page is {}".format(url_for("index"))
# Will return "The URL for this page is /abc/123/"
La définition de la APPLICATION_ROOT
valeur de configuration limite simplement le cookie de session de Flask à ce préfixe d'URL. Tout le reste sera automatiquement géré pour vous par les excellentes capacités de gestion WSGI de Flask et Werkzeug.
Un exemple de sous-montage correct de votre application
Si vous n'êtes pas sûr de la signification du premier paragraphe, jetez un œil à cet exemple d'application avec Flask monté à l'intérieur:
from flask import Flask, url_for
from werkzeug.serving import run_simple
from werkzeug.wsgi import DispatcherMiddleware
app = Flask(__name__)
app.config['APPLICATION_ROOT'] = '/abc/123'
@app.route('/')
def index():
return 'The URL for this page is {}'.format(url_for('index'))
def simple(env, resp):
resp(b'200 OK', [(b'Content-Type', b'text/plain')])
return [b'Hello WSGI World']
app.wsgi_app = DispatcherMiddleware(simple, {'/abc/123': app.wsgi_app})
if __name__ == '__main__':
app.run('localhost', 5000)
Demande de proxy vers l'application
Si, en revanche, vous exécutez votre application Flask à la racine de son conteneur WSGI et lui transmettez les requêtes par proxy (par exemple, si elle est FastCGI, ou si nginx proxy_pass
envoie des requêtes pour un sous-point de terminaison sur votre serveur uwsgi
/ gevent
serveur autonome, vous pouvez soit:
- Utilisez un plan, comme le souligne Miguel dans sa réponse .
- ou utilisez
DispatcherMiddleware
from werkzeug
(ou la réponsePrefixMiddleware
de su27 de from ) pour sous-monter votre application sur le serveur WSGI autonome que vous utilisez. (Voir un exemple de sous-montage correct de votre application ci-dessus pour le code à utiliser).
flask.Flask#create_url_adapter
etwerkzeug.routing.Map#bind_to_environ
il semble que cela devrait fonctionner - comment exécutiez- vous le code? (L'application doit en fait être montée sur le sous-chemin dans un environnement WSGI poururl_for
renvoyer la valeur attendue.)DispatcherMiddleware
approche, lors de l'exécution de flask par lui-même. Je n'arrive pas à faire fonctionner cela en courant derrière Gunicorn.uwsgi -s /tmp/yourapplication.sock --manage-script-name --mount /yourapplication=myapp:app
. détail se référer à (document uwsgi) [ flask.pocoo.org/docs/1.0/deploying/uwsgi/]Vous pouvez mettre vos itinéraires dans un plan:
Ensuite, vous enregistrez le plan avec l'application en utilisant un préfixe:
la source
app.register_blueprint
et entre son enregistrement lorsque vous instanciez l'objet Blueprint ci-dessus, en passanturl_prefix='/abc/123
? Je vous remercie!register_blueprint
appel donne à l'application la liberté de «monter» le plan où elle le souhaite, ou même de monter le même plan plusieurs fois sur différentes URL. Si vous mettez le préfixe dans le plan lui-même, vous facilitez les choses pour l'application, mais vous avez moins de flexibilité.Vous devez noter que le
APPLICATION_ROOT
n'est PAS à cette fin.Tout ce que vous avez à faire est d'écrire un middleware pour apporter les modifications suivantes:
PATH_INFO
pour gérer l'url préfixée.SCRIPT_NAME
pour générer l'url préfixée.Comme ça:
Enveloppez votre application avec le middleware, comme ceci:
Visite
http://localhost:9010/foo/bar
,Vous obtiendrez le bon résultat:
The URL for this page is /foo/bar
Et n'oubliez pas de définir le domaine du cookie si vous en avez besoin.
Cette solution est donnée par l'essentiel de Larivact . Ce
APPLICATION_ROOT
n'est pas pour ce travail, même si cela semble l'être. C'est vraiment déroutant.la source
APPLICATION_ROOT
n'est pas pour ce travail" - c'est là que je me suis trompé. Je souhaiteBlueprint
leurl_prefix
paramètre etAPPLICATION_ROOT
ont été combinés par défaut, afin que je puisse avoir desAPPLICATION_ROOT
URL de portée pour toute l'application, et desurl_prefix
URL de portéeAPPLICATION_ROOT
juste pour le plan individuel. SighAPPLICATION_ROOT
.__call__
méthode: enresponse = Response('That url is not correct for this application', status=404) return response(environ, start_response)
utilisantfrom werkzeug.wrappers import BaseResponse as Response
C'est plus une réponse python qu'une réponse Flask / werkzeug; mais c'est simple et ça marche.
Si, comme moi, vous souhaitez que les paramètres de votre application (chargés à partir d'un
.ini
fichier) contiennent également le préfixe de votre application Flask (ainsi, ne pas avoir la valeur définie lors du déploiement, mais pendant l'exécution), vous pouvez opter pour ce qui suit:On peut soutenir que c'est quelque peu hackish et repose sur le fait que la fonction de route Flask nécessite un
route
comme premier argument positionnel.Vous pouvez l'utiliser comme ceci:
NB: Cela ne vaut rien qu'il soit possible d'utiliser une variable dans le préfixe (par exemple en la définissant sur
/<prefix>
), puis de traiter ce préfixe dans les fonctions que vous décorez avec votre@app.route(...)
. Si vous le faites, vous devez évidemment déclarer leprefix
paramètre dans votre (vos) fonction (s) décorée (s). En outre, vous souhaiterez peut-être vérifier le préfixe soumis par rapport à certaines règles et renvoyer un 404 si la vérification échoue. Afin d'éviter une réimplémentation personnalisée 404, veuillezfrom werkzeug.exceptions import NotFound
et ensuiteraise NotFound()
si la vérification échoue.la source
Blueprint
. Merci d'avoir partagé!Donc, je pense qu'une réponse valable à cela est: le préfixe doit être configuré dans l'application serveur réelle que vous utilisez lorsque le développement est terminé. Apache, nginx, etc.
Cependant, si vous souhaitez que cela fonctionne pendant le développement lors de l'exécution de l'application Flask dans le débogage, jetez un œil à cet essentiel .
Flacon
DispatcherMiddleware
à la rescousse!Je vais copier le code ici pour la postérité:
Maintenant, lors de l'exécution du code ci-dessus en tant qu'application Flask autonome,
http://localhost:5000/spam/
s'afficheHello, world!
.Dans un commentaire sur une autre réponse, j'ai exprimé que je souhaitais faire quelque chose comme ceci:
S'appliquant
DispatcherMiddleware
à mon exemple artificiel:la source
Une autre façon complètement différente est avec mountpoints dans
uwsgi
.À partir de la documentation sur l' hébergement de plusieurs applications dans le même processus ( lien permanent ).
Dans votre
uwsgi.ini
vous ajoutezSi vous n'appelez pas votre fichier
main.py
, vous devez modifier lemount
et lemodule
Votre
main.py
pourrait ressembler à ceci:Et une configuration nginx (encore une fois pour l'exhaustivité):
L'appel maintenant
example.com/foo/bar
s'affichera/foo/bar
comme renvoyé par flaskurl_for('bar')
, car il s'adapte automatiquement. De cette façon, vos liens fonctionneront sans problèmes de préfixe.la source
la source
J'avais besoin de ce qu'on appelle un "context-root". Je l'ai fait dans le fichier conf sous /etc/httpd/conf.d/ en utilisant WSGIScriptAlias:
myapp.conf:
Alors maintenant, je peux accéder à mon application en tant que: http: // localhost: 5000 / myapp
Voir le guide - http://modwsgi.readthedocs.io/en/develop/user-guides/quick-configuration-guide.html
la source
Ma solution où les applications flask et PHP coexistent nginx et PHP5.6
GARDER Flask à la racine et PHP dans les sous-répertoires
Ajouter 1 ligne
UTILISEZ DES EMPLACEMENTS IMPRIMÉS pour PHP et laissez FLASK rester à la racine
LIRE attentivement https://www.digitalocean.com/community/tutorials/understanding-nginx-server-and-location-block-selection-algorithms
Nous devons comprendre la correspondance d'emplacement (aucun): si aucun modificateur n'est présent, l'emplacement est interprété comme une correspondance de préfixe. Cela signifie que l'emplacement indiqué sera comparé au début de l'URI de la demande pour déterminer une correspondance. =: Si un signe égal est utilisé, ce bloc sera considéré comme une correspondance si l'URI de la demande correspond exactement à l'emplacement indiqué. ~: Si un modificateur tilde est présent, cet emplacement sera interprété comme une correspondance d'expression régulière sensible à la casse. ~ *: Si un modificateur tilde et astérisque est utilisé, le bloc d'emplacement sera interprété comme une correspondance d'expression régulière insensible à la casse. ^ ~: Si un modificateur carat et tilde est présent et si ce bloc est sélectionné comme meilleure correspondance d'expression non régulière, la correspondance d'expression régulière n'aura pas lieu.
L'ordre est important, d'après la description de «location» de nginx:
Pour trouver l'emplacement correspondant à une demande donnée, nginx vérifie d'abord les emplacements définis à l'aide des chaînes de préfixe (emplacements de préfixe). Parmi eux, l'emplacement avec le préfixe correspondant le plus long est sélectionné et mémorisé. Ensuite, les expressions régulières sont vérifiées, dans l'ordre de leur apparition dans le fichier de configuration. La recherche d'expressions régulières se termine sur la première correspondance et la configuration correspondante est utilisée. Si aucune correspondance avec une expression régulière n'est trouvée, la configuration de l'emplacement du préfixe mémorisé précédemment est utilisée.
Ça veut dire:
la source
Pour les personnes toujours aux prises avec cela, le premier exemple fonctionne, mais l'exemple complet est ici si vous avez une application Flask qui n'est pas sous votre contrôle:
la source