如何在django中编写自定义装饰器?

问题 –

@is_premium_user def sample_view: ....... ...... 

我希望某些视图只能访问网站的高级用户。
我怎样才能在我的项目中的各种应用程序中使用这个装饰器?

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

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

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

而且,(重新)使用装饰器只需把你的装饰器放在你的path上的一个模块中,你就可以从任何其他模块中导入它。

玩了上面的各种链接,不能让他们工作,然后碰到这个我适应这个非常简单的。 http://code.activestate.com/recipes/498217-custom-django-login_required-decorator/

 from django.http import HttpResponseRedirect def authors_only(function): def wrap(request, *args, **kwargs): profile = request.user.get_profile() if profile.usertype == 'Author': return function(request, *args, **kwargs) else: return HttpResponseRedirect('/') wrap.__doc__=function.__doc__ wrap.__name__=function.__name__ return wrap 

感谢arie,答案有很长的路要走,但是这对我不起作用。

当我发现这个片段,我得到它正常工作: http : //djangosnippets.org/snippets/983/

这个解决scheme为我工作:

辅助函数

这个函数的好处是可以在其他地方重用,作为user.is_authenticated替代。 它可以作为模板标签公开。

 def my_custom_authenticated(user): if user: if user.is_authenticated(): return user.groups.filter(name=settings.MY_CUSTOM_GROUP_NAME).exists() return False 

装饰者

我只是把它放在views.py的顶部,因为它太短了。

 def membership_required(fn=None): decorator = user_passes_test(my_custom_authenticated) if fn: return decorator(fn) return decorator 

使用它

 @membership_required def some_view(request): ... 

http://www.makina-corpus.org/blog/permission-required-decorator-django

我从那个博客文章中挖掘我的信息。

将其粘贴到pythonpath的文件中或“util”应用程序中,并将其导入到视图中:

例如

 project_dir |_ app1 |_ app2 |_ utils |_ __init__.py |_ permreq.py from util.permreq import permission_required @permmission_required('someapp.has_some_perm', template='denied.html') def some_view(request): blah blah 

在django本身看到的例子:

http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/decorators.py

您的特定示例可能只是“user_passes_test”版本,其中testing将成为“高级”组的成员。

要在任何地方使用,请创build一个python包并从那里导入它。 只要它在你的sys.path上就可以find。