Django 'User' 对象在将login_required与 user_passes_test 组合时没有属性 'user'



我正在尝试将自定义user_passes_testlogin_required装饰器相结合。

这工作正常:

@login_required
@user_passes_test(profile_expired, "Main:profile_expired")
def home(request):
return render(request, "Main/pages/home.html", {})

在 helpers.py

def profile_expired(user):
if user.is_authenticated and user.profile.expiration_date is not None:
return user.profile.expiration_date >= date.today()
elif user.profile.expiration_date is None:
return True
return False

如果我访问/app/并且profile_expired返回 True,我会被重定向到/app/profile_expired

但是,所有其他视图上的相同代码都返回错误...

@login_required
@user_passes_test(profile_expired, "Main:profile_expired")
def another_view(request):
# some code...
return render(request, "Main/pages/another_page.html", context)

错误:

Traceback (most recent call last):
File "C:UsersSPycharmProjectsSOvenvlibsite-packagesdjangocorehandlersexception.py", line 34, in inner
response = get_response(request)
File "C:UsersSPycharmProjectsSOvenvlibsite-packagesdjangocorehandlersbase.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:UsersSPycharmProjectsSOvenvlibsite-packagesdjangocorehandlersbase.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:UsersSPycharmProjectsSOvenvlibsite-packagesdjangocontribauthdecorators.py", line 21, in _wrapped_view
return view_func(request, *args, **kwargs)
File "C:UsersSPycharmProjectsSOvenvlibsite-packagesdjangocontribauthdecorators.py", line 20, in _wrapped_view
if test_func(request.user):
File "C:UsersSPycharmProjectsSOvenvlibsite-packagesdjangocontribauthdecorators.py", line 20, in _wrapped_view
if test_func(request.user):
File "C:UsersSPycharmProjectsSOvenvlibsite-packagesdjangoutilsfunctional.py", line 257, in inner
return func(self._wrapped, *args)
AttributeError: 'User' object has no attribute 'user'

虽然home只有上面的代码,但another_view(和所有其他视图(有更多的代码......但是错误不能在视图中,因为我在它们里面放置了一个断点,启动了调试器,并且它们永远不会被触发。错误一定在其他地方。

我无法确定为什么会发生这种情况。知道吗?

test_func应该以user作为其参数。

def profile_expired(user):
return user.profile.expiry_date > date.today()

你还没有展示你的函数,但我怀疑你写它是为了接受请求,然后使用request.user.

def profile_expired(request):
return request.user.profile.expiry_date > date.today()

不知何故,在使用user_passes_test装饰器的视图之前声明profile_expired视图是导致错误的原因。

这将崩溃another_page

@login_required
@user_passes_test(profile_expired, "Main:profile_expired")
def home(request): #...

@login_required
def profile_expired(request): #...

@login_required
@user_passes_test(profile_expired, "Main:profile_expired")
def another_page(request): #...

只需将profile_expired移到底部即可解决问题。

我不知道为什么,并且会接受任何解释它的答案。

相关内容

  • 没有找到相关文章

最新更新