2012-06-16 20 views
8

मैं निम्नलिखित बोतल मार्गों और एक कस्टम सहायक:बोतल - कस्टम डेकोरेटर टूट जाता है मार्ग

from spots import app, db 
from flask import Response 
import simplejson as json 


def json_response(action_func): 
    def create_json_response(*args, **kwargs): 
     ret = action_func(*args, **kwargs) 
     code = 200 
     if len(ret) == 2: 
      code = ret[0] 
      resp = ret[1] 
     else: 
      resp = ret[0] 
     return Response(
      response=json.dumps(resp, indent=4), 
      status=code, 
      content_type='application/json' 
     ) 

    return create_json_response 


@app.route('/test') 
@json_response 
def test(): 
    return 400, dict(result="Test success") 


@app.route('/') 
@json_response 
def home(): 
    return 200, dict(result="Home success") 

मैं किसी GET/परीक्षण के लिए अनुरोध {"result":"Test success"} की तरह कुछ वापस जाने के लिए उम्मीद करेंगे, लेकिन यह मामला नहीं है। इसके बजाए, कोई भी अनुरोध अंतिम मार्ग से मेल खाता प्रतीत होता है, यानी home। क्यूं कर?

मुझे आश्चर्य है कि यह json_response पर अलग-अलग कॉल के बीच इन्सुलेशन की कमी के कारण होता है?

अग्रिम धन्यवाद।

+0

'कोड = ret [0]; resp = ret] [1] ''कोड, resp = ret' के रूप में neater होगा, और 'resp = = ret' ('] '('मुझे लगता है कि यह अभी भी नहीं है कि आप इसका उपयोग कैसे करना चाहते हैं , आपके फ़ंक्शन को 'वापसी {} 'की बजाय' वापसी {}, 'की आवश्यकता होगी। इसके अलावा, यह मेरे लिए सही लग रहा है। –

+4

बस एक अनुमान - फ़ंक्शन का हस्ताक्षर टूटा हुआ है, आप [functools.wraps] (http://docs.python.org/library/functools.html#functools.wraps) को आजमा सकते हैं। – Vidul

+0

मैं इस –

उत्तर

11

रूप Видул Петров कहा समाधान functools.wraps उपयोग करने के लिए है:

import functools 
def json_response(action_func): 
    @functools.wraps(action_func) 
    def create_json_response(*args, **kwargs): 
     ... 
return create_json_response 

कारण यह है कि बोतल के मार्ग प्रणाली नक्शे URL में "अंतिम बिंदु", और फिर अंतिम बिंदुओं कार्यों को देखना है। एंडपॉइंट व्यू फ़ंक्शन के __name__ विशेषता को डिफ़ॉल्ट करता है। इस मामले में सजाया गया कार्य app.route पर पारित किया गया था, इसलिए एंडपॉइंट create_json_response दोनों नियमों के लिए था और उस अंतराल के लिए परिभाषित अंतिम दृश्य दोनों मामलों में उपयोग किया गया था।

functools.wraps मूल फ़ंक्शन से __name__ (और अन्य विशेषताएँ) लेता है और इसे ठीक करता है। सजाए गए रैपर में इसका उपयोग करना हमेशा अच्छा विचार है।

+2

स्पष्टीकरण के लिए +1 –

+4

फ्लास्क के बारे में दस्तावेज़ है: http://flask.pocoo.org/docs/patterns/viewdecorators/ – zchenah

संबंधित मुद्दे