Django框架中的登录验证

什么是login_reqired装饰器

login_reqired()完成的事情就是:

  • 如果用户没有登录,则重定向到settings.LOGIN_URL(这个需要你自己在settings中配置),并将当前访问的绝对路径传递到查询字符串中;
    在这里插入图片描述

  • 如果用户已经登录,则正常执行视图。视图的代码可以安全地假设用户已经登录。

具体详情可以参考下面网页:
https://yiyibooks.cn/xx/django_182/topics/auth/default.html
Django框架中的登录验证_第1张图片
Django框架中的登录验证_第2张图片

  • 如果没有登录的时候,就会跳转到"/accounts/login"
  • 但是这个是给视图函数使用的,如果我们使用的不是视图函数的形式,而是class类的形式,那么我们可以用下面这种方法
    Django框架中的登录验证_第3张图片
  • 提示:?next=/user/就是用户登录以后要跳转回去的地址,也就是这个页面从哪来的再回到哪去。
    Django框架中的登录验证_第4张图片

LoginRequiredMixin类的使用

  • 可以参考官方文档
    https://yiyibooks.cn/xx/django_182/topics/auth/default.html

封装as_view() 的Mixin

  • 将共同的行为运用于多个类的一种方法是编写一个封装as_view() 方法的Mixin。
  • 例如,如果你有许多通用视图,它们应该使用login_required() 装饰器,你可以这样实现一个Mixin:
from django.contrib.auth.decorators import login_required

class LoginRequiredMixin(object):
    @classmethod
    def as_view(cls, **initkwargs):
        view = super(LoginRequiredMixin, cls).as_view(**initkwargs)
        return login_required(view)

class MyView(LoginRequiredMixin, ...):
    # this is a generic view
    ...

使用基于类的视图处理表单

  • 一个最基本的用于处理表单的视图函数可能是这样的:
from django.http import HttpResponseRedirect
from django.shortcuts import render

from .forms import MyForm

def myview(request):
    if request.method == "POST":
        form = MyForm(request.POST)
        if form.is_valid():
            # 
            return HttpResponseRedirect('/success/')
    else:
        form = MyForm(initial={'key': 'value'})

    return render(request, 'form_template.html', {'form': form})

类似的一个基于类的视图看上去是这样:

from django.http import HttpResponseRedirect
from django.shortcuts import render
from django.views.generic import View

from .forms import MyForm

class MyFormView(View):
    form_class = MyForm
    initial = {'key': 'value'}
    template_name = 'form_template.html'

    def get(self, request, *args, **kwargs):
        form = self.form_class(initial=self.initial)
        return render(request, self.template_name, {'form': form})

    def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST)
        if form.is_valid():
            # 
            return HttpResponseRedirect('/success/')

        return render(request, self.template_name, {'form': form})

这是一个非常简单的情形,但你可以看到你将有机会自定这个视图,例如通过URLconf配置覆盖form_class 属性或者子类化并覆盖一个和多个方法。

装饰基于类的视图

基于类的视图的扩展不仅仅局限于使用Mixin。你还可以使用装饰器。由于基于类的视图不是函数,对它们的装饰取决于你使用as_view() 还是创建一个子类。

在URLconf中装饰

装饰基于类的视图的最简单的方法是装饰as_view() 方法的结果。最方便的地方是URLconf 中部署视图的位置:

from django.contrib.auth.decorators import login_required, permission_required
from django.views.generic import TemplateView

from .views import VoteView

urlpatterns = [
    url(r'^about/', login_required(TemplateView.as_view(template_name="secret.html"))),
    url(r'^vote/', permission_required('polls.can_vote')(VoteView.as_view())),
]

装饰类

  • 若要装饰基于类的视图的每个实例,你需要装饰class definition(类定义)本身。可以将装饰器运用到类的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)
  • 在这个例子中,ProtectedView 的每个实例都将有登录保护。
    注意:
  • method_decorator 传递*args 和**kwargs 参数给类上被装饰的方法。如果你的方法不接受与之兼容的参数集,它将引发一个TypeError 异常。
    Django框架中的登录验证_第5张图片
    Django框架中的登录验证_第6张图片
    Django框架中的登录验证_第7张图片

下面是使用Minxi的两中方法

第一种:在views视图中使用

Django框架中的登录验证_第8张图片
Django框架中的登录验证_第9张图片
Django框架中的登录验证_第10张图片

第二种:在urls中使用

Django框架中的登录验证_第11张图片

你可能感兴趣的:(Django框架中的登录验证)