如何在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。