Я хочу ограничить доступ к URL-адресам, обрабатываемым Django Generic Views.
Что касается моих представлений, я знаю, что login_required
декоратор выполняет свою работу. Также этот login_required
аргумент принимает создание / удаление / обновление общих представлений , но я не смог найти способ сделать это для других универсальных представлений.
Django 1.9 или использование django-braces
Django 1.9 представил LoginRequiredMixin, который используется таким образом:
from django.contrib.auth.mixins import LoginRequiredMixin class MyView(LoginRequiredMixin, View): login_url = '/login/' redirect_field_name = 'redirect_to'
Если вы используете старую версию django, вы можете использовать практически тот же миксин из django-braces - версия Django была основана на версии django-braces. django-braces 1.4.x по-прежнему поддерживает Django 1.4, поэтому вы можете использовать его с довольно старыми версиями.
Старые методы
Я нашел этот вопрос, когда искал в Google, как украсить представления на основе классов, поэтому добавьте ответ на это:
Это описано в разделе документации по украшению представлений на основе классов . Есть
urls.py
обертка, или вы можете применить декоратор кdispatch()
методу. Примеры из документации:Украшение в URL conf
from django.contrib.auth.decorators import login_required, permission_required from django.views.generic import TemplateView from .views import VoteView urlpatterns = patterns('', (r'^about/', login_required(TemplateView.as_view(template_name="secret.html"))), (r'^vote/', permission_required('polls.can_vote')(VoteView.as_view())), )
Украшение класса
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)
Дополнительную информацию см. В документации по ссылке выше.
источник
def dispatch
методом в качестве подклассаView
. Теперь я могу простоclass ProtectedTemplateView(TemplateView, ProtectedView): pass
В версии 1.3 Django общие представления изменились с функций на объекты. Таким образом, есть небольшое изменение, необходимое для ответов Уилла МакКатчена и Уилла Харди для работы с версией 1.3:
from django.contrib.auth.decorators import login_required from django.views.generic import TemplateView urlpatterns = patterns('', (r'^foo/$', login_required(TemplateView.as_view(template_name='foo_index.html'))), )
Также в документации описано, как это сделать.
источник
Если вы не хотите писать свою собственную тонкую оболочку вокруг рассматриваемых общих представлений (как предложил Аамир), вы также можете сделать что-то вроде этого в своем
urls.py
файле:from django.conf.urls.defaults import * # Directly import whatever generic views you're using and the login_required # decorator from django.views.generic.simple import direct_to_template from django.contrib.auth.decorators import login_required # In your urlpatterns, wrap the generic view with the decorator urlpatterns = patterns('', (r'', login_required(direct_to_template), {'template': 'index.html'}), # etc )
источник
Для django 1.11 вы можете использовать LoginRequiredMixin для представлений на основе классов
в файле настроек нужно добавить
LOGIN_URL="/login/"
в вашем views.py
from django.contrib.auth.mixins import LoginRequiredMixin class RestaurantLocationCreateView(LoginRequiredMixin,CreateView): ....
источник
Другой способ добиться этого - ниже, мне нравится, что он очень похож на то, как это делается с представлениями на основе функций, и не требует изменения
urls.py
или переопределенияdispatch
:@method_decorator(login_required, name='dispatch') class YourGenericViewSubclass(TemplateView): # # View methods #
источник
Мне нужен был многоразовый способ требовать аутентификации для многих представлений, полученных из общих представлений. Я создал заменяющую функцию отправки, которую я могу добавить в свой класс представления так же, как и другие объявления.
class Index(generic.ListView): model = models.HomePage dispatch = auth.dispatch
auth.dispatch - вот где мы работаем:
def dispatch(self, request, *args, **kw): """Mix-in for generic views""" if userSession(request): return super(self.__class__, self).dispatch(request, *args, **kw) # auth failed, return login screen response = user(request) response.set_cookie('afterauth', value=request.path_info) return response
источник
В Django => 3.0 это сделать довольно просто:
from django.contrib.auth.decorators import login_required from django.utils.decorators import method_decorator from django.views.generic import TemplateView @method_decorator(login_required(login_url='/login/'), name='dispatch') class ProtectedView(TemplateView): template_name = 'secret.html'
для справки: https://docs.djangoproject.com/en/3.0/topics/class-based-views/intro/#decorating-the-class
источник
Используйте следующее:
from django.contrib.auth.decorators import login_required @login_required def your_view(): # your code here
источник
Следующее может решить эту проблему.
// in views.py: class LoginAuthenAJAX(View): def dispatch(self, request, *args, **kwargs): if request.user.is_authenticated: jsonr = json.dumps({'authenticated': True}) else: jsonr = json.dumps({'authenticated': False}) return HttpResponse(jsonr, content_type='application/json') // in urls.py path('login_auth', views.LoginAuthenAJAX.as_view(), name="user_verify"), //in xxx.html <script src = “{% static “xxx/script.js” %}” var login_auth_link = “{% url ‘user_verify’ %}” </script> // in script.js $.get(login_auth_link, { 'csrfmiddlewaretoken' : csrf_token, }, function(ret){ if (ret.authenticated == false) { window.location.pathname="/accounts/login/" } $("#message").html(ret.result); } )
источник