将django.contrib.auth.views重新实现为基于类的视图。
django-class-auth-views的Python项目详细描述
安装
pip install django-class-auth-views
基本用法
与其将django.contrib.auth.login包含到urls.py中,不如使用此项目提供的一个。 urls.py:
from class_based_auth_views.views import LoginView, LogoutView urlpatterns = patterns('', url(r'^login/$', LoginView.as_view(form_class=EmailAsUsernameAuthenticationForm), name="login"), url(r'^logout/$', LogoutView.as_view(), name="logout"), )
请注意,logout视图需要POST才能真正注销。所以registration/logout.html模板 应该包含一个带有提交按钮的表单。
扩展loginview示例
既然loginview是基于一般的基于类的视图的,那么扩展起来就容易多了。假设您需要实现 使用一次性密码的两步登录过程:
from django.contrib.auth import login class PhaseOneLoginView(LoginView): def form_valid(self, form): """ Forces superusers to login in a 2 step process (One Time Password). Other users are logged in normally """ user = form.get_user() if user.is_superuser: self.save_user(user) return HttpResponseRedirect(self.get_phase_two_url()) else: login(self.request, user) return HttpResponseRedirect(self.get_success_url()) def get_phase_two_url(self): return reverse('phase_two_login') def save_user(self, user): self.request.session['otp_user'] = user class PhaseTwoLoginView(FormView): form_class = OTPTokenForm def get_user(self): return self.request.session.get('otp_user', None) def clean_user(self): if 'otp_user' in self.request.session: del self.request.session['otp_user'] def form_valid(self, form): code = form.cleaned_data.get('code') user = self.get_user() login(request, user)