首页 > 编程语言 >Python基础day63Django操作session和中间件使用

Python基础day63Django操作session和中间件使用

时间:2023-08-10 20:44:38浏览次数:40  
标签:process Python request 中间件 day63Django session cookie response

Django操作cookie

# 设置cookie
# 获取cookie

set_cookie('key', 'value', max_age=5,expires=5)

参数:
● key, 键
● value=’’, 值
● max_age=None, 超时时间 cookie需要延续的时间(以秒为单位)如果参数是\ None`` ,这个cookie会延续到浏览器关闭为止
expires=None, 超时时间(IE requires expires, so set it if hasn’t been already.)
path=’/‘, Cookie生效的路径,/ 表示根路径


baidu.com------------->一级域名-------------->解析出来很多个二级域名
www.baidu.com  www1.baidu.com  www2.baidu.com  ly.baidu.com

# 买一个服务器的,有了IP----------》127.0.0.1/index/-------->hello.com----->域名解析
127.0.0.1  hello.com-----》DNS解析-----》127.0.0.1
secure=False, 浏览器将通过HTTPS来回传cookie
httponly=False 只能http协议传输,无法被JavaScript获取

获取cookie和设置cookie也可以通过js实现

# 前端如何设置cookie

# localstorage
# sessionStorage

# 清空cookie
obj.delete_cookie('username')
# 使用场景:退出登录(注销功能)

Django操作session

session的数据保存在后端,保存在后端的载体其实有很多,比如可以把数据保存在数据库、文件、Redis等

 

Django的默认保存位置在数据库中,在django_session表中,这张表示默认生成的

 

如何操作session

设置成功一个session值有什么变化

1.会生成一个随机字符串

2.会把用户设置的信息保存在django_session表中,数据也做了加密处理

3.把数据封装到了request.session里去了

4.Django后端吧随机字符串保存到了浏览器中

5.随机字符串保存在浏览器中的key=sessionid

 

当设置多个session值的时候,session_key是不变的,变的是session_Data

当设置多个session值的时候。django_Session表中只存在一条记录(一台电脑的一个浏览器)

上述做法可以节省MySQL的空间

 

获取session发生了哪些事?

1. 浏览器先把sessionid回传到Django的后端

2. Django后端获取到sessionid,然后去数据表中根据session_key查询

  如果查到了,说明之前已经登录过了

  如果查不到,就返回None

3. 查询出来的数据默认是加密的,Django后端又把数据解密之后封装到request.session中

  在取session值的时候就从request.session中取

 

设置过期时间

session的默认过期时间是14天

 

清空session

request.session.delete()  # 清空session,只删服务端的数据,浏览器中的数据还留着
request.session.flush()  # 把服务端和浏览器端的都删除

4. session的相关参数

所有 键、值、键值对

request.session.keys()

request.session.values()

request.session.items()

request.session.set_expiry(value)

  * 如果value是个整数,session会在些秒数后失效。

  * 如果value是个datatime或timedelta,session就会在这个时间后失效。

  * 如果value是0,用户关闭浏览器session就会失效。

  * 如果value是None,session会依赖全局session失效策略

 

Django中的Session配置

1. 数据库Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)

2. 缓存Session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
SESSION_CACHE_ALIAS = 'default'                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置

3. 文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 

4. 缓存+数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎

5. 加密Cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎

其他公用设置项:
SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/"                               # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None                             # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False                            # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次请求都保存Session,默认修改之后才保存(默认)

CBV添加装饰器

from django.utils.decorators import method_decorator

# @method_decorator(login_auth, name='get')
# @method_decorator(login_auth, name='post')  # 第二种方式
class Login(View):
    @method_decorator(login_auth)
    def dispatch(self, request, *args, **kwargs):
        return super(Login, self).dispatch(request, *args, **kwargs)
    # 必须登录之后才能访问get访问
    # @method_decorator(login_auth)  # 第一种方式
    def get(self, request):
        return HttpResponse("get")

    # @method_decorator(login_auth) # # 第一种方式
    def post(self, request):
        return HttpResponse("post")

中间件

# 中间件它的执行位置在web服务网关接口之后,在路由匹配之前执行的
django中自带的有七个中间件
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

# 每一个中间件都有它自己独立的功能
# 它也支持我们自己自定义中间件
只要是跟全局相关的都可以用中间件来实现
如何自定义中间件:
class SecurityMiddleware(MiddlewareMixin):
    def process_request(self, request):
        pass
    
    
    def process_response(self, request, response):
        pass
    

class SessionMiddleware(MiddlewareMixin):
    def process_request(self, request):
        pass
     def process_response(self, request, response):
        psss
        
class CsrfViewMiddleware(MiddlewareMixin):
    def process_request(self, request):
        pass
    def process_response(self, request, response):
        pass
    
    
# 中间件就是一个类,然后这个类都继承了 MiddlewareMixin

# 这个类中有几个方法:
# 下面这两个必须要求掌握
process_request
process_response


process_view
process_template
process_exception

'''这几个方法并不是都要全写,而是,需要几个你就写几个!'''

