2013-11-22 3 views
6

Während ich die neue CORS-Funktion auf Flasch-Restful versuchte, fand ich heraus, dass der Dekorator nur angewendet werden kann, wenn die Funktion eine Zeichenfolge zurückgibt.TypeError auf CORS für flask-restful

Zum Beispiel Modifizieren der Quickstart example:

class HelloWorld(restful.Resource): 
    @cors.crossdomain(origin='*') 
    def get(self): 
     return {'hello': 'world'} 

Würfe:

TypeError: 'dict' object is not callable

Mache ich etwas falsch?

Antwort

4

Ich bin kürzlich selbst auf dieses Problem gestoßen. @MartijnPieters ist korrekt, decorators kann nicht auf einzelne Methoden der Ansicht aufgerufen werden.

Ich erstellte eine abstrakte Basisklasse, die die decorator-Liste enthielt. Die Klasse, die Resource (aus Flasch-Restful) verbraucht, erbt auch die Basisklasse. Dies ist die Klasse, die die Decorator-Liste tatsächlich auf die Ansicht anwendet.

class AbstractAPI(): 
     decorators = [cors.crossdomain(origin='*')] 

    class HelloWorld(restful.Resource, AbstractAPI): 
     #content 

Nö.

fügen Sie einfach die Dekorateur Liste der Parameter, nachdem Sie die Api-Instanz erstellen

api = Api(app) 
api.decorators=[cors.crossdomain(origin='*')] 
+0

Das funktioniert, danke! – user3022063

+0

Fügen Sie außerdem 'from flask_restful.utils import cors' hinzu. – JeffD23

0

Der Rückgabewert der umbrochenen Funktion wird (als ein Argument) an flask.make_response() übergeben; alles, was eine normale Flask-Ansicht zurückgeben kann, ist akzeptabel. Der Dekorator ist im Wesentlichen der gleiche wie this Flask snippet.

Da der Kolben-erholsamen Resource ist eine Unterklasse von flask.views.MethodView Sie sollten wirklich nicht Put-Dekorateure direkt auf die hier Methoden. Wie in Decorating Views dokumentiert sollten Sie Ansicht Dekorateure in einer Sonderklasse Attributliste, decorators die eine Liste ist:

class HelloWorld(restful.Resource): 
    decorators = [cors.crossdomain(origin='*')] 

    def get(self): 
     return {'hello': 'world'} 

und Kolben wird der Blick auf die aktuelle Ansicht Methode von HelloWorld.as_view(), zurück anzuwenden, die ist, was Flask tatsächlich aufruft, wenn Versand der Route zur Ansicht.

Anwenden von ihnen direkt an die Methoden werden nur Server den restful.Resource Dispatcher zu verwechseln, da es Methoden erwartet Python Datenstrukturen geeignet für die Codierung zu JSON zurückzukehren, das ist nicht das, was cors.crossdomain() kehrt sowieso.

+3

Mit der Klassenvariablen 'Decorators' bekomme ich immer noch den gleichen Fehler ... – user3022063

+0

@ user3022063: Wirklich? Das ist sehr merkwürdig, denn diese werden erst angewendet, wenn 'HelloWorld.as_view()' aufgerufen wird, was bedeutet, dass sie nicht auf 'get()' sondern auf den Dispatcher angewendet werden, also ** nach ** 'restful.Resource 'hat Ihre Methodenantwort in JSON umgewandelt. –

+0

In der Tat, das ist nicht, was passiert, vielleicht weil Kolben-erholsame Ressourcen nicht Pluggable Views, sondern etwas anderes. – miracle2k

0

ich, dass Sie immer noch fand den Dekorateur verwenden, können Sie einen String oder JSON Antwort zurückgeben vorgesehen (was für eine wahrscheinlich gute Praxis API sowieso). Dies ist wichtig, wenn Sie routenspezifische CORS-Header erstellen möchten. Die Verwendung des Dekorators erleichtert das Leben erheblich. Sehen Sie diese fusionierte Pull req für weitere Informationen: https://github.com/flask-restful/flask-restful/pull/131

Hier ist ein Beispiel:

from . import app 
from flask_restful import reqparse, abort, Api, Resource 
from flask.ext.cors import cross_origin 
from datetime import datetime 
from flask import jsonify 

api = Api(app) 


class DateTime(Resource): 
    @cross_origin(origins="http://localhost:63342*") 
    def get(self): 
     return jsonify({'DateTime': str(datetime.today())}) 

api_root = '/api/v1/' 
api.add_resource(DateTime, api_root + 'DateTime') 

Wenn Sie Kolben-Sicherheit verwenden, das Hinzufügen Auth Dekorateure in meinen Tests einige seltsame Verhalten hatte. Ich empfehle stattdessen assert current_user.is_authenticated. Wenn Sie Anmeldeinformationen zulassen, stellen Sie sicher, dass CSRF geschützt ist.

+0

Der ganze * Punkt * der Verwendung von Flask-Restful besteht darin, Ihre API * response encoding agnostic * zu machen. Flask-Restful übernimmt die Verantwortung für die Kodierung zu einer akzeptierten Antwortkodierung, wie z. B. XML, JSON oder etwas anderem, auf das Sie es basierend auf der Inhaltsverhandlung mit dem Kunden anwenden. –