2010-06-14 33 views

Trả lời

4

Cập nhật: Phương pháp này đã lỗi thời kể từ Django 1.3, xem Tommy's answer bên dưới để sử dụng tín hiệu.

Tôi cũng đang tìm kiếm câu trả lời cho điều này và kết thúc bằng một cách khác. Bạn có thể sử dụng chế độ xem của riêng bạn để đăng nhập và đăng xuất, thực hiện một số thao tác và sau đó gọi chế độ xem xác thực. Để đăng nhập:

def login(request, *args, **kwargs): 
    from django.contrib.auth.forms import AuthenticationForm 
    if request.method == 'POST': 
     form = AuthenticationForm(data=request.POST) 
     if form.is_valid(): 
      # login successful 
      do_something() 
    from django.contrib.auth.views import login as authlogin 
    return authlogin(request, *args, **kwargs) 

Và đối với logout:

def logout(request, *args, **kwargs): 
    do_something() 
    from django.contrib.auth.views import logout as authlogout 
    return authlogout(request, *args, **kwargs) 

Bạn có thể làm bất cứ điều gì bạn muốn xử lý trong quan điểm tùy chỉnh của bạn ở vị trí của placeholders do_something, chẳng hạn như phát ra tín hiệu, đăng nhập đăng nhập và đăng nhập -out lần, v.v.

Cuối cùng, đừng quên cập nhật urls.py để trỏ đến chế độ xem tùy chỉnh của bạn.

Tôi không chắc làm thế nào một phụ trợ auth tùy chỉnh có thể xử lý các sự kiện đăng xuất, như tôi cuối cùng đã từ bỏ và thử thay vào đó. Ngoài ra, phương pháp này có lợi thế là cung cấp đối tượng request thay vì chỉ người dùng.

+0

Ngoài ra: để truy cập sử dụng trong giao diện đăng nhập bọc, sử dụng 'form.get_user()' , vì đối tượng 'request' sẽ trả về' AnonymousUser'. – rlafuente

+1

Là một người theo dõi muộn, và như nhận xét của Tommy, Django 1.3 đã thêm [tín hiệu đăng nhập và đăng xuất] (https://docs.djangoproject.com/en/dev/topics/auth/#login-and-logout-signals) vào ứng dụng auth, cung cấp một giải pháp đơn giản cho câu hỏi và làm cho phương thức này lỗi thời. – rlafuente

+0

Doh, chỉ cần chú ý đến Federico. Chúc mừng tất cả! – rlafuente

6

Django không buồn bã không gửi bất kỳ tín hiệu vào các sự kiện mà .... Nhưng bạn có thể làm AuthorizationBackend tùy chỉnh của riêng bạn mà cho phép bạn làm như vậy:

from django.dispatch import Signal 

post_login = Signal(providing_args=['user']) 

from django.contrib.auth.backends import ModelBackend 
from django.contrib.auth.models import User 

class AuthSignalBackend(ModelBackend): 
    def authenticate(self, username=None, password=None): 
     try: 
      user = User.objects.get(username=username) 
      if user.check_password(password): 
       post_login.send(sender=None, user=user) 
       return user 
     except User.DoesNotExist: 
      return None 


def login_handler(sender, **kwargs): 
    print "logging in..."   
post_login.connect(login_handler) 

Để kích hoạt nó, bạn phải đặt AUTHENTICATION_BACKENDS = (myapp.mymodule.AuthSignalBackend',) tại của bạn settings.py!

2

Tôi chỉ tìm thấy chủ đề này khi tìm kiếm một giải pháp để những người khác có thể quá ...

Lazerscience câu trả lời có vẻ tốt cho đến nay nhưng tôi cũng nhận thấy rằng các nhà phát triển cốt lõi Django đã chấp nhận a patch rằng sẽ gây ra một tín hiệu trên log -in/đăng xuất.

Đây có thể là giải pháp thanh lịch hơn khi nó trở thành bản phát hành chính thức của Django.

Và để tham khảo, các tài liệu trên Signals.

+1

Tín hiệu đăng nhập và đăng xuất là một phần của bản phát hành chính thức là 1.3: [Tham khảo] (https://docs.djangoproject.com/en/1.3/topics/auth/#login-and-logout-signals) – Federico

4

Kể từ Django 1.3, khung công tác xác thực tạo ra tín hiệu để đăng nhập và đăng xuất có thể được sử dụng để cung cấp móc của riêng bạn.

Bạn phải kết nối chức năng của bạn để các tín hiệu django.contrib.auth.signals.user_logged_in như:

def fun(sender, **kwargs): 
    print "do your custom stuff here" 

from django.contrib.auth.signals import user_logged_in 
user_logged_in.connect(fun)