2012-01-09 20 views
7

Tôi mới để stackoverflow và để django ...django newbie: cố gắng đảo ngược auth.views.login trong login_required() trang trí

Câu hỏi ngắn gọn (xem bên dưới cho "câu hỏi dài"), đoạn mã sau trong MyApps/views.py thất bại:

from django.core.urlresolvers import reverse 
... 
@login_required(login_url=reverse('django.contrib.auth.views.login')) 
def my_view(request): 
    pass 

lỗi này là:

ViewDoesNotExist at/
tried my-view2 in module myproject.myapps.views. Error was: 'module' object has no attribute 'my-view2' 

'my-View2' được định nghĩa trong MyApps/views.py sau khi tôi xem (và được tham chiếu trong myproject/urls.py)

Tôi đoán có gì đó giống như gà và trứng ở đây nhưng tôi không thể tìm ra nơi tôi sai. tôi cố gắng thiết lập LOGIN_URL trong settings.py như thế với các lỗi tương tự:

from django.core.urlresolvers import reverse 
... 
LOGIN_URL=reverse('django.contrib.auth.views.login') 

câu hỏi Bây giờ lâu (những gì bối cảnh, lý do tại sao tôi muốn làm điều đó):

làm việc với django 1.3.1 tôi có chế độ xem sau, được bảo vệ bằng auth.decorator:

@login_required 
def my_view(request) 
    pass 

Trang trí này chuyển hướng mặc định đến/accounts/login (nó hoạt động và điều đó tốt cho tôi).

Sử dụng máy chủ developpement toàn bộ các url có liên quan đến localhost:/

Trong production server (sử dụng wsgi), toàn bộ các url có liên quan đến my-server:/path1/ Đây là do cấu hình apache mà nói điều gì đó như: WSGIScriptAlias ​​/ path1 /var/www/path/to/script.wsgi

Và điều đó tốt cho tôi.

Tất cả các url được xác định trong myproject/urls.py có liên quan tự động với đường dẫn mới này, do đó, nhờ django, tất cả trang web của tôi đang làm việc trên "root html" mới này.

Nhưng quan điểm bảo vệ của tôi vẫn chuyển hướng đến my-server:/tài khoản/đăng nhập/thay o my-server:/path1/tài khoản/Đăng nhập

cho đến nay tôi làm cho nó hoạt sử dụng settings.py

LOGIN_URL=/path1/accounts/login/ 

hoặc sử dụng tham số LOGIN_URL của "login_required" trang trí:

@login_required(login_url="/path1/accounts/login/") 

Nhưng tôi muốn rằng quan điểm đăng nhập này có liên quan đến các con đường trang web toàn bộ mà không cần cấu hình "path1" trong cả hai apache và django/settings.py

Tôi không cảm thấy việc sử dụng ngược lại trong settings.py là điều đúng để làm cũng không sử dụng nó trong trình xem trang trí. Nhưng cho đến nay tôi không biết cách xử lý này ...

+0

u có thể đăng url của bạn không? –

+0

bạn có thực sự có chế độ xem được định nghĩa là 'my-view2' không? Nó không phải là một tên trăn hợp lệ, '-' là một toán tử. Nếu bạn làm thế, bạn nên đổi tên nó thành 'my_view2'. – brutasse

Trả lời

13

Bạn không thể sử dụng reverse trong trang trí login_required hoặc trong settings.py, vì cấu hình URL chưa được tải tại thời điểm cài đặt/lượt xem đã nhập.

Trong Django 1.4+, bạn có thể sử dụng reverse_lazy.Trên các phiên bản trước của Django, bạn có thể quay lại reverse_lazy hoặc xem câu trả lời của tôi cho câu hỏi reverse url mapping in settings.

Trong Django 1.5+, cài đặt LOGIN_URL chấp nhận các mẫu url được đặt tên. Ví dụ, nếu bạn đặt tên cho mẫu URL đăng nhập của bạn 'đăng nhập', sau đó bạn chỉ có thể làm:

LOGIN_URL = 'login' 
+0

Cảm ơn câu trả lời chính xác của bạn! tùy chọn bạn đưa ra là thú vị. Biết rằng điều đó không thể xảy ra trong phiên bản 1.3.1. Tôi sẽ tiết kiệm thời gian để nó hoạt động! – rhn

+0

Đây là đoạn trích cho các phiên bản trước: http://djangosnippets.org/snippets/499/ –

+0

Cảm ơn bạn. Tôi chạy vào vấn đề này làm cho trang trí của riêng tôi và đã phải chắc chắn rằng nó không buộc đánh giá của 'reverse_lazy (...)' quá sớm hoặc. – cloudrave

0

sau ngược() chức năng, tôi tìm ra một cách khác để đạt được mục tiêu của tôi:

Tôi ok với việc sử dụng các url chuẩn (tài khoản/đăng nhập, v.v.) Tôi chỉ muốn thêm phần gốc tài liệu html mà không phải là "/" trong trường hợp của tôi.

từ thử nghiệm của tôi, điều này không làm việc trong settings.py (đó là quá sớm ở bước này?)

trong views.py tôi:

@login_required(login_url="/path1/accounts/login/") 

trở thành

from django.core.urlresolvers import get_script_prefix 
@login_required(login_url=get_script_prefix() + "accounts/login/") 
+1

Bạn đang mã hóa cứng URL, điều này vi phạm DRY! –

0

sử dụng reverse_lazy()

documents nói:

Tính năng này hữu ích khi bạn cần sử dụng URL đảo ngược trước khi URLConf của dự án được tải. Một số trường hợp phổ biến mà chức năng này là cần thiết:

  • cung cấp URL đảo ngược làm thuộc tính url của chế độ xem chung dựa trên lớp học.
  • cung cấp URL được đảo ngược cho trang trí (chẳng hạn như đối số login_url cho trang trí django.contrib.auth.decorators.permission_required()).
  • cung cấp URL được đảo ngược làm giá trị mặc định cho thông số trong chữ ký của hàm.
Các vấn đề liên quan