AI智能
改变未来

django操作cookie和session补充、CBV添加装饰器 Django自定义中间件执行顺序


昨日内容回顾

  • 批量插入数据
# 本质就是一次插入多条数据,执行一次SQL语句# mysql连接池ORM:l = []for i in range(10000):res = models.Book(\'\')l.append(res)models.Book.objects.bulk_create(l)faker模块pip install fakerfrom faker import Fakerfaker = Faker()fake.name()
  • 分页原理
1. 每页展示多少条数据: 102. 总共有多少条数据: 993. 当前页:?page=2select * from t  limit 990, 10
  • cookie与session介绍
# 理论cookie:1. 数据存储在客户端(浏览器)2. 原理:后端把用户的数据保存在浏览器,当用户再次访问的时候,会携带着用户信息提交到后端,后端在做验证3. cookie最大的问题就是不安全4. 不占用后端资源session:1. 数据存储到服务端1.1 文件1.2 数据库1.3 redis2. 原理:\'\'\'当用户登录成功,会自动生成一个随机字符串,拿随机字符串跟用户信息做对应随机字符串:用户信息把随机字符串返回给浏览器保存起来,用户在登录的时候,携带着这个cookie信息,后端拿着随机字符串去数据库中查询\'\'\'3. session是基于cookie工作的4. 用户可以主动禁止掉cookie的保存
  • django操作cookie
obj = HttpResponse()return obj\'\'\'cookie是有过期时间的,在设置cookie的时候可以设置\'\'\'设置cookie:obj.set_cookie(\'username\', \'aaaa\', max_age=120)获取cookie:request.COOKIES.get(\'username\')删除cookie:obj.delete_cookie(\'username\')注销功能:删除cookie达到目的

今日内容概要

  • django操作cookie和session
  • CBV添加装饰器
  • 中间件

内容详细

1. django操作cookie和session

# 1.cookie相关以昨日的登录系统为例添加判断是否登录的装饰器添加注销# 在views.py文件中测试:from django.shortcuts import render, HttpResponse, redirectfrom app01 import models# 登录def login(request):if request.method == \'POST\':username = request.POST.get(\'username\')password = request.POST.get(\'password\')userinfo = models.Book.objects.filter(username=username, password=password).first()if userinfo:# 保存用户信息obj = HttpResponse(\'登录成功\')# 保存数据到cookieobj.set_cookie(\'username\', userinfo.username, max_age=120)  # max_age 时间 秒 过时数据自动清空obj.set_cookie(\'id\', userinfo.id)return objreturn render(request, \'login.html\')# 公共装饰器def login_auth(func):def index(request, *args, **kwargs):# request = args[0]if request.COOKIES.get(\'username\'):return func(*args, **kwargs)else:return  redirect(\'/login/\')return index# 判断不登录不让访问@login_authdef home(request):pass# if request.COOKIES.get(\'username\'):#     return HttpResponse(\'已经登录\')# else:#     return redirect(\'/login/\')# 注销功能def logout(request):obj = redirect(\'home\')obj.delete_cookie(\'username\')# obj.delete_cookie(\'id\')  # 基于获取的信息判断删除哪一项信息return obj# 添加路由:url(r\'^logout/\', views.logout),# 2.保存用户信息到 session默认是保存在 django_session 表中# 登录def login(request):if request.method == \'POST\':username = request.POST.get(\'username\')password = request.POST.get(\'password\')userinfo = models.Book.objects.filter(username=username, password=password).first()if userinfo:# 保存用户信息obj = HttpResponse(\'登录成功\')# 保存数据到cookie# obj.set_cookie(\'username\', userinfo.username, max_age=120)  # max_age 时间 秒 过时数据自动清空# obj.set_cookie(\'id\', userinfo.id)# 保存数据到sessionrequest.session[\'username\'] = userinfo.usernamerequest.session[\'id\'] = userinfo.id"""设置session的过程发生什么事?1.自动生成了随机字符串2.把用户数据保存到数据库中 并且加密处理3.把随机字符串返回给浏览器保存了 并且cookie的key叫 sessionid"""return objreturn render(request, \'login.html\')# 公共装饰器def login_auth(func):def index(request, *args, **kwargs):# request = args[0]# if request.COOKIES.get(\'username\'):if request.session.get(\'username\'):return func(request, *args, **kwargs)else:return  redirect(\'/login/\')return index# 判断不登录不让访问@login_authdef home(request):print(request.session.get(\'username\'))"""获取session的过程发生了哪些事?1.先获取cookie值(sessionid)2.拿着sessionid的值 去数据库中查询数据 如果查询没有 就是没有登录3.如果查询到已存在 说明登录了 并且把用户数据反解密 把用户数据封装到了request.session.select * from django_session where session_key = request.session.get(\'username\')4.以上操作是在 请求来的时候做的 且是在中间件做的"""return HttpResponse(\'home\')# 清空sessiondef logout(request):request.session.delete()request.session.flush()return redirect(\'/login/\')# session的默认过期时间是14天# 在负载均衡中,如果使用session保存用户信息,会出现session共享问题?那么, 如何解决上述问题?常用的缓存数据库就是redis\'\'\'面试题:1. 缓存雪崩2. 缓存穿透3. 缓存击穿\'\'\'# 以下在settings.py文件中配置:1. 数据库SessionSESSION_ENGINE = \'django.contrib.sessions.backends.db\'   # 引擎(默认)2. 缓存SessionSESSION_ENGINE = \'django.contrib.sessions.backends.cache\'  # 引擎SESSION_CACHE_ALIAS = \'default\'                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置3. 文件SessionSESSION_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 SessionSESSION_ENGINE = \'django.contrib.sessions.backends.signed_cookies\'   # 引擎6.其他公用设置项: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,默认修改之后才保存(默认)

