session与cookie,django中间件

0819自我总结

一.session与cookie

1.django设置session

request.session['name'] = username
request.session['age'] = 13
会自动生成一个sessionid为key:{"name":'username', 'age':12}为值的key,在django中后面值部分会进行加密

2.获取session

request.session.get('name')

3.django中五种session设置

1.数据库session

a. 配置 settings.py
 
    SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)
     
    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,默认修改以后才保存(默认)
 
 
 
b. 使用
 
    def index(request):
        # 获取、设置、删除Session中数据
        request.session['k1']
        request.session.get('k1',None)
        request.session['k1'] = 123
        request.session.setdefault('k1',123) # 存在则不设置
        del request.session['k1']
 
        # 全部 键、值、键值对
        request.session.keys()
        request.session.values()
        request.session.items()
        request.session.iterkeys()
        request.session.itervalues()
        request.session.iteritems()
 
 
        # 用户session的随机字符串
        request.session.session_key
 
        # 将全部Session失效日期小于当前日期的数据删除
        request.session.clear_expired()
 
        # 检查 用户session的随机字符串 在数据库中是否
        request.session.exists("session_key")
 
        # 删除当前用户的全部Session数据
        request.session.delete("session_key")
 
        request.session.set_expiry(value)
            * 若是value是个整数,session会在些秒数后失效。
            * 若是value是个datatime或timedelta,session就会在这个时间后失效。
            * 若是value是0,用户关闭浏览器session就会失效。
            * 若是value是None,session会依赖全局session失效策略。

2.缓存session

a.配置 settings.py
 
    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
    SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也能够是memcache),此处别名依赖缓存的设置
 
 
    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,默认修改以后才保存
 
 
 
b. 使用
 
    同上

3.文件session

a. 配置 settings.py
 
    SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
    SESSION_FILE_PATH = None  # 缓存文件路径,若是为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()                                                            # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T
 
 
    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,默认修改以后才保存
 
b. 使用
 
    同上

4.缓存+数据库Session

a. 配置 settings.py
 
    SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎
 
b. 使用
 
    同上

5.加密cookie sessionhtml

a. 配置 settings.py
     
    SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎
 
b. 使用
 
    同上

4.session与cookie之间的关系

在网站中,http请求是无状态的。也就是说即便第一次和服务器链接后而且登陆成功后,第二次请求服务器依然不能知道当前请求是哪一个用户。cookie的出现就是为了解决这个问题,第一次登陆后服务器返回一些数据(cookie)给浏览器,而后浏览器保存在本地,当该用户发送第二次请求的时候,就会自动的把上次请求存储的cookie数据自动的携带给服务器,服务器经过浏览器携带的数据就能判断当前用户是哪一个了。cookie存储的数据量有限,不一样的浏览器有不一样的存储大小,但通常不超过4KB。所以使用cookie只能存储一些小量的数据。python

二、session:

session和cookie的做用有点相似,都是为了存储用户相关的信息。不一样的是,cookie是存储在本地浏览器,而session存储在服务器。存储在服务器的数据会更加的安全,不容易被窃取。但存储在服务器也有必定的弊端,就是会占用服务器的资源,但如今服务器已经发展至今,一些session信息仍是绰绰有余的。数据库

3.二者传输的关系

1.客户端第一请求,服务端会发送登录页面过去django

2.客户第二次请求并提交用户名和密码后,服务端会向客户端回写一个cookie值浏览器

3.若是咱们设置了session,则会向客户端回写一个 {sessionid : 'lr3gmj3vpt0ytf7locqnb21p0cg63iek'},它会保存在客户端缓存

4.服务端会将客户的隐私信息保存在了服务端的数据库中, 也就是session保存在了数据库中,默认放在django_session表中:{"dsjnalndjskanjdksa" : {"name":'jojo', 'age':12, 'addr':'dsabdsa'}},也就是以session值:用户信息的形式存储安全

5.咱们能够理解为cookie的value值就是session的key,当咱们再次向服务端发起请求时,服务端会经过sessionid来比对信息,而后返回用户信息服务器

