我正在尝试在 Django 中创建一个自定义装饰器,但我找不到任何方法来做到这一点。
# "views.py"
@custom_decorator
def my_view(request):
# .......
那么,如何在 Django 中创建它呢?我应该把它放在哪里,以便我可以在我的 Django 项目中的任何地方使用它?
原文由 user677990 发布,翻译遵循 CC BY-SA 4.0 许可协议
我正在尝试在 Django 中创建一个自定义装饰器,但我找不到任何方法来做到这一点。
# "views.py"
@custom_decorator
def my_view(request):
# .......
那么,如何在 Django 中创建它呢?我应该把它放在哪里,以便我可以在我的 Django 项目中的任何地方使用它?
原文由 user677990 发布,翻译遵循 CC BY-SA 4.0 许可协议
尝试了上面的各种链接,但无法使它们正常工作,然后遇到了我改编的这个非常简单的链接。 http://code.activestate.com/recipes/498217-custom-django-login_required-decorator/
from functools import wraps
from django.http import HttpResponseRedirect
def authors_only(function):
@wraps(function)
def wrap(request, *args, **kwargs):
profile = request.user.get_profile()
if profile.usertype == 'Author':
return function(request, *args, **kwargs)
else:
return HttpResponseRedirect('/')
return wrap
使用 @wraps
比手动覆盖 要好 wrap.__doc__ = fn.__doc__
。除其他事项外,它确保您的包装函数与包装函数具有相同的名称。
请参阅 https://docs.python.org/2/library/functools.html
原文由 PhoebeB 发布,翻译遵循 CC BY-SA 4.0 许可协议
4 回答4.4k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
1 回答3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
1 回答4.5k 阅读✓ 已解决
1 回答3.8k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
您不必为此编写自己的装饰器,因为
user_passes_test
已包含在 Django 中。还有一个片段(
group_required_decorator
)扩展了这个装饰器,它应该非常适合你的用例。如果您真的想编写自己的装饰器,那么网上有很多 很好的文档。
好吧,要(重新)使用装饰器,只需将装饰器放在路径上的一个模块中,您就可以从任何其他模块导入它。