2009-05-20 28 views
16

Có bất kỳ sự khác biệt nào trong việc sử dụng trình trang trí login_required trong urls.py và trong views.py không? Nếu tôi đặt dòng này:decor_required decorator trong django

url(r'^add/$', login_required(views.add_media), name = 'add_media_action') 

vào urls.py tôi sẽ đạt được hiệu quả tương tự như trang trí add_media chức năng trong views.py:

@login_required 
def add_media(request): 
    ... 

Trả lời

29

Trong Python, một trang trí là một hàm mang theo một hàm làm đối số và trả về một hàm được trang trí. Cú pháp @login_required có thể được dịch sang:

def add_media(request): 
    ... 
add_media = login_required(add_media) 

Vì vậy, nếu bạn áp dụng trang trí bằng tay (như trong đoạn đầu tiên của bạn), nó sẽ tạo ra tác dụng tương tự.

Cách tiếp cận trong đoạn mã đầu tiên của bạn hữu ích nếu bạn muốn sử dụng cả phiên bản trang trí và chưa được trang trí của chế độ xem.

+9

+1 đặc biệt để lưu ý trong câu cuối cùng. –

3

Có, chúng giống nhau. Trang trí là cú pháp đường cho gói một chức năng trong một số khác. Vì vậy, trong cả hai trường hợp, bạn đang gói login_required xung quanh views.add_media.

8

Như những người khác đã chỉ ra, chúng thực sự tương đương. Hai điều bổ sung cần xem xét nếu bạn muốn thực hiện phương pháp này:

  1. Làm điều đó trong yêu cầu đăng nhập từ mã nơi trang trí được xác định. Bởi vì điều này, bạn (hoặc người bảo trì khác) có thể quên rằng chức năng đã được trang trí.

  2. Vì bạn đang áp dụng bảo mật trong tệp url, có thể ai đó nhầm lẫn thêm URL khác trỏ đến cùng chức năng, nhưng quên bỏ chức năng trong login_required, dẫn đến lỗ hổng bảo mật.

Hy vọng điều đó sẽ hữu ích.

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