def login(request):
    if request.method == 'GET':
        return render(request, 'login.html')
    else:
        username = request.POST.get('username')
        pwd = request.POST.get('pwd')

        if username == 'jojo' and pwd == '123':
            # 设置cookie
            obj = redirect('/test/')
            obj.set_cookie('k1', 'abd')
            ### 向客户端回写一个cookie值
            '''
                1. 向客户端回写一个 {sessionid : 'lr3gmj3vpt0ytf7locqnb21p0cg63iek'}
                2. 将客户的隐私信息保存在了服务端的数据库中, 也就是session保存在了数据库中
                    默认放在django_session表中
                    {"dsjnalndjskanjdksa" : {"name":'jojo', 'age':12, 'addr':'dsabdsa'}}
            '''
            # 设置session
            request.session['name'] = username
            request.session['age'] = 13
            
            # 获取session
            request.session.get('name')
            
            return redirect('/test/')
        else:
            return render(request, 'login.html')

二.中间件

原理图总

自定制中间件

中间件能够定义五个方法,分别是:(主要的是process_request和process_response)cookie

  • process_request(self,request)
  • process_view(self, request, view_func, view_args, view_kwargs)
  • process_response(self, request, response)

以上方法的返回值能够是None或一个HttpResponse对象,若是是None,则继续按照django定义的规则向后继续执行,若是是HttpResponse对象,则直接将该对象返回给用户。session

process_request

process_request有一个参数,就是request,这个request和视图函数中的request是同样的(在交给Django后面的路由以前,对这个request对象能够进行一系列的操做)。

因为request对象是同样的,因此咱们能够对request对象进行一系列的操做,包括request.变量名=变量值,这样的操做,咱们能够在后续的视图函数中经过相同的方式便可获取到咱们在中间件中设置的值。

它的返回值能够是None也能够是HttpResponse对象。返回值是None的话,按正常流程继续走,交给下一个中间件处理,若是是HttpResponse对象,Django将不执行视图函数,而将相应对象返回给浏览器。

process_response

多个中间件中的process_response方法是按照MIDDLEWARE中的注册顺序倒序执行的,也就是说第一个中间件的process_request方法首先执行,而它的process_response方法最后执行,最后一个中间件的process_request方法最后一个执行,它的process_response方法是最早执行。

process_view

process_view(self, request, view_func, view_args, view_kwargs)

该方法有四个参数

  • request是HttpRequest对象。
  • view_func是Django即将使用的视图函数。 (它是实际的函数对象,而不是函数的名称做为字符串。)
  • view_args是将传递给视图的位置参数的列表.
  • view_kwargs是将传递给视图的关键字参数的字典。 view_args和view_kwargs都不包含第一个视图参数(request)。

Django会在调用视图函数以前调用process_view方法。

它应该返回None或一个HttpResponse对象。 若是返回None,Django将继续处理这个请求,执行任何其余中间件的process_view方法,而后在执行相应的视图。 若是它返回一个HttpResponse对象,那么将不会执行Django的视图函数,而是直接在中间件中掉头,倒叙执行一个个process_response方法,最后返回给浏览器

中间件执行流程

请求到达中间件以后,先按照正序执行每一个注册中间件的process_request方法,process_request方法返回的值是None,就依次执行,若是返回的值是HttpResponse对象,再也不执行后面的process_request方法,而是执行当前对应中间件的process_response方法(注意不是掉头执行全部的process_response方法),将HttpResponse对象返回给浏览器。也就是说:若是MIDDLEWARE中注册了6个中间件,执行过程当中,第3个中间件返回了一个HttpResponse对象,那么第4,5,6中间件的process_request和process_response方法都不执行,顺序执行3,2,1中间件的process_response方法。

ZOZRu4.png

process_request方法都执行完后,匹配路由,找到要执行的视图函数,先不执行视图函数,先执行中间件中的process_view方法,process_view方法返回None,继续按顺序执行,全部process_view方法执行完后执行视图函数。假如中间件3 的process_view方法返回了HttpResponse对象,则4,5,6的process_view以及视图函数都不执行,直接从最后一个中间件,也就是中间件6的process_response方法开始倒序执行。

ZOZWDJ.png

相关文章
相关标签/搜索