2012-06-16 30 views
8

tôi có các tuyến đường Flask sau và một helper tùy chỉnh:Flask - tùy chỉnh trang trí phá vỡ tuyến

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

Tôi mong chờ một yêu cầu GET đến/thử nghiệm để trở lại một cái gì đó giống như {"result":"Test success"} nhưng đó không phải là trường hợp. Thay vào đó, mọi yêu cầu có vẻ phù hợp với tuyến đường cuối cùng, tức là home. Tại sao?

Tôi tự hỏi điều này có phải do thiếu sự cách ly giữa các cuộc gọi khác nhau với json_response không?

Xin cảm ơn trước.

+0

'code = ret [0]; resp = ret [1] 'sẽ được lặp lại như' code, resp = ret', và 'resp = ret [0]' như 'resp, = ret' (mặc dù tôi nghĩ nó vẫn không phải là cách bạn muốn sử dụng nó , hàm của bạn sẽ cần 'return {},' chứ không phải 'return {}'). Ngoài ra, nó có vẻ đúng với tôi. –

+4

Chỉ cần đoán - chữ ký của hàm bị hỏng, bạn có thể thử [functools.wraps] (http://docs.python.org/library/functools.html#functools.wraps). – Vidul

+0

Tôi muốn xem câu trả lời cho giải pháp này –

Trả lời

11

Như Видул Петров cho biết giải pháp là sử dụng functools.wraps:

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

Lý do là bản đồ hệ thống định tuyến URL Flask để "điểm cuối", và sau đó thiết bị đầu cuối để xem chức năng. Điểm cuối mặc định là thuộc tính __name__ của hàm xem. Trong trường hợp này, chức năng trang trí được chuyển đến app.route để điểm cuối là create_json_response cho cả hai quy tắc và chế độ xem cuối cùng được xác định cho điểm cuối đó đã được sử dụng trong cả hai trường hợp.

functools.wraps mất __name__ (và các thuộc tính khác) từ chức năng gốc và sửa lỗi này. Nó luôn luôn là một ý tưởng tốt để sử dụng nó trong wrappers trang trí.

+2

+1 cho lời giải thích –

+4

bình có tài liệu về điều này: http://flask.pocoo.org/docs/patterns/viewdecorators/ – zchenah

Các vấn đề liên quan