我有一个django应用程序,其视图目前使用@login_required装饰器。
为登录系统添加额外逻辑的最简单/最佳方法是什么?我想添加额外的约束,例如他们对网站的订阅仍然有效。如果它已过期,我想将它们引导到一个页面,说明他们的订阅已经过期,并且他们需要再次付款。
理想情况下,信号会很棒,但我找不到任何类型的post_login信号。如果失败,我想我的选择是编写自己的登录处理程序,或者在我的每个视图中调用某种check_valid_user()方法。我不喜欢后者,因为另一个开发者可能忘记添加它,用户可以免费获得内容。
人们会推荐什么方法?
由于
答案 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",
)