Django回顾【六 】

目录

一、Cookie和Session

【1】Cookie

【2】Session

二、中间件

【1】 什么是中间件

【2】作用

【3】自定义中间件

三、CSRF认证相关

【1】CSRF是什么

【2】CSRF攻击原理

【3】CSRF攻击防范

四、auth的使用

【1】author是什么

【2】auth模块常用方法

authenticate()

login(HttpRequest, user)

logout(request)

is_authenticated()

login_requierd

create_user

create_superuser

check_password 

set_password

User对象的属性

补充

【3】扩写auth的user表

方案一:通过一对一扩展

方案二:通过继承 AbstractUser表来扩写(推荐)

五、缓存

缓存的具体使用(三种粒度)

全站缓存

视图缓存

局部缓存


一、Cookie和Session

【1】Cookie

Cookie是客户端浏览器上的键值对 ----> 为了做会话保持

怎么来的?

  • 服务端写入的
    • 服务端在返回的响应头中写入
    • 浏览器会自动取出来
    • 存起来

key value 形式

  • 过期时间
    • path
    • http only
    • 。。。

只要浏览器中有cookie,再次向当前域发送请求,都会自动携带

  • 携带在请求头中的cookie字段中
  • cookie:"name=lqz;age=19"

不安全问题:cookie中发了敏感数据 ---> 客户能看到

cookie设置:obj.set_cookie()
cookie取值:request.COOKIES.get()
清空:      request.COOKIES.clear()

【2】Session

我们需要让cookie变的安全 ---> 敏感数据不在cookie中方法,而放在session中

  • session是服务端的键值对
  • session跟cookie有什么关系呢?
    • {111:{name:lqz,age:19,password:123},222:{name:zs,age:19,password:666}}
      • 把key,以cookie的形式,存到浏览器中
        • sessionid:111
      • 当前浏览器以后再发请。就会携带 过来
      • 我们根据带过来的cookie:111 ----> 从 session中取出对应的数据

session的使用 ---> 必须要先迁移表 ---> django-session表不存在

  • session存在服务端的 ---> 默认情况下存在 ---> django-session表中
    • 配置文件
    • django项目有两套配置文件:内置一套,项目自己一套
    • SESSION_ENGINE = 'django.contrib.sessions.backends.db'
# django-session表的字段
session_key:     sessionid:随机字符串
session_data:    真正的数据--->加密了
expire_date:     过期时间

session的使用 

取值:request.session.get()
赋值:request.session['name']='l

session的本质执行原理

'''
1 咱么写了request.session['name']='lqz',本质就是向session 对象中放入了name=lqz2 当前视图函数结束----> 经过 【中间件】 ---> 返回给了前端- django内置了一个session中间件- 判断:request.session有没有变化,如果有变化- 情况一:django-session表中没有数据在表中创建出一条数据,随机生成一个字符串[随机字符串session_key],把数据存入django-session表session_key: adsfasdsession_data: name=lqz  加密后存到里面把随机字符串写入到cookie中: sessionid:adsfasd- 情况二:django-session表中有数据把session中所有的值--》加密后--》更新到django-session表的session_data中,其他不变3 下次再发请求进入任意视图函数---> 又会经过  【中间件】---> 视图函数- 视图函数中取session:request.session.get('age')- 浏览器发请求---> 携带cookie过来---> 到了中间件---> 根据sessionid取出随机字符串- 拿着随机字符串去django-session中查【session_key】---> 能查到就把 session_data的数据解密---> 放到request.session中- 后续视图函数中,才能取出值'''

session的中间件把上述内容完成了:procee_request      process_response

django.contrib.sessions.middleware.SessionMiddleware 

二、中间件

【1】 什么是中间件

中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能。

【2】作用

  1. 全局的请求拦截 ---> 如果它没有登录 ---> 就不允许访问
  2. 拦截所有请求,获取请求的ip地址
  3. 记录所有用户的访问日志
  4. 统一在响应头中加数据

【3】自定义中间件

中间件中主要有几个方法:就是一个类,类中有几个方法

process_request(self,request) 
# 请求来了就会走
process_response(self, request, response) 
# 请求走了就会走
process_view(self, request, callback, callback_args, callback_kwargs) 
# 视图函数执行之前调用
process_template_response(self,request,response) 
# 渲染模板之前会走
process_exception(self, request, exception) 
# 视图函数中出现异常了才执行

django内置一些中间件 ---> 增强了djagno的功能

  • request.session
  • request.user

