Подтвердить что ты не робот

Как написать пользовательский декоратор в django?

Проблема -

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

Я хочу, чтобы определенные взгляды были доступны только для премиальных пользователей веб-сайта.
И как я могу использовать этот декоратор для различных приложений в моем проекте?

4b9b3361

Ответ 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, он будет найден.