用户登录的cookie机制
首先实现一个登录功能
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中间件原理
process_request和process_response是用户请求和服务器返回时要经过的函数,函数中可以加例如鉴权的逻辑
在项目下新建middleware文件夹,下面新建auth.py文件
写入以下代码:
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'
]