[目前,我有一个用户模型,可以根据其会话访问与帐户相关的信息。我正在使用django auth PasswordResetView
。如果用户忘记了密码,则使用密码重置表单来重置密码。但是,该django视图在用户已经登录时也可以访问。如何限制用户访问该页面。我找不到该问题的解决方案,因为它是一个抽象的概念,在我的views.py
文件中没有任何内容。
这是我的urls.py文件的样子:
from django.contrib import admin
from django.urls import path, include
from django.contrib.auth import views as auth_views
from users import views as user_views
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('mainapp.urls')),
path('login/', auth_views.LoginView.as_view(template_name='users/login.html'), name="login"),
path('logout/', auth_views.LogoutView.as_view(template_name='users/logout.html'), name="logout"),
path('password_reset/', auth_views.PasswordResetView.as_view(template_name='users/password_reset.html'), name="password_reset"),
path('password_reset/done/', auth_views.PasswordResetDoneView.as_view(template_name='users/password_reset_done.html'), name="password_reset_done"),
path('password_reset_confirm/<uidb64>/<token>', auth_views.PasswordResetConfirmView.as_view(template_name='users/password_reset_confirm.html'), name="password_reset_confirm"),
path('password_reset_complete/', auth_views.PasswordResetCompleteView.as_view(template_name='users/password_reset_complete.html'), name="password_reset_complete"),
path('change_password/', auth_views.PasswordChangeView.as_view(template_name='users/change_password.html', success_url="/"), name="password_change"),
# path('password_change_done/done/', auth_views.PasswordChangeDoneView.as_view(template_name='users/password_change_done.html'), name="password_change_done"),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
已登录的用户应该无法访问password_reset_form,因为仅是在忘记密码并且已经登录该用户时,对于用户而言,访问password_reset.html没有任何意义。如何限制访问。任何帮助将不胜感激。
多种方法;但是,我认为最快的解决方案是编写一个装饰器:
def login_forbidden(function=None):
actual_decorator = user_passes_test(
lambda u: u.is_anonymous,
)
if function:
return actual_decorator(function)
return actual_decorator
并用它来装饰密码重设视图,在这些视图中,您只想限制未经身份验证的用户访问:
path('password_reset/', login_forbidden(auth_views.PasswordResetView.as_view(template_name='users/password_reset.html')), name="password_reset")
或者,您可以覆盖实际视图。
如果您确实要修改默认视图,一种选择是将它们子类化并在您的url中使用它们。
在您的意见中(使用UserPassesTestMixin
类:]]
UserPassesTestMixin
在您的网址中:
from django.contrib.auth.mixins import UserPassesTestMixin from django.contrib.auth.views import PasswordResetView class MyPasswordResetView(UserPassesTestMixin, PasswordResetView): template_name = 'users/password_reset.html' # https://docs.djangoproject.com/en/2.2/ref/contrib/auth/#django.contrib.auth.models.User.is_anonymous def test_func(self): return self.request.user.is_anonymous
您应该学习阅读链接的文档以找到答案。它说
from .views import MyPasswordResetView ... path( 'password_reset/', MyPasswordResetView.as_view(), name="password_reset"), ...
:
[...]您可以设置here的任何参数来自定义对未授权用户的处理[...
并且在
AccessMixin
下,您可以找到重定向未经授权的用户的属性和方法。