2. CBV添加装饰器

# 在views.py文件中测试:from django.views import Viewfrom django.utils.decorators import method_decorator@method_decorator(login_auth, \'get\')  # 第二种方式添加@method_decorator(login_auth, \'get\')  # 第二种方式添加 如果没有post 就只需要一次装饰器即可class IndexView(View):@method_decorator(login_auth)  # 第三种方式 给所有的方法添加装饰器def dispatch(self, request, *args, **kwargs):  # 第三种方式return super().dispatch(request, *args, **kwargs)  # 第三种方式# @method_decorator(login_auth)  # 第一种添加方式def get(self, request):return HttpResponse(\'get\')def post(self, request):return HttpResponse(\'post\')

3. 中间件

# django给我们提供了7个中间件,在配置文件中查询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\',]# 此外 还支持我们自定义中间件# 作用:1. 校验权限2. 限制访问频率3. 检查认证# 自定义中间件步骤:1. 在任何一个应用下面,创建一个py文件2. 在py文件中写一个类必须要继承MiddlewareMixin3. 中间写完之后,一定要到配置文件中注册中间件# 需要我们掌握的1. process_request请求来的时候会走2. process_response请求走的时候会走3. 请求来的时候 会按照配置文件中 注册中间件的顺序自上而下走如果在第一个中间件request 给返回值 那么将不会走到下一个中间件 也不会走到视图函数 只走同级别的 response# 代码层面1. 在app01目录下 新建 py文件 写入:from django.utils.deprecation import MiddlewareMixinfrom django.shortcuts import HttpResponseclass Mydd(MiddlewareMixin):def process_request(self, request):print(\'第一个process_request\')return HttpResponse(\'第一个process_request\')  # 如果在第一个中间件给返回值 那么将不会走到下一个中间件 也不会走到视图函数def process_response(self, request, response):print(\'第一个process_response\')return response  # 必须要返回一个response对象class Mydd2(MiddlewareMixin):def process_request(self, request):print(\'第二个process_request\')return HttpResponse(\'第一个process_request\')def process_response(self, request, response):print(\'第二个process_response\')return response  # 必须要返回一个response对象2. 到settings.py配置文件中注册:找到 MIDDLEWARE = [] 添加\'app01.center.Mydd\',\'app01.center.Mydd2\',3. 在views.py中测试功能:def inner(request):return HttpResponse(\'inner\')"""如遇到报错 只保留:def home(request):print(request.session.get(\'username\'))return HttpResponse(\'home\')def inner(request):return HttpResponse(\'inner\')其余全部注释掉"""4. 添加路由:url(r\'^inner/\', views.inner),"""如遇到报错 注释掉多余的路由"""

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » django操作cookie和session补充、CBV添加装饰器 Django自定义中间件执行顺序