2012-02-22 19 views
9

tôi đã thiết lập tìm kiếm một cái gì đó như thế này:Tại sao trang trí xem Django của tôi không nhận được yêu cầu được chuyển đến nó?

def foo_decorator(function): 
    @wraps(function) 
    def decorator(*args, **kwargs): 
     print kwargs 
     return function(*args, **kwargs) 

    return decorator 

@foo_decorator 
def analytics(request, page_id, promotion_id): 
    pass 

xuất ra:

{'promotion_id': u'11','page_id': u'119766481432558'} 

Tại sao trang trí của tôi không nhận được request truyền cho nó?

Trả lời

22

request không phải là đối số từ khóa cho chế độ xem, đó là đối số vị trí đầu tiên. Bạn có thể truy cập nó dưới dạng args[0].

def foo_decorator(function): 
    @wraps(function) 
    def decorator(*args, **kwargs): 
     print args[0] 
     return function(*args, **kwargs) 

    return decorator 

tôi sẽ khuyên bạn nên thay đổi chữ ký chức năng bao gồm request một cách rõ ràng:

def foo_decorator(function): 
    @wraps(function) 
    def decorator(request, *args, **kwargs): 
     print request 
     return function(request, *args, **kwargs) 

    return decorator 
+0

Tôi nghĩ rằng bạn đang thiếu ** trước kwargs khi gọi 'chức năng' –

+0

Cảm ơn Patrik, đã được khắc phục ngay bây giờ. – Alasdair

4

Yêu cầu không được chuyển làm đối số từ khóa. Đó là số args, không phải là kwargs.

+1

Hah, tôi chỉ nhận ra điều này sau khi trải qua một giờ tốt lẫn lộn. Bóng đèn cuối cùng cũng bật lên, 'args' có thể chứa những thứ không có trong' kwargs'! Làm thế nào ngu ngốc của tôi. Cảm ơn! –

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