2017-08-06 3 views
0

J'utilise Flask-Mobility pour afficher différents modèles en fonction du navigateur.Flask-Mobility échoue avec Gunicorn

Tout a bien fonctionné sur ma machine locale, mais sur le serveur, j'obtiens AttributeError: 'Request' object has no attribute 'MOBILE' J'utilise gunicorn.

Lorsque je teste l'application en l'exécutant uniquement en tant qu'instance python, sans gunicorn et sans opérateur, etc., cela fonctionne très bien. Je vois que Flask-Mobility fait un @app.before_request Je devine que ceci n'est pas traité quand j'utilise Gunicorn.

La ligne qui échoue est le suivant:

if request.MOBILE == True: 

Voici la pleine retraçage:

ERROR in app: Exception on /content/3/intro-to-genetics-1/1/baby-ball [GET] 
Traceback (most recent call last): 
    File "virtualenv/lib/python3.5/site-packages/flask/app.py", line 1982, in wsgi_app 
    response = self.full_dispatch_request() 
    File "virtualenv/lib/python3.5/site-packages/flask/app.py", line 1614, in full_dispatch_request 
    rv = self.handle_user_exception(e) 
    File "virtualenv/lib/python3.5/site-packages/flask/app.py", line 1517, in handle_user_exception 
    reraise(exc_type, exc_value, tb) 
    File "virtualenv/lib/python3.5/site-packages/flask/_compat.py", line 33, in reraise 
    raise value 
    File "virtualenv/lib/python3.5/site-packages/flask/app.py", line 1612, in full_dispatch_request 
    rv = self.dispatch_request() 
    File "virtualenv/lib/python3.5/site-packages/flask/app.py", line 1598, in dispatch_request 
    return self.view_functions[rule.endpoint](**req.view_args) 
    File "virtualenv/lib/python3.5/site-packages/flask_mobility/decorators.py", line 35, in wrapper 
    return f(*args, **kwargs) 
File "app/main/views.py", line 333, in direct_screen_nav 
    if request.MOBILE == True: 
File "virtualenv/lib/python3.5/site-packages/werkzeug/local.py", line 347, in __getattr__ 
    return getattr(self._get_current_object(), name) 
AttributeError: 'Request' object has no attribute 'MOBILE' 
+0

Pouvez-vous ajouter votre retraçage complet? –

+0

Pouvez-vous ajouter votre pièce de code liée? – Nabin

Répondre

0

J'ai compris ce qui était faux. Le problème n'était pas avec gunicorn, c'était avec Blueprints. J'ai modifié la fonction de Flask-MobilityMobility__init__ prendre comme argument optionnel tout Blueprint et a ajouté à def init_app():

if blueprint is not None: 
    @blueprint.before_app_request 
    def before_app_request(): 
     ctx = stack.top 
     if ctx is not None and hasattr(ctx, 'request'): 
      self.process_request(ctx.request) 

Ainsi, au lieu de initialisant la bibliothèque comme Mobility(app), j'INITIALISER avec Mobility(app, blueprint) et tout fonctionne bien. Pas tout à fait sûr pourquoi cela fonctionnait sans gunicorn avant, mais, c'est probablement parce que j'utilisais le même nom dans deux contextes différents et par hasard, cela a fonctionné.