其他分享
首页 > 其他分享> > 【2022.9.12】cookie与session/Django操作cookie/Django操作session/Django中间件

【2022.9.12】cookie与session/Django操作cookie/Django操作session/Django中间件

作者:互联网

今日内容概要

cookie与session简介

# 推导:
	HTTP协议四大特性:
        1.基于请求响应
        2.基于TCP、IP作用于应用层之上协议
        3.无状态
        	意思为:服务端记不住无法识别客户端的状态
            (1).最初互联网的发展 网页简单 每个用户都一样
            (2).随着互联网发展(支付宝等) 服务端需要记住每个用户的信息 业务才能发展
            (3).cookie与sess应运而生
         4.无连接/短连接  

        
        
# 介绍:

cookie:
	保存在客户端上跟用户信息状态相关的数据
    
session:
	保存在服务端上跟用户信息状态相关的数据
    
"""
session的工作主要依赖于cookie  
因为所有的服务端有关于用户的信息数据都是基于cookie才能得到  目前所有能够识别用户身份的网址也都需要使用cookie
当让客户端浏览器也有权利拒绝保存cookie

"""    
    
    
return HttpResponse()
return render()
return redirect()
return JsonRepsonse()
obj = HttpResponse()
obj.操作cookie的方法
return obj


obj = render()
obj.操作cookie的方法
return obj

obj = redirect()
obj.操作cookie的方法
return obj

obj = JsonRepsonse()
obj.操作cookie的方法
return obj

# 示例:
def set_cookie(request):
    obj = HttpResponse()
    obj.set_cookie('name','make')  # cookie数据会保存在浏览器
    return obj
# 保存cookie数据
def set_cookie(request):
    obj = HttpResponse('中秋快乐')
    # 让浏览器保存cookie数据
    obj.set_cookie('name', 'make')
    return obj

#login视图
def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'make' and password == '123':
             obj.set_cookie('name', 'make', max_age=3)  #  参数max_age 为cookie保存信息时间长短。以秒为单位。
             return obj
    return  render(request, 'login.html')

#home视图
def home(request):
    if request.COOKIES.get('name'):  # 取cookie数据
    return HttpResponse('home页面 只有登录的用户才可以查看')
return redirect('/login/')

#首页视图
def index(request):
    if request.COOKIES.get('name'):  # 取cookie数据
    return HttpResponse('index页面 只有登录的用户才可以查看')
return redirect('/login/') 



# 分析:
	情况1:用户访问了其他需要登录才可以访问的页面
    	  如何跳转>>>:想要访问的页面

            
def set_cookie(request):
    obj = HttpResponse('中秋快乐')
    # 让浏览器保存cookie数据
    obj.set_cookie('name', 'make')
    return obj


def login_auth(func_name):
    def inner(request, *args, **kwargs):
        if request.COOKIES.get('name'):
            res = func_name(request, *args, **kwargs)
            return res
        else:
            target_path = request.path_info
            return redirect(f'/login/?next={target_path}')

    return inner


def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'make' and password == '123':
            target_path = request.GET.get('next')
            if target_path:
                obj = redirect(target_path)  # 如果有值则跳转到指定页面
            else:
                obj = redirect('/home/')  # 如果没有值则跳转到首页
            obj.set_cookie('name', 'make', max_age=3)
            return obj
    return render(request, 'login.html')


@login_auth
def home(request):
    return HttpResponse('home页面 只有登录的用户才可以查看')


@login_auth
def index(request):
    return HttpResponse('index页面 只有登录的用户才可以查看')

# 分析:
	情况2:用户直接访问登录页面
    	  如何跳转>>>:网址首页
            

      
def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'make' and password == '123':
            target_path = request.GET.get('next')
            if target_path:
                obj = redirect(target_path)  # 如果有值则跳转到指定页面
            else:
                obj = redirect('/home/')  # 如果没有值则跳转到首页
            obj.set_cookie('name', 'make', max_age=3)
            return obj
    return render(request, 'login.html')


Django操作session

request.session['name'] = 'jason'
	1.django自动产生一个随机字符串返回给客户端(对name加密)
	2.往django_session创建数据(对jason加密)

def set_session(request):
    request.session['name'] = 'jason'
    return HttpResponse('设置session')
===========================================================================


request.session.get('name')
	1.自动从请求中回去sessionid对应的随机字符串
	2.拿着随机字符串去django_session中匹配数据
	3.如果匹配上还会自动解密数据并展示

def get_session(request):
    print(request.session.get('name'))
    return HttpResponse('获取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,默认修改之后才保存(默认)
Django中Session相关设置


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',
]


process_request
process_response
process_view
process_template_response
process_exception
方法 说明
process_request 1.请求来的时候会按照配置文件中注册了的中间件 从上往下依次执行每一个中间件里面的process_request方法 如果没有则直接跳过
2.该方法如果返回了HttpResonse对象 那么请求不会再往后执行 原路返回
process_response 1.响应走的时候会按照配置文件中注册了的中间件 从下往上一次执行每一个中间件里面的process_response方法 没有没有则直接跳过
2.该方法有两个形参request和response 并且默认情况下应该返回response
3.该方法也可以自己返回HttpResponse对象 相当于狸猫换太子
process_view(了解) 当路由匹配成功之后 执行视图函数之前 自动触发
process_excption(了解) 当视图函数报错之后 自动触发
process_template_response(了解) 当视图函数返回的数据对象中含有render属性对应render函数才会触发

注意:如果请求的过程中process_request方法直接返回了HttpResponse对象那么会原地执行同级别process_response方法返回(flask则不同)

1.请求来的时候会按照配置文件中注册了的中间件 从上往下依次执行每一个中间件里面的process_request方法 如果没有则直接跳过
2.该方法如果返回了HttpResonse对象 那么请求不会再往后执行 原路返回
1.响应走的时候会按照配置文件中注册了的中间件 从下往上一次执行每一个中间件里面的process_response方法 没有没有则直接跳过
2.该方法有两个形参request和response 并且默认情况下应该返回response
3.该方法也可以自己返回HttpResponse对象 相当于狸猫换太子
ps:如果请求的过程中process_request方法直接反悔了HttpResponse对象那么会原地执行同级别process_response方法返回(flask则不同)

标签:return,中间件,request,Django,session,cookie,obj
来源: https://www.cnblogs.com/55wym/p/16687611.html