◢Django md5加密与中间件middleware

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中间件:

  1. AuthenticationMiddleware:用于处理用户身份验证和会话管理。它会在请求到达视图之前对用户进行身份验证,并根据需要创建会话。

  2. SessionMiddleware:用于支持会话功能。它会为每个用户维护一个唯一的会话,存储用户的会话数据,例如登录状态、购物车内容等。

  3. CsrfViewMiddleware:用于防止跨站请求伪造(CSRF)攻击。它会在每个POST请求中生成和验证CSRF令牌,确保请求来自合法的来源。

  4. CommonMiddleware:提供了一些通用的HTTP处理功能,例如处理URL重写、压缩响应、设置缓存控制头等。

  5. GZipMiddleware:用于在服务器上对响应进行压缩,以减少网络传输的数据量,提高性能。

  6. LocaleMiddleware:用于处理多语言支持。它会根据浏览器语言设置选择合适的语言,并将其应用于请求处理过程中。

  7. MessageMiddleware:提供了一种向用户显示临时消息的机制。例如,成功消息、错误消息等。】

建立文件夹middleware【app下级】,在该文件夹中建立auth.py文件,写入类M1M2M3...

  1. process_request() 方法:该方法会在每个请求到达服务器之前被调用。

  2. 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页面,速度很快

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django中,可以使用内置的hashlib模块对数据库中的数据进行MD5加密。 首先,需要在项目的settings.py文件中配置数据库信息,包括数据库类型、名称、用户名和密码等。 然后,在models.py文件中定义需要存储的模型类,并为其中需要加密的字段添加CharField或TextField属性,例如: from django.db import models import hashlib class User(models.Model): username = models.CharField(max_length=100) password = models.CharField(max_length=100) def set_password(self, raw_password): hashed_password = hashlib.md5(raw_password.encode()).hexdigest() self.password = hashed_password def check_password(self, raw_password): hashed_password = hashlib.md5(raw_password.encode()).hexdigest() return self.password == hashed_password 在上述代码中,set_password()方法用于将传入的密码进行MD5加密并保存到password字段中,check_password()方法则用于验证输入的密码和数据库中保存的加密密码是否一致。 当需要创建用户时,可以使用set_password()方法对密码进行加密: user = User(username='test', password='password') user.set_password(user.password) user.save() 当需要验证用户登录时,可以使用check_password()方法来验证密码的正确性: user = User.objects.get(username='test') if user.check_password('password'): # 密码正确,执行登录操作 ... else: # 密码错误,提示用户重新输入密码 通过以上的方法,可以实现在Django中对数据库进行MD5加密

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值