Django操作cookie

发布时间 2024-01-02 11:49:12作者: Way*yy

Django操作cookie

# 设置cookie
	obj.set_cookie("username", username, "password", password, max_age=2880)
# 获取cookie
	request.COOKIES.get("username"):
        
COOKIE参数:
	key:键 , 
    values:值 , 
    max_age = None:超时时间,cookie需要延续时间(以秒为单位)如果参数是None,这个cookie会延续到浏览器关闭为止
    expires = None:超时时间(IE浏览器)
    path = "/",cookie生效的路径,"/"表示根路径
    secure = False:浏览器将通过HTTPS来回传cookie
    httponly = False:只能http协议传输,无法被JavaScript获取
清空cookie:
	obj.delete_cookie("username")

Django操作session

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

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

如何操作session?
设置session:
    request.session["username"] = username
    request.session["password"] = password
获取session:
	request.session.get("username"):
        
设置成功一个session值之后会发生什么变化?
    1、会生成一个随机的字符串
    2、会把用户设置的信息保存到Django_session表中,数据也是会做加密处理
    3、会把数据封装到request.session里面去
    4、Django后端会把随机的字符串保存在浏览器中
    5、随机的字符串会般存在浏览器的:sessionid(key):g7kehm7noj0pi9vwdfduacx3oyzg5m9j(values)
        
"""
	当设置多个session值的时候,session_id是不变的,改变的是session_data
	当设置多个session值的时候,djang_session表中只存在一条记录,同一台电脑,一个浏览器只会保存一条
    
    上述做法的好处是什么?节省MySQL的空间
"""

获取session的时候发生了什么事?
    1、浏览器先把sessionid回传到Django的后端
    2、Django后端获取到sessionid,然后去django_session表中根据session_key查询
        # 若查到了,说明之前登陆过
        # 若没查到,就返回None
    3、查到的数据是加密的,Django后端又将这些数据解密之后封装到request.session中
    	# 在取值的时候就从request.session中取

session的参数

设置过期时间:session默认过期时间是"14天"。
request.session.set_expiry(value)
    * 如果value是个整数,session会在些秒数后失效。
    * 如果value是个datatime或timedelta,session就会在这个时间后失效。
    * 如果value是0,用户关闭浏览器session就会失效。
    * 如果value是None,session会依赖全局session失效策略
    
设置session中的数据:
    request.session["username"] = kevin
    request.session.setdefault("username","kevin") # 存在则不添加
    
获取所有的键、值、键值对
    request.session.keys()
    request.session.values()
    request.session.items()
    
# 会话session的key
request.session.session_key

# 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()

# 检查会话session的key在数据库中是否存在
request.session.exists("session_key")

# 删除当前会话的所有Session数据(只删数据库)
request.session.delete()
  
# 删除当前的会话数据并删除会话的Cookie(数据库和cookie都删)。
request.session.flush() 

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.views import View
from django.utils.decorators import method_decorator


# 方法二 必须登陆之后才能访问get、post访问
@method_decorator(login_auth, name="get")
@method_decorator(login_auth, name="post")
class Login(View):
    # 方法三,设置dispatch方法
    @method_decorator(login_auth)
    def dispatch(self, request, *args, **kwargs):
        return super(Login, self).dispatch(request, *args, **kwargs)

    # 方法一
    @method_decorator(login_auth)  # 必须登陆之后才能访问get访问
    def get(self, request):
        return HttpResponse("get")

    # 方法一
    @method_decorator(login_auth)  # 必须登陆之后才能访问post访问
    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',
]

# 每个中间件都会有它独立的功能,它也支持我们自定义中间件
只要跟全局相关的都可以使用中间件来完成:其实中间件就是一个类,这个类都继承了MiddlewareMixin
这个类中有几个方法:
	process_request:请求相关
    process_response:相应相关
    process_view:视图层相关
    process_template:渲染页面相关
    process_exception:错误信息相关 
"""其中process_request和process_response必须掌握"""

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


class My_MiddlewareMixin(MiddlewareMixin):
    def process_request(self, request):
        print("第一个中间件request")

    def process_response(self, request, response):
        print("这是第一个中间件response")
        return response


class My_MiddlewareMixin1(MiddlewareMixin):
    def process_request(self, request):
        print("第二个中间件request")

    def process_response(self, request, response):
        print("这是第二个中间件response")
        return response


class My_MiddlewareMixin2(MiddlewareMixin):
    def process_request(self, request):
        print("第三个中间件request")

    def process_response(self, request, response):
        print("这是第三个中间件response")
        return response


"""
执行结果:
    第一个中间件request
    第二个中间件request
    第三个中间件request
    index
    这是第三个中间件response
    这是第二个中间件response
    这是第一个中间件response
    
    可以看出来上述执行顺序是当中间件请求全部执行完毕,在执行视图函数,最后响应response
"""

# 研究:如果我在第一个中间件的process_request中return返回值,后续的中间件如何走?
它会执行同级别的process_response

csrf跨站请求