django实现登录鉴权

1,066 阅读1分钟

用户登录的cookie机制 image.png 首先实现一个登录功能

from django import forms
from django.shortcuts import render, redirect

from manage_worker import models
from manage_worker.utills.bootsrtap import BootStrapForm
from manage_worker.utills.encrypt import md5

# 继承BootStrapForm类中封装了bootstrap的样式,并且BootStrapForm已经继承了forms.Form
class LoginForm(BootStrapForm):
    # 此处使用form,应登录功能不需要与数据库做交互,只需要对数据库字段进行匹配就好
    username = forms.CharField(
        label='用户名',
        widget=forms.TextInput
    )
    password = forms.CharField(
        label='密码',
        widget=forms.PasswordInput(render_value=True)  # render_value=True输入错了不删除密码
    )

    def clean_password(self):
        '''
        密码字段的钩子函数,cleaned_data是前端通过post接口传入的数据,是一个字典
        :return:返回加密后的密码
        '''
        pwd = self.cleaned_data['password']
        return md5(pwd)


def login(request):
    if request.method == 'GET':
        form = LoginForm()
        return render(request, 'login.html', {'form': form})
    form = LoginForm(data=request.POST)
    if form.is_valid():
        admin_object = models.Admin.objects.filter(**form.cleaned_data).first()
        if not admin_object:
            form.add_error('password', '用户名或密码错误')
            return render(request, 'login.html', {'form': form})
        # request.session把session存入后台,
        request.session['info'] = {'id': admin_object.id, 'name': admin_object.username}
        return redirect('/admin/list/')

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

django中间件原理

image.png

process_request和process_response是用户请求和服务器返回时要经过的函数,函数中可以加例如鉴权的逻辑

在项目下新建middleware文件夹,下面新建auth.py文件

image.png

写入以下代码:

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import render, redirect


class AuthMiddleWare(MiddlewareMixin):
    '''
    自定义的中间件,django的中间件是一个类。需要继承 MiddlewareMixin
    '''

    def process_request(self, request):
        '''
        请求时经过的中间件
        :param request:
        :return:
        '''
        if request.path_info == '/login/':
            # 如果return为空(None)就继续往后走
            return
        # 获取当前访问用户的登录信息,如果能获取到,就往后走
        info_dict = request.session.get('info')
        if info_dict:
            return
        return redirect('/login/')

然后去setting.py中增加新建的中间件:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    #自定义的中间件类的路径
    'manage_worker.middleware.auth.AuthMiddleWare'
]