首页 > 其他分享 >08补

08补

时间:2023-12-05 16:01:10浏览次数:28  
标签:中间件 08 request django --- session cookie

session的十四用

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()


# 我们需要让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']='lqz'

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

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

django.contrib.sessions.middleware.SessionMiddleware

中间件

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

 

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

代码上:就是一个类,类中有几个方法
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认证

  

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
   # 取出ip
    ip = 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认证相关

  

csrf是什么
跨站请求伪造
# 攻击原理
-在同一个浏览器中,如果登录了A网站,没有退出,在B网站中,向A网站发送请求,浏览器会自动携带A网站的cookie,对于A网站后端来讲, 它就分辨不清到底是用户真实发的请求,还是黑客网站发的请求【都会携带用户真实的cookie】---
# 如何防范:
-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的使用 

auth 是什么,有什么作用 auth就是django 的一个app,做用户管理
Auth模块是Django自带的用户认证模块:
我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能,

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

# 默认的用户表示auth_user
# 创建一个用户:可以用代码,可以用命令
###### 模块常用方法#####
1 authenticate( )
提供了用户认证功能,即验证用户名以及密码是否正确,一般需要username 、password两个关键字参数。
如果认证成功(用户名和密码正确有效),便会返回一个 User 对象。
authenticate( )会在该 User 对象上设置一个属性来标识后端已经认证了该用户,且该信息在后续的登录过程中是需要的。
 用法:
user = authenticate(username='usernamer',password='password')


 2 login(HttpRequest, user)
登录认证通过,调用一下这个方法,以后从request.user中才能取出当前登录用户

 3 退出,一定要调用logout(request)

 is_authenticated() 判断当前用户是否登录--不能使用request.user 是否有值来判断,因为他一直有值
request.user.is_authenticated()

 

标签:中间件,08,request,django,---,session,cookie
From: https://www.cnblogs.com/wzh366/p/17877457.html

相关文章

  • Day08 逻辑结构(switch和增强for)
    1.知识点if,switch,for,while等等和C++、js等相似,需要注意以下几点:1.1有关switchswitch中的casevalue:value类型可以是byte,short,int,char。value类型:string类型是JDK7才开始支持的1.2有关增强forfor(元素类型变量名:需要遍历的数组或集合){......
  • Cadence SPB 22.1 -- BOM表08Day
    BOM表在运用OrCAD软件完成原理图的设计以后,需要通过OrCAD软件进行物料清单的输出,并对BOM清单进行整理归档。1、打开原理图,选择原理图的根目标(.DSN),执行菜单命令“Tools”→“BillofMaterials”,进行BOM清单的输出。     2、弹出 BOM清单输出界面......
  • C++U5-08-二叉树1
    上节课作业分析讲解视频链接:https://pan.baidu.com/s/1_jaM_TlZmLJX4JbLuJtKzA?pwd=2us4提取码:2us4学习目标  树在C++中,二叉树是一种常用的数据结构,由节点(Node)组成,每个节点可以有最多两个子节点。二叉树具有以下几个主要的作用:存储和组织数据:二叉树可用于存储和组织大......
  • SUB7080支架顶升气缸的调整方法
    支架顶升不到位的后果1.预穿销容易卡因为孔位不对中,预穿销难度增大,卡住的概率上升。 2.穿销后支架歪斜,打螺丝易错牙顶不到位的话,支架偏低,如果预穿销过程中左半边被硬生生提上去,那支架整体就是左高右低的状态。这种状态很容易导致螺丝降下拧入的时候错牙,堵转甚至将支架打开......
  • 记Redux下载后,运行examples/todos时,报错Error: error:0308010C:digital envelope rout
    1、Redux下载下载地址gitclonehttps://github.com/reactjs/redux.git进入examples/todos,下载依赖:npminstall2、问题复现及解决执行命令npmrunstart此时终端报错:Error:error:0308010C:digitalenveloperoutines::unsupported解决方法:打开package.json,修改......
  • #2023-2024-1 20231408《计算机基础与程序设计》第十周学习总结
    作业信息这个作业属于哪个课程<2023-2024-1-计算机基础与程序设计>这个作业要求在哪里<2023-2024-1计算机基础与程序设计第十周作业>这个作业的目标<《计算机科学概论》第十二,十三章,第十四章,《C语言程序设计》第九章,上周测试题>作业正文https://www.cnblogs.c......
  • OUC软件工程08小组团队项目-Alpha冲刺-3/3
    在本周的时间里,我们继续完善了代码,调试了SAR图像检测算法的参数,训练了一些模型。对于网站,我们继续使用html5以及css完善了web页面,并且编写了api接口用以调用SAR的后端。在实现接口的过程中,出现了一些困难,还需要学习更多关于接口实现的知识。在接下来几周的时间内,我们需要尽快实现......
  • Codeforces Round 908 (Div. 2)
    总结T1题目大意:A,B两人玩游戏,游戏规则如下:整场游戏有多轮,每轮游戏先胜\(X\)局的人获胜,每场游戏先胜\(Y\)局的人获胜。你在场边观看了比赛,但是你忘记了\(x\)和\(y\),只记得总共比了\(1\len\le20\)局,和每局获胜的人,请判断谁获胜了。如果A获胜,输出A,如果B获胜,输......
  • 2023-2024-1 20232408 《网络空间安全导论》第四周学习总结
    2023-2024-120232408《网络空间安全导论》第四周学习总结教材学习内容总结这一章的题目为系统安全基础。高中时学过哲学,了解过系统是由各个相互联系、相互影响的要素所构成,而且整体性、有序性、内部结构的优化性是其基本特征。而研究系统安全,有一个方面必须是由整体的视角去研......
  • 08.adb命令介绍
    1.adb简介AndroidDebugBridge(Android调试桥)简称adbAndroidsdk中提供的用于管理模拟器或真机状态的工具命令行工具2.adb操作手机设备打开应用adbshellamstart-ncom.tencent.wework/.launch.LaunchSplashActivity传输文件点击,输入,滑动等硬件操作返回,回......