utils文件夹是重新建立的(与migrations同级),该文件夹下主要存放工具,就像static文件夹下只存放静态文件一样
加密
在utils文件夹下建立encrypt.py文件
from django.conf import settings
import hashlib
def md5(data_string):#md5加密
obj=hashlib.md5(settings.SECRET_KEY.encode('utf-8'))#加盐
obj.update(data_string.encode('utf-8'))
return obj.hexdigest()
在需要使用使用的地方进行导入并调用 【按照自己的路径补充导入,放进utils还是views均可】
from django import forms
class Bootstrap:
bootstrap_exclude_fields = []#排除不加样式的input框
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for name, field in self.fields.items():
if name in self.bootstrap_exclude_fields:
continue
field.widget.attrs['class'] = 'form-control' # 添加属性
field.widget.attrs['placeholder'] = field.label # 添加属性
class BootstrapModelForm(Bootstrap,forms.ModelForm):#ModelForm组件使用
pass
class BootstrapForm(Bootstrap,forms.Form):#Form组件使用
pass
class AdminModelForm(BootstrapModelForm):#不用写__init__方法
twopwd = forms.CharField(
label='确认密码',
widget=forms.PasswordInput(render_value=True)
)
class Meta:
model = Admin
fields = ['username','password']
widgets={
'password':forms.PasswordInput(render_value=True)
}
def clean_password(self):
pwd=self.cleaned_data.get('password')#第一次密码进行加密
return md5(pwd)
def clean_twopwd(self):#写确认密码的函数
print(self.cleaned_data)
pwd=self.cleaned_data.get('password')
pwd2=md5(self.cleaned_data.get('twopwd'))#第二次密码进行加密
if pwd != pwd2:
raise ValidationError("密码不一致")
return pwd2
在views中
def superadd(request):
if request.method == 'GET':
fm=AdminModelForm()
return render(request,'sadd.html', {'form':fm,})
fm=AdminModelForm(data=request.POST)
if fm.is_valid():
print(fm.cleaned_data)
fm.save()
return redirect('/super/')
return render(request,'sadd.html',{'form':fm})
在ModelForm中对要判断的数据进行加密return md5(pwd)
加密数据:{'username': 'comp', 'password': 'c11fb0003e3a4829b6237df02a22a5d6', 'twopwd': 'c11fb0003e3a4829b6237df02a22a5d6'}
数据库也随之存储加密数据【比较的时候将未加密的密码进行加密】
中间件middleware
【以下是一些常见的Django中间件:
-
AuthenticationMiddleware:用于处理用户身份验证和会话管理。它会在请求到达视图之前对用户进行身份验证,并根据需要创建会话。
-
SessionMiddleware:用于支持会话功能。它会为每个用户维护一个唯一的会话,存储用户的会话数据,例如登录状态、购物车内容等。
-
CsrfViewMiddleware:用于防止跨站请求伪造(CSRF)攻击。它会在每个POST请求中生成和验证CSRF令牌,确保请求来自合法的来源。
-
CommonMiddleware:提供了一些通用的HTTP处理功能,例如处理URL重写、压缩响应、设置缓存控制头等。
-
GZipMiddleware:用于在服务器上对响应进行压缩,以减少网络传输的数据量,提高性能。
-
LocaleMiddleware:用于处理多语言支持。它会根据浏览器语言设置选择合适的语言,并将其应用于请求处理过程中。
-
MessageMiddleware:提供了一种向用户显示临时消息的机制。例如,成功消息、错误消息等。】
建立文件夹middleware【app下级】,在该文件夹中建立auth.py文件,写入类M1M2M3...
-
process_request() 方法:该方法会在每个请求到达服务器之前被调用。
-
process_response() 方法:该方法会在每个请求得到响应之后被调用。在该方法中,我们可以对响应进行处理,例如添加 HTTP 头部、修改响应内容等。
将M1路径加到settings.py中的middleware中【注册中间件】
确保 M1 中间件的顺序在 AuthenticationMiddleware(身份验证中间件)之后,以确保身份验证逻辑已经完成
接下来所有的def执行前都会经过M1(中间件),栈的操作
判断session【有session可进入项目网页,没有session回到登陆注册页面进行登陆注册】
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import redirect,HttpResponse
class M1(MiddlewareMixin):
'''中间件1'''
def process_request(self,request):
'''排除不需要验证的页面 request.path_info 获取url'''
if request.path_info in ["/login/"]:
return
#若能读取到session值,则已登录
info_dict=request.session.get('info')
if info_dict:#自然向后走就可以
return
return redirect('/login/')
def process_response(self,request,response):
print('M1', '走了')
return response
若没有session则直接跳转至login页面,速度很快