cookie和session

  • 为什么要有cookie和session?

    • 原因是HTTP协议的是无状态的, 不保存用户状态
  • 作用:
    • 为了保存用户状态

cookie

  • 保存在客户端浏览器的键值对

  • cookie虽然是保存在客户端服务器上的, 但它是由服务端设置的

  • 浏览器有权禁止cookie写入

  • 查看浏览器cookie --> 右键检查-->application

  • 需要通过HttpResponse对象才能操作cookie

  • 设置cookie
    • max_age/expires 参数设置浏览器保存cookie的时间
obj = HttpResponse()
# max_age参数用来设置浏览器保存cookie时间, 单位是秒
obj.set_cookie('key', 'value', max_age=5)
  • 获取cookie
request.COOKIES.get('key')
  • request.path_info 获取当前用户访问的url

  • request.full_path 获取当前用户访问的url以及携带的参数

  • 删除cookie/(注销功能)

obj.delete_cookie('key')
def login(request):
next_path = request.GET.get('next')
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'bigb' and password == '123':
# 从哪个页面过来, 登录后就跳转到那个页面
if next_path:
obj = redirect(next_path)
# 登录后默认跳转到home页面
else:
obj = redirect('/home/')
obj.set_cookie('whoami', 'bigb')
return obj return render(request, 'login.html') # 登录认证装饰器
def login_auth(func):
@wraps(func)
def inner(request, *args, **kwargs):
if request.COOKIES.get('whoami'):
res = func(request, *args, **kwargs)
return res
else:
# 获取当前页面url
current_url = request.path_info
# 携带当前页面url参数, 重定向到login页面
return redirect(f'/login/?next={current_url}')
return inner @login_auth
def home(request):
return HttpResponse('登录后才能访问') @login_auth
def index(request):
return HttpResponse('登录后才能访问') @login_auth
def logout(request):
# 删除cookie
request.delete_cookie('whoami')
return redirect('/home/')

session

  • 保存在服务器上面的键值对
  • session的工作机制是需要依赖cookie的
  • 设置session
    • session默认保存在数据库中的django_session表中, 因此要先执行数据库迁移命令
    • django默认的session有效时间是两周
request.session['key'] = 'value'
'''
1.django内部生成了一个随机字符串 2.在数据库session_data表中添加数据:
随机字符串 加密数据 到期时间 3.将产生的随机字符串返回给浏览器
sessionid: 随机字符串
'''
  • 获取session
'''
1.django会自动去请求头里面获取cookie
2.拿着sessionid所对应的随机字符串, 去数据库中session_data中比对
3.拿到随机字符串对应的数据, 添加到request.session中 '''
request.session.get('key')
  • 删除session
# 浏览器和服务端都删除
request.session.delete()
  • 设置到期时间
request.session.set_expiry(5)
def login(request):
next_url = request.GET.get('next')
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password') if username == 'bigb' and password == '123':
# 创建session
request.session['username'] = 'bigb'
# 设置到期时间, 默认是秒
request.session.set_expiry(10)
if next_url:
return redirect(next_url)
return redirect('/home/')
return render(request, 'login.html') def login_auth(func):
@wraps(func)
def inner(request, *args, **kwargs):
# 获取session
if request.session.get('username'):
res = func(request, *args, **kwargs)
return res
else:
current_url = request.path_info
return redirect(f'/login/?next={current_url}')
return inner @login_auth
def home(request):
return HttpResponse('登录后才能访问') @login_auth
def index(request):
return HttpResponse('登录后才能访问') @login_auth
def logout(request):
# 删除session
request.session.delete()
return redirect('/home/')

token

  • 服务端借助加密算法, 无须保存session数据
  • username--->通过加密算法--->生成字符串
  • 将username和随机字符串进行拼接, username+随机字符串, 并返回给客户端,
  • 客户端再次访问时, 对 username+字符串1 进行切割获取username
  • 对username进行加密算法处理, 得到字符串2, 如果字符串2==字符串1, 则是合法用户

Django中间件

  • django默认有七个中间件
  • 支持自定义中间件(类), django暴露给用户5个自定义的中间件下面的方法
  • 这5个方法在条件成立时自动触发

自定义中间件

  • 在APP目录下创建一个文件夹, 并在该文件夹下新建一个py文件
  • 查看settings.py中的中间件的代码, 对照着写
  • 在settings.py中注册我们创建好的中间件
import re

from django.conf import settings
from django.http import HttpResponsePermanentRedirect
from django.utils.deprecation import MiddlewareMixin class MyMid1(MiddlewareMixin):
def process_request(self, request):
print('MyMid1--process_request') def process_response(self, request, response):
print('Mymid1--process_response')
return response class MyMid2(MiddlewareMixin):
def process_request(self, request):
print('MyMid2--process_request') def process_response(self, request, response):
print('Mymid2--process_response')
return response # settings.py
# 这样就可以点进去查看代码了
from django.middleware.security import SecurityMiddleware
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',
# 注册自定义中间件
'app01.mymidware.mymid.MyMid1',
'app01.mymidware.mymid.MyMid2',
]

process_request

  • 请求来的时候, 会按照settings.py中从上到下执行各个中间件的process_request方法
  • 如果中间件没有process_request方法, 则跳过该中间件
  • process_request方法一旦返回了HttpResponse对象, 既响应了请求, 请求不会再往后走
'''
由于process_request方法可以响应请求, 使得中间件适合做网站的全局性功能
1.全局性的用户登陆校验
2.全局性的用户访问权限校验
3.全局性的用户访问频率校验 '''

