2015-10-20 3 views
6

Я пытаюсь использовать пользовательский URL для входа в конкретной точке зренияКак использовать login_required ввиду Джанго отдыха

@login_required(login_url='/account/login/') 
class home(APIView): 
    renderer_classes = (TemplateHTMLRenderer,) 

    def get(self, request, format=None): 
     template = get_template(template_name='myapp/template.html') 
     return Response({}, template_name=template.template.name) 

но отслеживающий показывает

File "django/core/handlers/base.py", line 132, in get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
File "django/contrib/auth/decorators.py", line 22, in _wrapped_view 
    return view_func(request, *args, **kwargs) 
TypeError: __init__() takes exactly 1 argument (2 given) 

Можно ли использовать пользовательские login_required в классе на основе взгляда?

спасибо!

ответ

7

Декораторы могут использоваться только для функций, а не для классов.

Однако для представлений декорирования класса базирующихся в django docs предложить следующее:

Украшать класс

Украсить каждый экземпляр зрения класса на основе, вам нужно украсить Класс само определение. Для этого вы применяете декоратор к методу dispatch().

Способ по классу не совсем такой же, как отдельная функция, так вы не можете просто применить функцию декоратора методы - вам нужно превратить его в методе декоратор первым. Декоратор method_decorator преобразует декоратор функции в декоратор метода, поэтому , что его можно использовать в методе экземпляра. Например:

from django.contrib.auth.decorators import login_required from 
django.utils.decorators import method_decorator from 
django.views.generic import TemplateView 

class ProtectedView(TemplateView): 
    template_name = 'secret.html' 

    @method_decorator(login_required) 
    def dispatch(self, *args, **kwargs): 
     return super(ProtectedView, self).dispatch(*args, **kwargs) 
+1

хороший ответ , поддерживается. Возможно, стоит упомянуть и объяснить, что если украшение необходимо применять в нескольких представлениях, лучшим вариантом является определение и использование Mixin – Pynchia

+1

Но как добавить пользовательский login_url нечто вроде 'login_url = '/ account/login /'' в этом случае? –

+1

Я думаю, '@method_decorator (login_required (login_url = '/ account/login /'))' – Leistungsabfall

2

Я думаю, что вы ищете Джанго рамочных остальных APIView; Здесь вы можете использовать классы разрешений; см Эта документация http://www.django-rest-framework.org/api-guide/permissions/

Добавить в seetings.py

REST_FRAMEWORK = { 
'DEFAULT_PERMISSION_CLASSES': (
    'rest_framework.permissions.IsAuthenticated', 
) 
} 
from rest_framework.permissions import IsAuthenticated 

class home(APIView): 
    renderer_classes = (TemplateHTMLRenderer,) 
    permission_classes = (IsAuthenticated,) 

    def get(self, request, format=None): 
     template = get_template(template_name='myapp/template.html') 
     return Response({}, template_name=template.template.name) 
Смежные вопросы