我正在构建我的第一个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)