Джанго: Добавление дополнительной логики в метод входа в систему? - PullRequest
1 голос
/ 07 октября 2010

У меня есть приложение django, в представлениях которого в настоящее время используется декоратор @login_required.

Какой самый простой / лучший способ добавить дополнительную логику в систему входа в систему? Я хочу добавить дополнительные ограничения, такие как то, что их подписка на сайт все еще действует. Если срок его действия истек, я хочу направить их на страницу, на которой указано, что срок их подписки истек, и что им нужно будет заплатить снова.

В идеале сигнал был бы отличным, но я не могу найти какой-либо сигнал post_login. В противном случае я полагаю, что я могу написать собственный обработчик входа или иметь какой-то метод check_valid_user (), который я вызываю внутри каждого из моих представлений. Я не одобряю последнее, так как другой разработчик может забыть добавить его, и пользователи могут получить контент бесплатно.

Какой подход люди посоветуют?

Спасибо

1 Ответ

4 голосов
/ 07 октября 2010

Вы можете написать собственный вид входа в систему или лучше собственный authbackend (второй пример).

from django.contrib.auth.views import login as core_login

#myapp/views.py
@ratelimit_post(minutes = 1, requests = 4, key_field = 'username')

def login(request,template_name):
    from django.contrib.auth import authenticate
    user = authenticate(username='john', password='secret')
    template_name = "template_name" + "aaaaa"
    return core_login(request, template_name)


#myapp/ursl.py
#override default url
  ...
  (r'^accounts/login/$', 'myapp.views.login', {'template_name': 'profile/login.html'}), 
  ...



#backends/authemailbackend.py
from django.contrib.auth import authenticate
user = authenticate(username='john', password='secret')
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User
from django.forms.fields import email_re

class EmailBackend(ModelBackend):
    def authenticate(self, username=None, password=None):
        if email_re.search(username):
            try:
                user = User.objects.get(email=username)
                if user.check_password(password):
                    return user
            except User.DoesNotExist:
                return None
        return None 
~                                                                                                                                                                                     
~                           

#settings.py
AUTHENTICATION_BACKENDS = (
    "myapp.backends.authemailbackend.EmailBackend",
    "django.contrib.auth.backends.ModelBackend",
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...