保持状态的cookie 和 session 的过程简述以及类视图与中间件介绍

版权声明:长安白猫 https://blog.csdn.net/weixin_44074810/article/details/91045507

状态保持

  1. 浏览器请求服务器是无状态的
  2. 无状态:指一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求。
  3. 无状态原因:浏览器与服务器是使用Socket套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的Socket连接,而且服务器也会在处理页面完毕之后销毁页面对象。
  4. 有时需要保持下来用户浏览的状态,比如用户是否登录过,
  5. 浏览过哪些商品等
  6. 实现状态保持主要有两种方式:
    ① 在客户端存储信息使用Cookie
    ② 在服务器端存储信息使用Session

1. 保存在客户端的数据叫:cookie
cookie是基于域名(IP)的

更换客户端,和域名(IP)时会改变得

第一次请求过程
① 浏览器第一次请求服务器时不会携带任何cookie信息
② 服务器接收请求后,发下请求中没有cookie信息
③ 服务器设置一个cookie,这个cookie设置在响应中
④ 浏览器接收响应,发现响应中有cookie信息,会将这个cookie信息保存起来
第二次及其之后的过程
⑤ 浏览器第二次及其之后的请求都会携带这个cookie信息
⑥ 这时服务器接收到请求后会发现请求中携带的cookie信息,这时就认识这个请求了

过期时间

max_age:代表是秒数,默认为None
时间是从服务器接收到这个请求时间 + 秒数 计算之后的时间
max_age =

删除cookie
第一种方式:直接删除
response.delete_cookie(key)
第二种方式让 max_age=0
response.set_cookie(key,value,max_age=0)

2. 保存在服务器端的数据叫:session

session需要依赖于cookie
request.session 是一个字典
如果浏览器禁用了cookie,则session不能实现

第一次请求
①客户端向服务器发送带有用户名和密码的post请求,cookie中没有任何信息
②服务器接收到请求后,进行用户名和密码的验证,验证没有问题可以设置session 信息
③在设置session信息的同时,服务器会在响应头中自动设置一个 sessionid 的 cookie 信息
④客户端接收响应之后,会将cookie信息保存起来(sessionid的信息)
第二次及其之后的请求
⑤第二次及其之后的请求都会携带 session id 信息
⑥当服务器接收这个请求后,会取到sessionid信息,然后进行验证,验证成功,则可以获取 session 信息(session信息保存在服务器端)

session是将客户端传来的数据进行保存
session是包含在cookie中的
第二次及其之后的请求都会包含cookie信息,cookie信息中有一项是 session
cookie信息在请求头中

扫描二维码关注公众号,回复: 6672051 查看本文章

在设置session时session做了两件事
1.将数据保存在数据库中
2. 设置一个cookie信息,这个cookie信息是以sessionid为key

类视图与中间件

类视图 是采用的 面向对象 的思路

在Django中也可以使用类来定义一个视图,称为类视图。

  1. 定义类视图
    ① 继承自 View (from django.views import View)
    ② 不同的请求方式有不同的业务逻辑
    类视图的方法就直接采用 http的请求方式的名字 作为我们的函数名 例如:get、post、put
    ③ 类视图的方法的第二个参数 必须是请求实例对象
    类视图的方法必须有返回值 返回值是HttpResopnse及其子类

from django.views.generic import View

class RegisterView(View):
“”“类视图:处理注册”""

def get(self, request):
    """处理GET请求,返回注册页面"""
    return render(request, 'register.html')

def post(self, request):
    """处理POST请求,实现注册逻辑"""
    return HttpResponse('这里实现注册逻辑')

类视图的好处
1. 代码可读性好
2. 类视图相对于函数视图有更高的复用性 , 如果其他地方需要用到某个类视图的某个特定逻辑,直接继承该类视图即可

定义类视图需要继承自Django提供的父类View,
可使用from django.views.generic import View
或者from django.views.generic.base import View导入

