Erreur «is_xhr» étrange lors du déploiement de l'application Flask sur Heroku

29

J'ai une application flask que j'ai déployée sur Heroku, l'un des itinéraires est le suivant

def get_kws():
    seed_kw = request.json['firstParam']
    audience_max = request.json['secondParam']
    interest_mining_service = InterestMiningService(seed_kw, audience_max)
    query_result = interest_mining_service.query_keyword().tolist()
    if seed_kw in query_result:
        print ("yes")
        return jsonify(
            {
             'keyword_data' : interest_mining_service.find_kws().to_json(orient='records'),
             'query_results': query_result
            }
        )

Lorsque je teste ce point de terminaison localement, je n'ai aucun problème lors de l'envoi de requêtes POST et GET à ce point de terminaison. Cependant, lorsque je déploie sur Heroku, j'obtiens l'erreur suivante:

File "/app/server/controller.py", line 24, in get_kws
2020-02-08T22:31:05.893850+00:00 app[web.1]: 'query_results': query_result
2020-02-08T22:31:05.893850+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/flask/json.py", line 298, in jsonify
2020-02-08T22:31:05.893851+00:00 app[web.1]: if current_app.config['JSONIFY_PRETTYPRINT_REGULAR'] and not request.is_xhr:
2020-02-08T22:31:05.893851+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/werkzeug/local.py", line 347, in __getattr__
2020-02-08T22:31:05.893852+00:00 app[web.1]: return getattr(self._get_current_object(), name)
2020-02-08T22:31:05.893858+00:00 app[web.1]: AttributeError: 'Request' object has no attribute 'is_xhr'

Je n'ai jamais vu cette erreur Request object has no attribute 'is_xhr'auparavant et elle ne semble se produire que lorsque je me déploie sur Heroku. Des conseils sur ce que je devrais examiner?

Il ne semble pas non plus y avoir de problème avec la clé json keyword_data- le problème semble limité à query_resultsce qui est une liste.

Tom Jackson
la source

Réponses:

39

La Werkzeugbibliothèque (dépendance de Flask) a récemment reçu une mise à jour majeure (0.16.1 -> 1.0.0) et il semble que Flask(<= 0.12.4) ne la limite pas.

Vous avez 2 options:

  • Restez avec votre version actuelle de Flask et limitez la version de Werkzeug qui est récupérée explicitement dans setup.py ou requirements.txt ( werkzeug<1.0) de votre application

  • Mise à niveau vers une version récente de Flask (> = 1.0.0), qui fonctionne correctement avec le dernier Werkzeug

bagerard
la source
0

J'ai aussi fait face à ce problème.

Juste temporairement corrigé en vérifiant directement l'en-tête de la demande

request.headers.get("X-Requested-With") == "XMLHttpRequest"

pas sûr de cette aide ...

Jing
la source