如何在 Django 中创建自定义装饰器?

新手上路,请多包涵

我正在尝试在 Django 中创建一个自定义装饰器,但我找不到任何方法来做到这一点。

 # "views.py"

@custom_decorator
def my_view(request):
    # .......

那么,如何在 Django 中创建它呢?我应该把它放在哪里,以便我可以在我的 Django 项目中的任何地方使用它?

原文由 user677990 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 723
2 个回答

您不必为此编写自己的装饰器,因为 user_passes_test 已包含在 Django 中。

还有一个片段( group_required_decorator )扩展了这个装饰器,它应该非常适合你的用例。

如果您真的想编写自己的装饰器,那么网上有很多 很好的文档

好吧,要(重新)使用装饰器,只需将装饰器放在路径上的一个模块中,您就可以从任何其他模块导入它。

原文由 arie 发布,翻译遵循 CC BY-SA 3.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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题