2013-11-22 17 views
6

Yeni CORS özelliğini flask-restful üzerinde çalışırken, dekoratörün sadece bir dize döndürdüğünde uygulanabileceğini öğrendim. ÖrneğinTypeError flask-restful için CORS üzerinde

, modifiye Quickstart example:

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

Atmalar:

TypeError: 'dict' object is not callable

Yanlış mı yapıyorum?

cevap

4

Son zamanlarda bu konuya kendim rastladım. @MartijnPieters doğru, decorators görünümün tek yöntemlerinde çağrılabilir değil.

decorator listesini içeren soyut bir temel sınıf oluşturdum. Resource'u tüketen sınıf (flask-dinlendiriciden), aynı zamanda, dekoratör listesini gerçekten görünüme uygulayan sınıf olan temel sınıfı da devralır.

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

hayır

. Eğer ben yine de bir muhtemelen iyi bir uygulamadır bir dize veya JSON yanıt (return sağlanan dekoratör kullanabileceklerini keşfettiler

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

Bu, teşekkürler! – user3022063

+0

Ayrıca, flask_restful.utils içe aktarma cors'undan – JeffD23

0

Sarılmış işlevin dönüş değeri (bir argüman olarak) flask.make_response(); normal Flask görünümünün geri dönebileceği herhangi bir şey kabul edilebilir. Dekoratör esasen this Flask snippet ile aynıdır. Resource Flask-dinlendirici Çünkü

flask.views.MethodView bir alt sınıfıdır yapmanız gerekir gerçekten doğrudan buradan yöntemleri değil koymak dekoratörler. Decorating Views belgelendiği gibi bir listedir decorators özel sınıf özniteliği, görünüm dekoratörler listelemelisiniz:

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

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

ve Matara Matara aslında zaman dediği şey budur HelloWorld.as_view() tarafından döndürülen gerçek görünümü yöntemine görünümü geçerli olacaktır rotayı görünüme gönderir.

ne cors.crossdomain() döner zaten olmadığı, JSON kodlama için piton veriyapılarıdır uygun dönmek için yöntemler bekliyor olarak yalnızca sunucu restful.Resource memuru şaşırtmak için olacak yöntemlerle bunları doğrudan uygulamak.

+3

'Dekoratörler 'sınıf değişkenini kullanarak hala aynı hatayı alıyorum ... – user3022063

+0

@ user3022063: Gerçekten mi? Bu çok meraklıdır, çünkü bunlar "HelloWorld.as_view()" ifadesine kadar uygulanmaz, yani "get()' yerine dağıtıcıya uygulanmazlar, yani ** sonra "restful.Resource 'yöntem yanıtınızı JSON'a dönüştürdü. –

+0

Gerçekten de, ne olduğu değil, belki de flask-restful Kaynaklar Takılabilir Görünümler değil, ama farklı bir şey. – miracle2k

0

Api örneğini oluşturduktan sonra

sadece parametrelere dekoratör liste eklemek API yine de). Rotaya özgü CORS başlıklarını yapmak istiyorsanız, bu, dekoratör kullanılarak hayatı kolaylaştırır. Daha fazla bilgi için bu birleşti çekme req bakınız: https://github.com/flask-restful/flask-restful/pull/131

İşte bir örnek: auth dekoratörler ekleyerek

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') 

Eğer balon-güvenlik kullanıyorsanız, benim test bazı garip davranışları vardı. Bunun yerine assert current_user.is_authenticated'u öneririm. Kimlik bilgilerine izin veriyorsanız, CSRF'nin korunduğundan emin olun.

+0

'u ekleyin Flask-Restful'ı kullanmanın * tüm * noktası API * yanıt kodlamanızın agnostik * olmasını sağlamaktır. Flask-Restful, XML, JSON gibi bir kabul edilen yanıt kodlamasını veya istemci ile içerik görüşmesine dayanarak yapacağınız diğer her şeyi kodlama sorumluluğunu üstlenir. –