计算机基础知识65

cookie和session的使用

# 概念:cookie客户端浏览器上的键值对

# 目的:为了做会话保持
# 来源:服务端写入的,服务端再返回的响应头中写入,浏览器会自动取出来

                存起来是以key value 形式,有过期时间、path、http only等等


# 使用:只要浏览器中有cookie,再次向当前域发送请求,都会自动携带在请求头中
        cookie:"name=lqz;age=19"
# 不安全问题---》cookie中发了敏感数据---》客户能看到

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

# 我们需要让cookie变的安全---》敏感数据不在cookie中方法,而放在session中
    -session服务端的键值对
    -session跟cookie有什么关系呢?把key,以cookie的形式,存到浏览器中
        {111:{name:lqz,age:19,password:123},222:{name:zs,age:19,password:666}}
        sessionid:111
# 当前浏览器以后再发请就会携带过来
    -我们根据带过来的cookie 111----》 从 session中取出对应的数据
# session的使用: 

        必须要先迁移表, session存在服务端的, 默认情况下存在, django-session表中
配置文件:

SESSION_ENGINE = 'django.contrib.sessions.backends.db'
# django项目有两套配置文件:内置一套,项目自己一套

# django-session表的字段:
        session_key:      sessionid:随机字符串
        session_data:  真正的数据(加密了)
        expire_date:     过期时间

request.session.get()  # 取值
request.session['name']='lqz'   # 赋值

# session的本质执行原理:
1 咱么写了request.session['name']='lqz',本质就是向session 对象中放入了name=lqz
2 当前视图函数结束---->经过 【中间件】------>返回给了前端
       django 内置了一个session中间件
       判断:request.session 有没有变化,如果有变化
# 情况一:django-session表中没有数据
在表中创建出一条数据,随机生成一个字符串[随机字符串session_key],把数据存入django-session表
           session_key:adsfasd
           session_data: name=lqz  加密后存到里面
            sessionid:adsfasd   把随机字符串写入到cookie中
# 情况二: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

# 配置session 存放路径(未完成,需要你完成)

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH='c://xxx/x'
SESSION_COOKIE_NAME = 'xxx'
from django.conf import settings
from django.contrib.sessions.backends import 

中间件

# 概念:中间件是介于request与response处理之间的一道处理过程,能在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能
# 作用:
    1 全局的请求拦截---》如果它没有登录---》就不允许访问
    2 拦截所有请求,获取请求的ip地址
    3 记录所有用户的访问日志
    4 统一在响应头中加数据    
# 代码上:就是一个类,类中有几个方法

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认证相关

# 概念: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格式
# 如果使用ajax发送请求: 
                    redirect  render就用不了了
                    尽量使用JsonResponse

Auth的使用

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

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

# 默认的用户表示auth_user创建一个用户:可以用代码,可以用命令
# 模块常用方法:
authenticate():一般需要username 、password两个关键字参数

        提供了用户认证功能,即验证用户名以及密码是否正确,如果认证成功(用户名和密码正确有效),便会返回一个 User 对象, authenticate()会在该 User 对象上设置一个属性来标识后端已经认证了该用户,且该信息在后续的登录过程中是需要的。

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

login(HttpRequest, user):

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

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

is_authenticated():

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

request.user.is_authenticated()

orm的链接方式

django的orm的 __ 链表,使用什么链接方式?

        在Django ORM中,双下划线连接语法本身并不直接对应特定的SQL连接类型。当使用双下划线时,Django ORM会根据模型之间的关系和查询的具体情况自动选择适当的SQL连接方式,包括INNER JOIN、LEFT OUTER JOIN等。
        在实际使用中,我们通常涉及到 INNER JOIN(内连接)和 LEFT OUTER JOIN(左连接),因为这两者是最常见的连接方式。INNER JOIN 用于匹配两个表中符合条件的行,而 LEFT OUTER JOIN会返回左表中的所有行,以及右表中与左表匹配的行。

中间件+logru案例

记录用户访问所用接口用的时间---》记录到日志中---》logru---》打印出来即可

        - ip  user-agent  total_time

