Django:为登录方法添加额外的逻辑?

时间:2010-10-07 14:20:38

标签: django

我有一个django应用程序,其视图目前使用@login_required装饰器。

为登录系统添加额外逻辑的最简单/最佳方法是什么?我想添加额外的约束,例如他们对网站的订阅仍然有效。如果它已过期,我想将它们引导到一个页面,说明他们的订阅已经过期,并且他们需要再次付款。

理想情况下,信号会很棒,但我找不到任何类型的post_login信号。如果失败,我想我的选择是编写自己的登录处理程序,或者在我的每个视图中调用某种check_valid_user()方法。我不喜欢后者,因为另一个开发者可能忘记添加它,用户可以免费获得内容。

人们会推荐什么方法?

由于

1 个答案:

答案 0 :(得分:4)

您可以编写自己的登录视图或更好的自己的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",
)