Как написать пользовательский декоратор в django?
Проблема -
@is_premium_user
def sample_view:
.......
......
Я хочу, чтобы определенные взгляды были доступны только для премиальных пользователей веб-сайта.
И как я могу использовать этот декоратор для различных приложений в моем проекте?
Ответы
Ответ 1
Вам не нужно писать свой собственный декоратор для этого, поскольку user_passes_test
уже включен в Django.
И там есть фрагмент (group_required_decorator
), который расширяет этот декоратор и который должен быть довольно уместным для вашего случая использования.
Если вы действительно хотите написать свой собственный декоратор, тогда есть много хорошая документация в сети.
И хорошо, чтобы (повторно) использовать декоратор, просто поместите ваш декоратор в модуль на вашем пути, и вы можете импортировать его из любого другого модуля.
Ответ 2
Играли с различными ссылками выше и не могли заставить их работать, а затем наткнулись на это очень простое, которое я адаптировал. 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
Ответ 3
Благодаря arie ответ помог длинный путь, но он не работает для меня.
Когда я нашел этот фрагмент, я получил его для правильной работы: http://djangosnippets.org/snippets/983/
Это решение работало для меня:
Вспомогательная функция
Эта функция имеет преимущество повторного использования в других местах, в качестве замены при замене 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):
...
Ответ 4
http://www.makina-corpus.org/blog/permission-required-decorator-django
i, основанный на моем блоге.
Придерживайтесь этого файла в пути python или в приложении "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
Ответ 5
См. примеры в самом джанго:
http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/decorators.py
Ваш конкретный пример - это, скорее всего, версия "user_passes_test", где тест будет принадлежать группе "премиум".
Чтобы использовать в любом месте, сделайте пакет python и импортируйте его оттуда. Пока он на вашем sys.path, он будет найден.