pip install loguru  # 安装loguru模块
middle_key.py
from django.utils.deprecation import MiddlewareMixin
from app01 import models
from loguru import logger
import datetimeclass MyMiddlew(MiddlewareMixin):def process_request(self, request):addr = request.META.get('REMOTE_ADDR')llq = request.META.get('HTTP_USER_AGENT')request.time = datetime.datetime.now()models.ShuJu.objects.create(ShuJu_REMOTE_ADDR=addr, user_agent=llq)logger.add('runtime_{time}.log', retention=10)   # 文件名,创十个logger.info('进入时间为:{}', request.time)def process_response(self, request, response):to_time = datetime.datetime.now()time = to_time - request.timeprint(time)logger.warning('结束时间{}', time)return response

auth模块案例

如果用户登录了,打印用户的用户名
log.info('')

# 迁移auth表格
python manage.py createsuperuser
from django.contrib import auth
from loguru import logger
def demo01(request):if request.method == 'GET':return render(request, 'caojiyh.html')else:username = request.POST.get('username')password = request.POST.get('password')print(password)user = auth.authenticate(request, username=username, password=password)print(user)if user:auth.login(request, user)user=request.userlogger.info('用户名是{}', user)print(request.user)return redirect('/home/')else:return render(request, 'caojiyh.html', {'error': '用户名或密码错误'})

IP访问频率限制案例

基础版:总共能访问5次(数据库,session)

高级版:做IP访问频率限制,一分钟只能访问5次

今日思维导图:

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

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

相关文章

STM32单片机项目实例:基于TouchGFX的智能手表设计(3)嵌入式程序任务调度的设计

STM32单片机项目实例:基于TouchGFX的智能手表设计(3)嵌入式程序任务调度的设计 目录 一、嵌入式程序设计 1.1轮询 1.2 前后台(中断轮询) 1.3 事件驱动与消息 1.3.1 事件驱动的概念 1.4 定时器触发事件驱动型的任…

C/C++ 实现动态资源文件释放

当我们开发Windows应用程序时,通常会涉及到使用资源(Resource)的情况。资源可以包括图标、位图、字符串等,它们以二进制形式嵌入到可执行文件中。在某些情况下,我们可能需要从可执行文件中提取自定义资源并保存为独立的…

物联网后端个人第十四周总结

物联网方面进度 1.登陆超时是因为后端运行的端口和前端监听的接口不一样,所以后端也没有报错,将二者修改一致即可 2.登录之后会进行平台的初始化,但是初始化的时候会卡住,此时只需要将路径的IP端口后边的内容去掉即可 3.阅读并完成了jetlinks…

通过误差改变控制的两种策略

如果反馈误差越来越大,需要改变调节方向以减小误差并实现更好的控制。以下是两种常见的调节方向改变的方法: PID控制器中的积分限制:在PID控制中,积分项可以用来减小稳态误差。然而,当反馈误差持续增大时,积…

浪潮信息:数字化转型的策略与实践

在数字化浪潮的推动下,浪潮信息正致力于将计算创新推向新的高度。作为科技发展的排头兵,浪潮信息深知算力的重要性,因此不断探索前所未有的解决方案。在这个过程中,浪潮信息的研发人员和科技工作者如同探险家,勇敢地迎…

RocketMQ安装和使用

RocketMQ快速入门 下载RocketMQ 下载地址 环境要求 Linux64位系统 JDK1.8(64位) 安装RocketMQ 解压 unzip rocketmq-all-4.4.0-bin-release.zip启动RocketMQ 启动NameServer # 1.启动NameServer nohup sh bin/mqnamesrv & # 2.查看启动日志 tail -f ~/logs/rocke…

如何通过3000个传感器帮助大型大学附属医院实现远程环境监测?

得益于ELPRO提供的可扩展、可信赖和可靠的环境监测解决方案,一家领先的大学研究医院系统在COVID-19新冠肺炎大流行初始迅速为员工远程工作做好了准备。 在本案例研究中,您将了解大城市的一家大型大学附属医院如何做到: 建立了远程温度控制数…

身份统一管理创新与优化 ——华为云OneAccess应用身份管理服务的2023年

2023年,随着云计算、物联网、人工智能等技术的快速发展,企业面临着数字化转型的巨大挑战与机遇。身份统一管理是企业数字化转型的基础,也是业务发展的关键。如何高效、安全、灵活地实现身份统一管理,成为企业亟待解决的首要课题。…

屏蔽百度首页推荐和热搜的实战方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

