2015-10-20 7 views
6

Sto cercando di utilizzare un URL di accesso personalizzato a specifici vistacome utilizzare login_required in vista Django resto

@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) 

ma la traceback mostra

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) 

E 'possibile utilizzare personalizzato login_required in classe vista base?

grazie!

risposta

7

I decoratori possono essere utilizzati solo su funzioni, non su classi.

Tuttavia, per le viste di classe a base di decorazione del django docs suggeriscono questo:

Decorare la classe

Per decorare ogni istanza di una visione di classe, che serve per decorare classe definizione stessa. Per fare ciò si applica il decoratore al metodo dispatch() della classe.

un metodo su una classe non è proprio la stessa cosa come una funzione autonoma, in modo da non si può semplicemente applicare una funzione di decoratore al metodo - è necessario trasformarla in un metodo di decoratore di prima. Il decoratore method_decorator trasforma un decoratore di funzioni in un decoratore di metodi in modo da da poter essere utilizzato su un metodo di istanza. Per esempio:

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

buona risposta , in aumento. Può essere utile menzionare e spiegare che se la decorazione deve essere applicata in più viste, l'opzione migliore è definire e utilizzare un Mixin – Pynchia

+1

Ma come aggiungere un login_url personalizzato come "login_url = '/ account/login /'' in questo modo? –

+1

Immagino '@method_decorator (login_required (login_url = '/ account/login /'))' – Leistungsabfall

2

penso che si sta cercando per Django quadro riposo APIView; Qui puoi usare le classi di permesso; consultare questa documentazione http://www.django-rest-framework.org/api-guide/permissions/

Aggiunga al 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)