post请求提交数据,拦截了---> csrf认证

process_request和process_response

当用户发起请求的时候会依次经过所有的的中间件,这个时候的请求时process_request,最后到达views的函数中,views函数处理后,在依次穿过中间件,这个时候是process_response,最后返回给请求者。

MIDDLEWARE = ['django.middleware.security.SecurityMiddleware',# session相关的中间件'django.contrib.sessions.middleware.SessionMiddleware',# 公共中间件---> 访问不带 / 路径,如果有带 / 的路径,他会让你重定向到这个地址'django.middleware.common.CommonMiddleware',# csrf认证    xss  cors'django.middleware.csrf.CsrfViewMiddleware',# 认证:request.user---> 这个中间件做的'django.contrib.auth.middleware.AuthenticationMiddleware',# django的消息框架---> flask--> 闪现'django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',
]

自定义中间件来使用,记录用户的请求地址和user-agent

class SaveRemoteAddr(MiddlewareMixin):def process_request(self, request):# request是WSGIRequest 的对象# print(request.session) # 一定要保证,session的中间件要在上面# 这个request就是当次请求的request# 取出ipip = request.META.get('REMOTE_ADDR')user_agent = request.META.get('HTTP_USER_AGENT')print(ip)print(user_agent)# return HttpResponse('不让你看了') # 不会再走视图函数了
'''
能返回的情况:
1 None,表示执行完这个代码,继续往后执行---> 还有中间件,继续执行--> 最后进视图函数
2 四件套,后续不走了,中间件的process_response---> 直接返回给浏览器了
'''

中间件,在响应头加入访问时间

import datetime
class AddHeaderMiddleWare(MiddlewareMixin):def process_response(self, request, response):# request中有没有session? 有# request 如果在视图函数中,往request中放了值,在这里,就可以取出来request.xxx# print(request.xxx)# 所有cookie中都带# response.set_cookie('xxxxx', 'asdfds')# 写入到响应头,访问服务端的时间response['ttt'] = datetime.datetime.now()return response  # 一定要返回response对象

三、CSRF认证相关

【1】CSRF是什么

CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

【2】CSRF攻击原理

在同一个浏览器中,如果登录了A网站,没有退出,在B网站中,向A网站发送请求,浏览器会自动携带A网站的cookie,对于A网站后端来讲, 它就分辨不清到底是用户真实发的请求,还是黑客网站发的请求【都会携带用户真实的cookie】。

【3】CSRF攻击防范

Django解决了这个问题 ---> 只要发送post请求,必须携带一个csrf_token 随机字符串(后端给的)。

这个随机字符串可以带的位置

1 请求体中(urlencoded,form-data):{csrfmiddlewaretoken:asdfasdf}
2 放在请求头中:'X-CSRFToken':asdfasdfasd
3 ajax提交数据:默认是urlencoded,放在请求体中没有任何问题

$.ajax({method: 'post',data: {username, password, csrfmiddlewaretoken},success: function (res) {console.log(res)}
})

4 ajax提交,使用json格式 ---> 就不能放在请求体中,只能放在请求头中:

$.ajax({method: 'post',headers:{'X-CSRFToken':csrfmiddlewaretoken},contentType: 'application/json',data: JSON.stringify({username, password}),success: function (res) {console.log(res)}
})

注:

  • post 提交的数据,都是从request.POST中取,前提是:必须是urlencoded和form-data格式
    • 如果是json是取不到的
  • 如果使用ajax发送请求
    • redirect  render就用不了了
    • 尽量使用JsonResponse

四、auth的使用

【1】author是什么

Auth模块是Django自带的用户认证模块:

我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能,这还真是个麻烦的事情呢。

Django作为一个完美主义者的终极框架,当然也会想到用户的这些痛点。它内置了强大的用户认证系统–auth,它默认使用 auth_user 表来存储用户数据。

默认的用户表示auth_user

创建一个用户:可以用代码,可以用命令

# 配置文件中配置:---> 表会被迁移
INSTALLED_APPS = [
'django.contrib.auth',
]

auth有哪些表 ---> 权限控制

-Permission:auth_permission
-Group:auth_group
-User:auth_user  --> 密码加密--> 密文-auth_group_permissions
-auth_user_groups
-auth_user_user_permissions

如果用户没登录

request.user取出的是匿名用户:AnonymousUser类的对象---> 也有pk,name,is_authenticated

【2】auth模块常用方法

from django.contrib import auth