自定义中间件步骤:
    1. 在项目名下或者任意的应用名下创建一个文件夹
    2. 在这个文件夹下面创建一个py文件
    3. 在该py文件中写一个自定义的类必须要继承MiddlewareMixin
    4. 写完之后紧接着一定要去配置文件中注册中间件
 


class MyMiddleware1(MiddlewareMixin):
    def process_request(self, request):
        # IP限制
        # 
        print("我是第一个自定义的中间件process_request")

    def process_response(self, request, response):
        print("我是第一个自定义中间件的process_response")
        return response  # 每一个process_response都必须有返回值response


class MyMiddleware2(MiddlewareMixin):
    def process_request(self, request):
        print("我是第二个自定义的中间件process_request")

    def process_response(self, request, response):
        print("我是第二个自定义中间件的process_response")
        return response  # 每一个process_response都必须有返回值response
    
# 研究:如果我在第一个中间件的process_request中return返回值,后续的中间件如何走?
它会执行同级别的process_response

# Django里的中间件几乎是所有框架中写的最好的

csrf跨站请求

# 钓鱼网站

# 本质:form表单
username
shenfenzheng
<input type='text' name='正规的'>

# 冒牌的
<input type='text' >

<input type='hidden' name='冒牌的'>

# 如何避免这种问题?

# 研究ajax发送post请求csrf验证

 

标签:process,Python,request,中间件,day63Django,session,cookie,response
From: https://www.cnblogs.com/zfq132/p/17621463.html

相关文章

  • Python模块之paramiko的基本使用
    简介paramiko是一个基于SSHv2协议的纯Python(2.7,3.4+)库;提供了客户端和服务器的功能;可以实现SSH2远程安全连接,支持认证和密钥方式;一般用于执行远程命令、传输文件、中间SSH代理等。paramiko可以在Python代码中直接使用SSH协议对远程服务器进行操作,而不是调用ssh命令对远程服......
  • 分享之python 协程
    线程和进程的操作是由程序触发系统接口,最后的执行者是系统;协程的操作则是程序员。协程存在的意义:对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时(保存状态,下次继续)。协程,则只使用一个线程,在一个线程中规定某个代码块执行顺序。协程的适用场景:当程序中存在大......
  • 软件测试|什么是Python构造方法,构造方法如何使用?
    构造方法(Constructor)是面向对象编程中的重要概念,它在创建对象时用于初始化对象的实例变量。在Python中,构造方法是通过特殊的名称__init__()来定义的。本文将介绍Python构造方法的基本概念、语法和用法。什么是构造方法?在面向对象编程中,构造方法是一个特殊的方法,用于在创建对象时初......
  • opencv-python图像金字塔
    图像金字塔是图像中多尺度表达的一种,主要用于图像特征检测,图像分割等领域,是一种以多分辨率来解释图像的有效但概念简单的结构。简单来说,图像金字塔是同一图像不同分辨率的子图集合。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐渐降低,且来源于同一张原始图的图像集合。层......
  • python编译pyc文件
    python提供了内置的类库来实现把py文件编译为pyc文件,这个模块就是py_compile模块。将单个python文件转为pyc文件python-mpy_compilemycode.py将一个目录中的python文件转为pyc文件python-mcompileall./your_path/编译完成后如果想要直接运行Pyc文件注意两点:1.要把p......
  • python操作MySQL
    #macOS操作MySQL服务#启动MySQLmysql.serverstart#停止MySQLmysql.serverstop#重启MySQLmysql.serverrestart#查看当前MySQL服务状态mysql.serverstatus#配置MySQL服务器#我们需要运行以下脚本配置MySQL服务器的安全性:mysql_secure_install......
  • GIL 锁或将在 CPython 中成为可选项
    哈喽大家好,我是咸鱼几天前有媒体报道称,经过多次辩论,Python指导委员会打算批准通过PEP703提案,让GIL(全局解释器)锁在CPython中成为一个可选项PEP703提案主要目标是使GIL变成可选项,即允许Python解释器在特定情况下不使用GIL这将允许Python在多核处理器上更好地利用......
  • python dict 和 object 相互转换
    pythondict和object的相互转换dict.py借助dict,isinstance来实现对象与字典之间的相互转换defas_dict(obj):ifnothasattr(obj,"__dict__"):returnobjresult={}forkey,valinobj.__dict__.items():ifkey.startswith("_"):......
  • 使用Aspose.BarCode,在 Python 中扫描条码
    条形码是机器可读的数据表示形式,由平行线或几何图案直观地表示。它们提供了一种快速准确的方法来存储和检索信息,例如产品详细信息、库存代码或跟踪号码。条形码有多种类型,包括UPC、EAN、QR码等。每种类型都有特定的结构和编码机制。在这篇博文中,我们将学习如何构建高性能的Python......
  • Python列表排序sort和sorted的区别
    lst_1=[3,1,2]lst_2=[4,6,5]print(lst_1.sort())lst_1.sort()print(lst_1)print(sorted(lst_2))#None#[1,2,3]#[4,5,6]所以结论就是:sorted(list)原来的list不变,生成一个新的排好序的list对象。list.sort()改变原有的list,不会返回对象。......