Взламывание Django Admin, рычагов для входа в систему/выхода из системы

Как я добавляю рычаги к Администратору Django, такому, что я могу выполнить функцию, когда пользователь входит в систему или?

5
задан Dominic Rodger 14 June 2010 в 14:24
поделиться

2 ответа

Обновление: Этот метод устарел, начиная с Django 1.3, см. Ответ Томми ниже для использования сигналов.

Я тоже искал ответ на этот вопрос и в итоге пошел другим путем. Вы можете использовать свои собственные представления для входа и выхода, которые выполняют некоторые действия, а затем вызывают представления авторизации. Для входа в систему:

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)

И для выхода из системы:

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

Вы можете выполнять любую обработку в ваших пользовательских представлениях вместо заполнителей do_something, такую ​​как выдача сигналов, время входа и выхода из системы и т. Д.

Наконец, не забудьте обновить ваш urls.py , чтобы он указывал на ваши пользовательские представления.

Я не уверен, как пользовательский бэкэнд аутентификации может обрабатывать события выхода из системы, так как в конце концов я отказался от этого и вместо этого попробовал это. Кроме того, этот подход имеет то преимущество, что делает доступным объект request , а не только пользователя.

4
ответ дан 18 December 2019 в 10:42
поделиться

Django, к сожалению, не отправляет никаких сигналов об этих событиях .... Но вы можете создать свой собственный AuthorizationBackend, который позволит вам это сделать:

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)

Чтобы включить его, вы должны поставить AUTHENTICATION_BACKENDS = (myapp.mymodule.AuthSignalBackend ',) в вашем settings.py!

6
ответ дан 18 December 2019 в 10:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: