2013-11-22 4 views
6

flask-restful에서 새로운 CORS 기능을 시도하는 동안 함수가 문자열을 반환하는 경우에만 데코레이터를 적용 할 수 있다는 것을 알았습니다. 예를 들어플라스크에 편안함을주는 CORS의 TypeError

, 수정은 Quickstart example :

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

예외 :

TypeError: 'dict' object is not callable

내가 뭔가 잘못하고 있습니까?

답변

4

나는 최근에이 문제를 직접 경험했습니다. @MartijnPieters가 정확합니다. decorators은보기의 단일 메소드에서 호출 할 수 없습니다.

목록이 포함 된 추상 기본 클래스를 만들었습니다. Resource (flask-restful에서)을 소비하는 클래스는 뷰에 실제로 데코레이터 목록을 적용하는 클래스 인 기본 클래스를 상속받습니다.

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

아니

. 당신은 내가 당신은 아직도 당신이 대한 아마 좋습니다 문자열 또는 JSON 응답을 (반환 제공하는 장식을 사용할 수 있다는 것을 발견

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

감사합니다. – user3022063

+0

또한,'flask_restful.utils import cors'에서 추가하십시오. – JeffD23

0

랩핑 된 함수의 리턴 값은 하나의 인수로 flask.make_response()으로 전달됩니다. 보통 플라스크 뷰를 반환 할 수있는 것은 허용됩니다. 데코레이터는 기본적으로 this Flask snippet과 같습니다. Resource 플라스크-편안한 때문에

flask.views.MethodView의 서브 클래스입니다 당신이해야 정말 바로 여기에 방법에 대한 하지 넣어 장식. Decorating Views에 설명 된대로 당신은 목록입니다 decorators 특별한 클래스 속성에서보기 장식을 나열해야합니다 :

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

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

와 플라스크 플라스크 실제로 통화가 무엇 HelloWorld.as_view()에 의해 반환되는 실제보기 방법에보기를 적용합니다 보기로가는 경로를 파견하는 것.

메소드에 직접 적용하면 이 반환하지 않는 JSON 인코딩에 적합한 Python 데이터 구조를 반환하는 메소드를 예상하므로 서버 측에만 restful.Resource 디스패처를 혼동시킬 수 있습니다.

+3

'decorators' 클래스 변수를 사용하면 여전히 같은 오류가 발생합니다 ... – user3022063

+0

@ user3022063 : 정말요? 그것은 HelloWorld.as_view()가 호출 될 때까지 적용되지 않기 때문에 매우 흥미 롭습니다. 즉, get()은 적용되지 않지만 dispatcher에는 적용되므로 ** restful.Resource '메소드 응답을 JSON으로 변환했습니다. –

+0

실제로 플라스크에 안성맞춤 인 자원은 플러그 식보기가 아니기 때문에 그럴 수도 있습니다. – miracle2k

0

이 API 인스턴스를 만든 후

는 매개 변수로 장식 목록을 추가 API 어쨌든). 데코레이터를 사용하면 경로 별 CORS 헤더를 수행하려는 경우이 작업이 훨씬 쉽습니다. 자세한 내용은이 합병 풀 REQ를 참조하십시오 https://github.com/flask-restful/flask-restful/pull/131

다음은 예입니다 : 인증의 장식을 추가

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

당신이 플라스크 보안을 사용하는 경우, 내 테스트에서 몇 가지 이상한 행동을했다. 대신 assert current_user.is_authenticated을 권하고 싶습니다. 자격 증명을 허용하는 경우 CSRF를 보호해야합니다.

+0

Flask-Restful을 사용하는 전체 * 포인트 *는 API * 응답 인코딩 불가 지 *를 ​​만드는 것입니다. Flask-Restful은 클라이언트와의 컨텐츠 협상을 기반으로 XML, JSON 또는 기타 가르치는 다른 것과 같은 허용 된 응답 인코딩으로 인코딩 할 책임이 있습니다. –

관련 문제