authenticate()

提供了用户认证功能,即验证用户名以及密码是否正确,一般需要username 、password两个关键字参数。

如果认证成功(用户名和密码正确有效),便会返回一个 User 对象。

authenticate()会在该 User 对象上设置一个属性来标识后端已经认证了该用户,且该信息在后续的登录过程中是需要的。

用法:

user = authenticate(username='usernamer',password='password')

校验用户:必须传username和password

user = authenticate(username='usernamer',password='password')
from django.contrib.auth.models import User
user = User.objects.filter(username=username).first()
if user and user.check_password(password):print('用户名密码正确')
else:print('用户名密码错误')

login(HttpRequest, user)

用户校验通过,让它登录,执行它

  • 当前登录用户写入到session中,
  • 后续request.user就能取出当前登录用户。

用法:

from django.contrib.auth import authenticate, logindef my_view(request):username = request.POST['username']password = request.POST['password']user = authenticate(username=username, password=password)if user is not None:login(request, user)# Redirect to a success page....else:# Return an 'invalid login' error message....

logout(request)

退出 ---> 当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。

用法:

from django.contrib.auth import logoutdef logout_view(request):logout(request)# Redirect to a success page.

is_authenticated()

判断当前用户是否登录

  • 不能使用request.user 是否有值来判断,因为他一直有值
  • request.user.is_authenticated()  ----> 返回True或False

用法:

def my_view(request):if not request.user.is_authenticated():return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

login_requierd

登录认证装饰器 ---> 放在视图函数上

用法:

from django.contrib.auth.decorators import login_required@login_required
def my_view(request):...

如果需要自定义登录的URL,则需要在settings.py文件中通过LOGIN_URL进行修改。 

LOGIN_URL = '/login/'  # 这里配置成你项目登录页面的路由

create_user

auth 提供的一个创建普通用户的方法,需要提供必要参数(username、password)等。

from django.contrib.auth.models import User
user = User.objects.create_user()--密码是加密的---> 这样存密码是明文的

create_superuser

auth 提供的一个创建新的超级用户的方法,需要提供必要参数(username、password)等。

python manage.py createsuperuser

check_password 

通过明文密码校验密码是否正确;密码正确返回True,否则返回False。

用法:

ok = user.check_password('密码')

set_password

修改密码,接收要设置的新密码作为参数。

注意:修改完一定要调用用户对象的save方法!!!

user.set_password(new_password)
user.save()

User对象的属性

User对象属性:username, password

is_staff : 用户是否拥有网站的管理权限,能不能登录admin后台管理。

is_active : 是否允许用户登录, 设置为 False,可以在不删除用户的前提下禁止用户登录。

  • is_active是False ----> authenticate也查不出来
  • is_superuser:是否是超级管理员,admin中权限最高

补充

auth模块的密码加密

  • 同样的密码 ---> 再次加密 ----> 密文也不一样

如何实现

pbkdf2_sha256$   # 加密方式 
260000$           # 过期时间
H93ubuUFw6FbYc6B8ojzKA$ # 随机串,即秘钥
H0ZnaiJOm/pI4K802Y2TcO5SQ7iWDcx5E+mb/hdABd8= # 明文加密后的

如果我们写了User表,但是想用人家的密码加密,就可以使用

res = make_password('123456')
check_password(明文,密文)

【3】扩写auth的user表

方案一:通过一对一扩展

from django.contrib.auth.models import User
class UserDetail(models.Model):user=models.OneToOneField(to=User)phone=models.CharField(max_length=32)

方案二:通过继承 AbstractUser表来扩写(推荐)

1、在models.py中写用户表

from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):# 原来有的字段就不需要写了,只需要扩写你想写的字段mobile = models.CharField(max_length=32)icon = models.ImageField(upload_to='/icon/',default='default.png')

2、在settings.py 配置

AUTH_USER_MODEL='app01.UserInfo'

3、之前不要迁移数据,一旦迁移过,就不行了

  • 一旦迁移过了,按这个步骤操作
  1. 删库
  2. 删迁移文件(所有你写的app都删)
  3. 删除源码中 auth和admin的迁移文件 ---> 卸载djagno重装

五、缓存

页面静态化

缓存 ---> 本身数据在数据库中

  • 如果访问量较大
    • 每次都需要去数据库查询 ---> 影响效率
  • 我们可以对数据做缓存 ---> 以后先从缓存中取数据
    • 如果取到直接返回 ---> 不需要查数据库
    • 如果取不到 ---> 再查数据库 ---> 查完放到缓存中

