Django:如何在默认的身份验证/登录代码之后添加一个步骤



我正在构建我的第一个Django项目,我一直很感激现代框架中提供了身份验证步骤,但我很难了解如何/在哪里自定义登录过程,以便在后台执行额外的步骤。

我遵循了使用Django身份验证的教程,一切都很好。我制作了一个注册/login.html页面,其中包括"下一步",用于将用户带到哪里。我在mysite/urls.py:中包含了用于身份验证的Django URL

urlpatterns = [
path('familytree/', include('familytree.urls')),
path('admin/', admin.site.urls, name='admin'),
path('accounts/', include('django.contrib.auth.urls')),
]
  • 在settings.py中,我指定我希望用户在登录后转到仪表板页面:

    LOGIN_REDIRECT_URL="仪表板">

    LOGOUT_REDIRECT_URL="着陆">

问题:我想添加另一个步骤:在用户成功进行身份验证后,在新的登录表中进行记录(然后让他们继续访问仪表板(。我已经了解了如何编写自己的身份验证后端,但我认为我只想扩展现有的默认身份验证。添加此步骤的正确位置在哪里?起初,我想我可以将LOGIN_REDIRECT_URL更改为其他步骤(然后让进入仪表板(,但我想要的并不是一个URL。。。。不确定中间件是否更合适?或者,是否有某种方法可以扩展登录代码以添加其他操作?

首先,看看是否需要这样做。每次新登录时,Django都会更新用户模型上的last_login。如果这真的与你想要的不同,请继续阅读。

您可以覆盖身份验证视图并重新实现LoginView的form_valid。

首先,我们创建一个新的应用程序来处理身份验证。我们将只覆盖一位,并将其余部分委托给django.contrib.auth,但我们可能希望在未来覆盖更多,所以让我们保持整洁的组织。

因此,创建新的应用程序myauth:python ./manage.py startapp myauth

并将其添加到设置中的INSTALLED_APPS中:

INSTALLED_APPS=[
...
"myauth",
]

现在编辑标准视图.py# myauth/views.py

from django.contrib.auth.views import LoginView as BaseLoginView
from django.utils import timezone
from myauth.models import LoginAudit

class LoginView(BaseLoginView):
def form_valid(self, form):
# A redirect is just a HttpResponse, so you can grab and hold it
response = super().form_valid(form)
LoginAudit.objects.create(user=self.request.user, logged_in_at=timezone.now())
# And then release
return response

和URL#myauth/urls.py

from django.urls import path
from django.contrib.auth import views as auth_views
from . import views as my_auth_views  # for clarity
urlpatterns = (
path('login/', my_auth_views.LoginView.as_view(), name='login'),
path('logout/', auth_views.LogoutView.as_view(), name='logout'),
# ... see list at:
# https://docs.djangoproject.com/en/3.2/topics/auth/default/#using-the-views
)

最后是您的根urlconf:

#mysite/urls.py

from django.urls import include, path
urlpatterns = (
...
path('accounts/', include('myauth.urls'))
...
)

为了完整起见,LoginAudit模型:

#myauth/models.py

from django.db import models
from django.contrib.auth.models import User
class LoginAudit(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='login_events')
logged_in_at = models.DateTimeField(null=True, blank=True)
# of course you can also override LogoutView() and set this field :)
# logged_out_at = models.DateTimeField(null=True, blank=True)

最新更新