电视节目中活动灭灯系统是如何实现的

活动灭灯系统主要用于各种需要亮灯或灭灯的活动节目,如招聘灭灯、相亲灭灯等。有多种灯光颜色供选择,本设备通过按钮灯软件组合实现,用户可以自己设置亮灯或灭灯规则。 软件功能: 1、后台统一控制亮灯,重新开始下轮…

虾皮免费分析工具:了解市场趋势、优化产品和店铺运营

在如今竞争激烈的电商市场中,了解市场趋势、优化产品和店铺运营对于卖家来说至关重要。虾皮(Shopee)作为一家知名的电商平台,为卖家提供了一些免费的分析工具,帮助他们更好地了解市场情况并做出明智的决策。本文将介绍…

C/C++,优化算法——双离子推销员问题(Bitonic Travelling Salesman Problem)的计算方法与源代码

1 文本格式 // C program for the above approach #include <bits/stdc.h> using namespace std; // Size of the array a[] const int mxN 1005; // Structure to store the x and // y coordinates of a point struct Coordinates { double x, y; } a[mxN]; //…

[架构之路-259]:目标系统 - 设计方法 - 软件工程 - 软件设计 - 架构设计 - 面向服务的架构SOA与微服务架构(以服务为最小的构建单位)

目录 前言&#xff1a; 二、软件架构层面的复用 三、什么是面向服务的架构SOA 3.1 什么是面向服务的架构 3.2 面向服务架构的案例 3.3 云服务&#xff1a;everything is service一切皆服务 四、什么是微服务架构 4.1 什么是微服务架构 4.2 微服务架构的案例 五、企业…

树莓派 5 - Raspberry Pi 5 入门教程

系列文章目录 文章目录 ​​​​​​​ 前言 如果您是第一次使用 Raspberry Pi&#xff0c;请参阅我们的入门指南&#xff08;how to get started&#xff09;。 Raspberry Pi 5 Raspberry Pi 5 配备了运行频率为 2.4GHz 的 64 位四核 Arm Cortex-A76 处理器&#xff0c;CPU 性…

LangChain+通义千问+AnalyticDB向量引擎保姆级教程

本文以构建AIGC落地应用ChatBot和构建AI Agent为例&#xff0c;从代码级别详细分享AI框架LangChain、阿里云通义大模型和AnalyticDB向量引擎的开发经验和最佳实践&#xff0c;给大家快速落地AIGC应用提供参考。 前言 通义模型具备的能力包括&#xff1a; 1.创作文字&#xf…

【已解决】SpringBoot Maven 打包失败:class lombok.javac.apt.LombokProcessor 错误

文章目录 出错原因解决办法总结 最新项目部署的时候&#xff0c;出现了一个maven打包失败的问题&#xff0c;主要是lombok这个组件出的问题&#xff0c;具体的错误信息如下&#xff1a; 我的lombok版本如下&#xff1a; <dependency><groupId>org.projectlombok&l…

Android View.inflate 和 LayoutInflater.from(this).inflate 的区别

前言 两个都是布局加载器&#xff0c;而View.inflate是对 LayoutInflater.from(context).inflate的封装&#xff0c;功能相同&#xff0c;案例使用了dataBinding。 View.inflate(context, layoutResId, root) LayoutInflater.from(context).inflate(layoutResId, root, fals…

nodejs+vue+微信小程序+python+PHP的黄山旅游景点购票系统设计与实现-计算机毕业设计推荐

本文首先对该系统进行了详细地描述&#xff0c;然后对该系统进行了详细的描述。管理人员增加了系统首页、个人中心、用户管理、景点分类管理、景点简介管理、旅游路线管理、文章分类管理、公告文章管理、系统管理理等功能。黄山旅游景点购票系统是根据当前的现实需要&#xff0…

mysql 链接超时的几个参数详解

mysql5.7版本中&#xff0c;先查看超时设置参数&#xff0c;我们这里只关注需要的超时参数&#xff0c;并不是全都讲解 show variables like %timeout%; connect_timeout 指的是连接过程中握手的超时时间,在5.0.52以后默认为10秒&#xff0c;之前版本默认是5秒&#xff0c;主…

【vscode写vue代码是白色怎么办】

【vscode写vue代码是白色怎么办】 在插件列表中搜索Vetur 安装即可