配置路由时,使用类视图的as_view()方法来添加。

urlpatterns = [
# 视图函数:注册
# url(r’^register/KaTeX parse error: Expected 'EOF', got '#' at position 42: …egister'), #̲ 类视图:注册 url…’, views.RegisterView.as_view(), name=‘register’),
]

类视图原理

@classonlymethod
def as_view(cls, **initkwargs):
“”"
Main entry point for a request-response process.
“”"
…省略代码…

    def view(request, *args, **kwargs):
        self = cls(**initkwargs)
        if hasattr(self, 'get') and not hasattr(self, 'head'):
            self.head = self.get
        self.request = request
        self.args = args
        self.kwargs = kwargs
        # 调用dispatch方法,按照不同请求方式调用不同请求方法
        return self.dispatch(request, *args, **kwargs)

    ...省略代码...

    # 返回真正的函数视图
    return view


def dispatch(self, request, *args, **kwargs):
    # Try to dispatch to the right method; if a method doesn't exist,
    # defer to the error handler. Also defer to the error handler if the
    # request method isn't on the approved list.
    if request.method.lower() in self.http_method_names:
        handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
    else:
        handler = self.http_method_not_allowed
    return handler(request, *args, **kwargs)

类视图的多继承重写dispatch

class CenterView(View):

def get(self,request):
    return HttpResponse("OK")

def post(self,request):
    return HttpResponse("OK")

使用面向对象多继承的特性。

class CenterView(LoginRequireMixin,View):

def get(self,request):
    return HttpResponse("OK")

def post(self,request):
    return HttpResponse("OK")

中间件

Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。
中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性。
我们可以使用中间件,在Django处理视图的不同阶段对输入或输出进行干预。

1 中间件的定义方法
① 定义一个中间件工厂函数,然后返回一个可以被调用的中间件。
② 中间件工厂函数需要接收一个可以调用的get_response对象。
③ 返回的中间件也是一个可以被调用的对象,并且像视图一样需要接收一个request对象参数,返回一个response对象。

def simple_middleware(get_response):
# 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。

def middleware(request):
    # 此处编写的代码会在每个请求处理视图前被调用。

    response = get_response(request)

    # 此处编写的代码会在每个请求处理视图之后被调用。

    return response

return middleware

例如,在book应用中新建一个middleware.py文件,

def my_middleware(get_response):
print(‘init 被调用’)
def middleware(request):
print(‘before request 被调用’)
response = get_response(request)
print(‘after response 被调用’)
return response
return middleware

定义好中间件后,需要在settings.py 文件中添加注册中间件

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’,
‘book.middleware.my_middleware’, # 添加中间件
]

定义一个视图进行测试

def middleware(request):
print(‘view 视图被调用’)
return HttpResponse(‘OK’)

执行结果
init 被调用
before request 被调用
view 视图被调用
after reponse 被调用

注意:Django运行在调试模式下,中间件init部分有可能被调用两次。

2 多个中间件的执行顺序

1. 在请求视图被处理前,中间件由上至下依次执行
2. 在请求视图被处理后,中间件由下至上依次执行

示例:

定义两个中间件

def my_middleware(get_response):
print(‘init 被调用’)
def middleware(request):
print(‘before request 被调用’)
response = get_response(request)
print(‘after response 被调用’)
return response
return middleware

def my_middleware2(get_response):
print(‘init2 被调用’)
def middleware(request):
print(‘before request 2 被调用’)
response = get_response(request)
print(‘after response 2 被调用’)
return response
return middleware

注册添加两个中间件

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’,
‘users.middleware.my_middleware’, # 添加
‘users.middleware.my_middleware2’, # 添加
]

执行结果

init2 被调用
init 被调用
before request 被调用
before request 2 被调用
view 视图被调用
after response 2 被调用
after response 被调用

猜你喜欢

转载自blog.csdn.net/weixin_44074810/article/details/91045507