process_response

  • 响应走的时候, 会按照settings.py中从下到上执行中间件中的process_response方法
  • 该方法必须有两个形参, request和response, 必须返回response, 否则直接报错
  • process_response方法返回什么, 前端就能获取什么 (可以逐级替换)
  • 当process_request方法返回HttpResponse对象, 那响应只从当前的process_response方法开始返回

其他方法

  • process_view

    • def process_view(self, request, view_name, *args, **kwargs):
    • 执行视图函数之前触发
    • 如何该方法返回HttpResponse对象, 则不会执行视图函数, 响应会经过所有的process_response方法
  • process_exception

    • def process_exception(self, request, exception):
    • 在视图函数出现错误时候, 自动触发, 顺序是从下往上
  • process_templates_response

    • 当视图函数返回的对象中含有render属性指向是一个render方法的时候才会触发, 顺序从下往上

Django 10的更多相关文章

  1. Django 10 GET和POST(HttpRequest对象,GET和POST请求,文件上传,HttpResponse对象的cookie)

    Django 10 GET和POST(HttpRequest对象,GET和POST请求,文件上传,HttpResponse对象的cookie) 一.HttpRequest对象 #HttpRequest ...

  2. python框架之Django(10)-Form组件

    介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来.与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入 ...

  3. django 10.5 sqlite3迁移到mysql

    参考: http://www.voidcn.com/article/p-hesvaooz-ru.html 原文: python ./manage.py syncdb --database slave ...

  4. Python3+Apache+Django+CentOS

    使用django开发的项目上到正式环境的环境搭建,系统软件版本: CentOS6. setuptools-.tar.gz pip-.tar.gz Python-.tgz pcre-8.39.tar.b ...

  5. Python Django项目日志查询系统

    该项目适合中小型公司日志查询工作.大型公司可以使用elk等.该系统其实就是调用了absible命令去查日志,然后把输出的信息输到页面查看. 日志查询系统 维护手册 作者:陈土锋 日期:2020年6月1 ...

  6. 第一章 初识Mysql

    Mysql是一个开放源代码的数据库管理系统(DBMS),它是由MySQL AB 公司开发.发布并支持的. 登录 -- mysql #本地登录,默认用户root,空密码,用户为root@127.0.0. ...

  7. python——Pycharm的简单介绍

    一.什么是Pycharm? Pycharm是一种python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试.语法高亮.Project管理.代码跳转.智能提示.自 ...

  8. 数据库学习之MySQL基础

    数据库基础 一.数据库简介 数据库:存放数据的仓库 sql及其规范 sql是Structured Query Language(结构化查询语言)的缩写.SQL是专为数据库而建立的操作命令集,是一种功能 ...

  9. 饮冰三年-人工智能-Python-21 Python数据库MySql

    一:下载与安装 1:下载地址:https://dev.mysql.com/downloads/mysql/ 2:安装MySql 打开下载文件解压到指定文件目录.(我这里解压目录为D:\MySql\my ...

随机推荐

  1. 【Java】面向对象之继承

    多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那一个类即可.其中如图中所示,食草动物.食肉动物.兔子.羊.狮子.豹都可以称为子类,动物类称为父 ...

  2. SpringBoot学习(二)—— springboot快速整合spring security组件

    Spring Security 简介 spring security的核心功能为认证(Authentication),授权(Authorization),即认证用户是否能访问该系统,和授权用户可以在系 ...

  3. vue-cli从2升级到3报错error 404 Not Found: @wry/context@^0.4.0

    vue3出来了,想尝尝鲜. 于是按官方的方法卸载2安装3. npm uninstall vue-cli -g npm install -g @vue/cli 但是报错了 error 404 Not F ...

  4. ubuntu 16.04上源码编译glog和gflags 编写glog-config.cmake和gflags-config.cmake | compile glog and glags on ubuntu 16.04

    本文首发于个人博客https://kezunlin.me/post/977f5125/,欢迎阅读! compile glog and glags on ubuntu 16.04 Series comp ...

  5. 深入理解跳表在Redis中的应用

    本文首发于:深入理解跳表在Redis中的应用微信公众号:后端技术指南针持续输出干货 欢迎关注 前面写了一篇关于跳表基本原理和特性的文章,本次继续介绍跳表的概率平衡和工程实现, 跳表在Redis.Lev ...

  6. sku二维数组里的数组从头到尾叠加组合

    今天工作之余与同事聊天,要是实现一个sku描述里的字段组合的问题.并且实现了请吃饭.哈哈.一顿饭,我和另一位同事积极杠杆的.后来实现了出来. let skuList = [ ['黑色', '白色',' ...

  7. ganglia 一站式部署

    1    ganglia集群监测系统简介 1.1        ganglia简介 ganglia是一款为HPC(高性能计算) 集群设计的可扩展性 的分布式监控系统,它可以监视和显示集群中节点的各种状 ...

  8. Android Saripaar 注解详解

    写这篇文章的原因 在移动端一般很少使用复杂的表单,一般针对于属性的更改都会打开一个新的页面进行更改.虽然不多,但是也会有.如果一个页面要输入的内容包括姓名.地址.邮箱.手机号等,对各个属性的验证会非常 ...

  9. 对照谈-官方spring-boot-starter和自定义starter异同分析

    在前面我讲用spring-boot-starter-mail发邮件的时候,我侧重看的是spring boot发邮件的便利性,今天,我们聊下另外一个方面,spring-boot-starter自身的结构 ...

  10. react修改端口

    react修改端口 在react官网根据文档安装好项目之后,发现新项目没有了scripst文件夹 之前版本是在scripts文件夹中的starts.js中修改 新版本修改port发现移入到了依赖里面 ...