Django默认就支持缓存 ---> 缓存到的位置

  • 内存缓存(演示)
  • 文件缓存 
  • 数据库缓存
  • redis缓存(后期会用)

默认情况,缓存到内存中

CACHES = {'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',}
}

缓存到文件中

CACHES = {'default': {'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', # 指定缓存使用的引擎'LOCATION': 'D:\Python27\django_05\cache',        # 指定缓存的路径'TIMEOUT':300,             # 缓存超时时间(默认为300秒,None表示永不过期)'OPTIONS': {'MAX_ENTRIES': 300,       # 最大缓存记录的数量(默认300)'CULL_FREQUENCY': 3,      # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)}}   
}

缓存的具体使用(三种粒度)

全站缓存

使用方式,如下:只需要配置两个中间件即可

MIDDLEWARE = ['django.middleware.cache.UpdateCacheMiddleware',......'django.middleware.cache.FetchFromCacheMiddleware'
]

视图缓存

from django.views.decorators.cache import cache_page
@cache_page(timeout=10)
def demo09(request):print('来了老弟')book_list = Book.objects.all()return render(request, 'books.html', {'books': book_list})

局部缓存

{% load cache %}
{% cache 10 'name' %}
可以能有很多代码
{% endcache %}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/216880.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

十大shell脚本任务(一)日志文件分析器

十大脚本任务: 日志文件分析器: 目标:编写一个脚本,自动分析服务器日志文件,提取关键错误信息,并发送通知。价值:实时监控系统状态,及时响应问题。 备份和恢复脚本: 目标…

P4 Qt基础控件——工具按钮toolButton(上)

前言 🎬 个人主页:ChenPi 🐻推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ 🔥 推荐专栏2: 《Linux C应用编程(概念类)_ChenPi的博客-CSDN博客》✨✨✨ 🌺本篇简介 :这一章我们学一…

鸿蒙系统扫盲(五):再谈鸿蒙开发用什么语言?

前段时间,发表了鸿蒙系统扫盲(三):鸿蒙开发用什么语言?这篇文章,收到一些网友的提问,一一解答了,还有网友对我进行了严厉的批评和尖锐的指责,说我有点颠倒是非&#xff0…

【lesson9】表的约束(2)

文章目录 表的约束的介绍列描述测试建表 zerofill测试建表插入测试 修改表插入测试 修改表插入测试 表的约束的介绍 真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角…

WT588F02B-8S语音芯片在水波炉中的应用:提升用户体验与安全性

在现代家电领域,语音芯片的应用日益普及,为各类产品增添了人性化、智能化的元素。以水波炉为例,一种新型的家用电器,它结合了微波炉和烤箱的功能,通过采用WT588F02B-8S语音芯片,使得水波炉在操作、提示、安…

【Flink名称解释一】什么是cataLog

Catalog 提供了元数据信息,例如数据库、表、分区、视图以及数据库或其他外部系统中存储的函数和信息。 数据处理最关键的方面之一是管理元数据。 元数据可以是临时的,例如临时表、或者通过 TableEnvironment 注册的 UDF。 元数据也可以是持久化的&#x…

android项目实战之Android 11(API等级29)或更高版本,检测键盘的弹出和收起

如题 在Android 11(API等级29)或更高版本中,由于隐私限制,无法直接检测键盘的弹出和收起。这是由于Android系统对于键盘弹出和收起的检测进行了限制,以保护用户的隐私。 实现方案 public class KeyboardObserver { …

Typescript中Partial数据类型在项目中的实际应用

在TypeScript中&#xff0c;Partial是一个内置的泛型类型&#xff0c;用于将给定的类型T 的所有属性转换为可选属性。换句话说&#xff0c;Partial<T> 可以帮助我们将一个类型中的所有属性变为可选属性&#xff0c;这在某些情况下非常有用。 例如&#xff1a;设有一个接…

2023-12-12 AIGC-AI如何处理信息和提问

摘要: 2023-12-12 AI如何处理信息和提问 AI如何处理信息和提问 对于基于自然语言处理&#xff08;NLP&#xff09;的模型&#xff0c;如ChatGPT这样的大型语言模型。这个过程可以分为几个关键步骤&#xff1a; 1. 接收和解析输入 接收输入&#xff1a;当用户提出一个问题时&…

经典策略筛选-20231212

策略1&#xff1a; 龙头战法只做最强&#xff1a;国企改革 ----四川金顶 1、十日交易内出现 涨停或 &#xff08;涨幅大于7个点且量比大于3&#xff09; 2、JDK MACD RSI OBV BBI LWR MTM 六指标共振 3、均线多头 4、 筹码峰 &#xff08;锁仓&#xff09; 5、现价>…

最强文生图跨模态大模型:Stable Diffusion

文章目录 一、概述二、Stable Diffusion v1 & v22.1 简介2.2 LAION-5B数据集2.3 CLIP条件控制模型2.4 模型训练 三、Stable Diffusion 发展3.1 图形界面3.1.1 Web UI3.1.2 Comfy UI 3.2 微调方法3.1 Lora 3.3 控制模型3.3.1 ControlNet 四、其他文生图模型4.1 DALL-E24.2 I…

Unity光照模型实践

光照作为3D渲染中最重要的部分之一&#xff0c;如何去模拟真实环境的光照是重要的研究内容&#xff0c;但是现实环境光照过于复杂&#xff0c;有很多经典好用的光照模型去近似真实光照。 根据基础的Phong模型 最终某个点的结果为 环境光Ambient 漫反射光Diffuse 高光Specula…

一文讲解关于MCU启动原理的几个关键问题

MCU最开始一启动后去哪里读代码&#xff1f; CPU上电启动后被设计为去地址0x00000000位置处读取代码&#xff1b;首先会连续读取两个字&#xff0c;分别是栈指针初始值和复位异常处理函数的地址&#xff1b;然后跳去执行复位异常处理函数。 当然在一些早期的ARM处理器设计中&a…

在Spring Cloud中使用组件Ribbon和Feign,并分别创建子模块注册到Eureka中去

ok&#xff0c;在上篇文章中我们讲了在Spring cloud中使用Zuul网关&#xff0c;这篇文章我们将Spring Cloud的五大核心组件的Ribbon和Feign分别创建一个微服务模块。 题外话&#xff0c;本篇博客就是配置子模块&#xff0c;或者说是微服务&#xff0c;然后将微服务正式启动之前…

Stimulus—需求形式化建模和验证工具

产品概述 Stimulus是法国达索公司产品&#xff0c;其目的是通过需求建模分析来验证需求的正确性。Stimulus的核心理念是运用“自然语言”对功能性需求进行建模&#xff0c;并通过仿真来查找需求中的缺陷&#xff0c;例如需求一致性、不二义性和完整性检查等。借助Stimulus可以在…

media-ctl 生成拓扑和数据流图

文章目录 前言一、加载驱动模块二、media-ctl 生成拓扑和数据流图1.media-ctl工具将pipeline拓扑生成dot文件2.将dot文件转换为png图片总结参考资料前言 本文主要介绍在Linux下如何通过media-ctl 工具生成生成V4L2 和 Media 框架的拓扑和数据流图 硬件环境:PC 软件环境:ubun…

2023-12-05 Qt学习总结9

点击 <C 语言编程核心突破> 快速C语言入门 Qt学习总结 前言二十五 QFile文件操作总结 前言 要解决问题: 学习qt最核心知识, 多一个都不学. 二十五 QFile文件操作 QFile是Qt提供的文件读写类&#xff0c;支持对文件进行读写、复制、重命名、删除等操作。常用C函数如下&…

用C语言实现字符串的逆置

第一种方法&#xff1a; 用指针像交换两个数一样&#xff0c;创建一个临时变量&#xff0c;从而实现字符串的逆置&#xff01; void Reverse(char* str) {char* left str;//指向字符串数组的左指针char* right str strlen(str) - 1;//指向字符串数组的右指针&#xff0c;因…

内核上项目【通信】

文章目录 目的操作步骤逆向分析实现代码参考文献 目的 在Win7 64位系统上编写驱动利用ExRegisterAttributeInformationCallback注册回调进行通信 操作步骤 1.利用MmGetSystemRoutineAddress获取ExRegisterAttributeInformationCallback中ExpDisSetAttributeInformation、Exp…

接口自动化多层嵌套json数据处理代码实例

最近在做接口自动化测试&#xff0c;响应的内容大多数是多层嵌套的json数据&#xff0c;在对响应数据进行校验的时候&#xff0c;可以通过&#xff08;key1.key2.key3&#xff09;形式获取嵌套字典值的方法获取响应值&#xff0c;再和预期值比较 1 2 3 4 5 6 7 8 9 10 11 12 13…