装饰 login_required Django 装饰器
Posted
技术标签:
【中文标题】装饰 login_required Django 装饰器【英文标题】:decorating login_required Django decorator 【发布时间】:2015-11-18 04:08:55 【问题描述】:我正在尝试。我一直在看这个问题decorating decorators: try to get my head around understanding it。但是,这种情况有点不同,因为我不想修改 login_required 装饰器,而是向它添加更多功能。
为了清楚起见,我正在尝试创建一个装饰器来装饰视图函数(第一个参数是正常的请求)并检查用户参数。如果可能的话,我不想按照Django: Tweaking @login_required decorator 的建议创建自己的装饰器版本,因为我认为这是一种安全关键的方法,将来可能会被修改。
这是我到目前为止所得到的,但它不起作用。
from django.conf import settings
from django.contrib.auth.decorators import login_required, REDIRECT_FIELD_NAME
from django.http.response import HttpResponseRedirect
from django.utils.decorators import available_attrs
from functools import wraps
def login_and_def_pass_required(view_function=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url=None):
def decorate_view(view_function):
@wraps(view_function, assigned=available_attrs(view_function))
def _double_wrapped_view(request, *args, **kwargs):
actual_decorator = login_required(view_function, redirect_field_name, login_url)
if request.user.temporary_password:
return HttpResponseRedirect(settings.SET_PERMANENT_PASSWORD_URL)
return actual_decorator
return _double_wrapped_view
return decorate_view
这会引发异常“'function' object has no attribute 'get'”。
我正在使用 Django 1.8.4 Python 3.4
【问题讨论】:
有什么理由不能使用user_passes_test
装饰器视图?
如果需要登录,你会如何使用它?
@login_required()\n@user_passes_test(login_url=SET_PERMANENT_PASSWORD_URL)\ndef 视图(请求,...)。对 SO 的评论删除了换行符,所以我将它们添加为 \n
花了我一段时间来测试它。就是这样。如果您将其作为答案,我可以接受(作为正确答案)。可悲的是,这不是最受欢迎的问题......
很高兴它有帮助。发布了答案。
【参考方案1】:
您可以将user_passes_test
与login_required
配合使用以实现所需的行为:
def check_permanent_password(user):
return not user.temporary_password
@login_required(login_url)
@user_passes_test(check_temporary_password, login_url=settings.SET_PERMANENT_PASSWORD_URL)
def view(request):
# your view
【讨论】:
以上是关于装饰 login_required Django 装饰器的主要内容,如果未能解决你的问题,请参考以下文章
Django:在其他装饰器中重用 login_required 装饰器
Django 中的 login_required 装饰器和 urlresolver.reverse()
带有 login_required 装饰器的 Django 3.1 异步视图
django @login_required 装饰器,用于姓氏,仅限具有姓氏 == 'kitchen' 条目的用户