Visualizações de autenticação baseada em classe

Eu sinto fortemente que a direção em que Django está se movendo está correta. Para aqueles de vocês que ainda não usam visualizações baseadas em classe (CBV), leia sobre elas e comece a usá-las. Eles realmente arrasam.

O problema é que algumas das visualizações integradas ainda são baseadas em funções. Em um esforço para fazer tudo no meu projeto mais recente 100% baseado em CBV, eu reescrevi ligeiramente alguns dos djanago.contrib.auth.views.

views.py

from django.conf import settings
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth import login as auth_login, logout as auth_logout
from django.http import HttpResponseRedirect
from django.utils.decorators import method_decorator
from django.views.decorators.debug import sensitive_post_parameters
from django.views import FormView, View

class Login(FormView):
form_class
= AuthenticationForm

def form_valid(self, form):
redirect_to
= settings.LOGIN_REDIRECT_URL
auth_login
(self.request, form.get_user())
if self.request.session.test_cookie_worked():
self.request.session.delete_test_cookie()
return HttpResponseRedirect(redirect_to)

def form_invalid(self, form):
return self.render_to_response(self.get_context_data(form=form))

@method_decorator(sensitive_post_parameters('password'))
def dispatch(self, request, *args, **kwargs):
request
.session.set_test_cookie()
return super(Login, self).dispatch(request, *args, **kwargs)

class Logout(View):
def get(self, request, *args, **kwargs):
auth_logout
(request)
return HttpResponseRedirect(settings.LOGOUT_REDIRECT_URL)

Agora você pode usar essas visualizações como qualquer outra visualização baseada em classe, por exemplo, Login.as_view()em seus padrões de url!