Python后台开发(第三章: Django高级)

本文详细介绍了Django中的Cookie和Session管理,包括Cookie的机制、属性、设置与删除,Session的工作原理、常用方法以及如何在MySQL中存储Session。此外,还探讨了Session与Cookie的区别,以及Redis数据库的使用,如何配置和搭建Redis环境,并将其应用于Django的Session管理。最后,文章涵盖了表单处理、CSRF保护、多表操作以及Django后台管理的使用。
摘要由CSDN通过智能技术生成

Python后台开发(第三章: Django高级)

1 Cookie

1.1 Cookie机制

在程序中,会话跟踪是很重要的事情。理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。

而Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。要跟踪该会话,必须引入一种机制。

Cookie就是这样的一种机制。它可以弥补HTTP协议无状态的不足。在Session出现之前,基本上所有的网站都采用Cookie来跟踪会话Cookie通过在客户端记录信息确定用户身份。

1.2 什么是Cookie

  • cookie是保存在用户浏览器端的键值对
  • Cookie是由服务器生成,存储在浏览器中的键值对数据
  • 每个域名的Cookie相互独立
  • 浏览器访问域名为A的url地址,会把A域名下的Cookie一起传递到服务器
  • Cookie可以设置过期时间,默认为None,即关闭当前浏览器,Cookie立即清除.
  • 保存站点的用户数据.

1.3 Cookie原理

在这里插入图片描述

在这里插入图片描述

Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

1.4 Cookie属性

1.4.1 属性表

属性 说明
set_cookie(常用) 设置Cookie的值 max_age: 默认为None
COOKIES.get(常用) 获取Cookie的值
String name 该Cookie的名称。Cookie一旦创建,名称便不可更改
Object value 该Cookie的值。如果值为Unicode字符,需要为字符编码。如果值为二进制数据,则需要使用BASE64编码
int maxAge 该Cookie失效的时间,单位秒。如果为正数,则该Cookie在maxAge秒之后失效。如果为负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。如果为0,表示删除该Cookie。默认为–1
boolean secure 该Cookie是否仅被使用安全协议传输。安全协议。安全协议有HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false
String path 该Cookie的使用路径。如果设置为“/sessionWeb/”,则只有contextPath为“/sessionWeb”的程序可以访问该Cookie。如果设置为“/”,则本域名下contextPath都可以访问该Cookie。注意最后一个字符必须为“/”
String domain 可以访问该Cookie的域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”
String comment 该Cookie的用处说明。浏览器显示Cookie信息的时候显示该说明
int version 该Cookie使用的版本号。0表示遵循Netscape的Cookie规范,1表示遵循W3C的RFC 2109规范

1.4.2 代码实例

1.4.2.1 set_cookie
  1. url配置
re_path('set_cookie/(.+)/(.+)',views.set_cookie_handler,name='set_cookie') 
  1. views配置
def set_cookie_handler(request,key,value): 
    response = HttpResponse() 
    #max_age=60\*60 表示Cookie的有效时间3600秒,即1小时 
    response.set_cookie(key,value,max_age= 60 * 60) 
    return response 

1.4.2.2 COOKIES.get
  1. url配置
re_path('get_cookie/(.+)',views.get_cookie_handler,name='get_cookie')
  1. views配置
def get_cookie_handler(request,key): 
    value = request.COOKIES.get(key) 
    return HttpResponse(value)

注:在测试cookie之前,需要先对Django项目执行迁移,才可以在数据库中得到对应的操作表。

1.4.3 Cookie的删除和修改

  • Cookie并不提供修改、删除操作。如果要修改某个Cookie,只需要新建一个同名的Cookie,添加到response中覆盖原来的Cookie。
  • 如果要删除某个Cookie,只需要新建一个同名的Cookie,并将maxAge设置为0,并添加到response中覆原来的Cookie。注意是0而不是负数。负数代表其他的意义。
  • 注意:修改、删除Cookie时,新建的Cookie除value、maxAge之外的所有属性,例如name、path、domain等,都要与原Cookie完全一样。否则,浏览器将视为两个不同的Cookie不予覆盖,导致修改、删除失败。

1.4.4 Cookie的域名

  • Cookie是不可跨域名的。域名www.google.com颁发的Cookie不会被提交到域名www.baidu.com去。这是由Cookie的隐私安全机制决定的。隐私安全机制能够禁止网站非法获取其他网站的Cookie。
  • 正常情况下,同一个一级域名下的两个二级域名如www.helloweenvsfei.com和images.helloweenvsfei.com也不能交互使用Cookie,因为二者的域名并不严格相同。如果想所有helloweenvsfei.com名下的二级域名都可以使用该Cookie,需要设置Cookie的domain参数,例如:
Cookie cookie = new Cookie("time","20080808"); 
// 新建Cookie cookie.setDomain(".helloweenvsfei.com");          
// 设置域名 cookie.setPath("/");                              
// 设置路径 cookie.setMaxAge(Integer.MAX_VALUE);               
// 设置有效期 response.addCookie(cookie);                       
// 输出到客户端 
  • 可以修改本机C:\WINDOWS\system32\drivers\etc下的hosts文件来配置多个临时域名,然后使用setCookie.jsp程序来设置跨域名Cookie验证domain属性。
  • 注意:domain参数必须以点(".")开始。另外,name相同但domain不同的两个Cookie是两个不同的Cookie。如果想要两个域名完全不同的网站共有Cookie,可以生成两个Cookie,domain属性分别为两个域名,输出到客户端。

1.4.5 Cookie的安全性

  1. Cookie是存储在客户端,即浏览器的,所有具有不安全性
  2. 对于敏感的数据,应该加密,或者保存在服务端

2 Session

2.1 Session机制

除了使用Cookie,Web应用程序中还经常使用Session来记录客户端状态。Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力。

2.2 什么是Session

  • session是保存在服务器端的键值对。
  • Session基于Cookie的。
  • Session把敏感的数据以加密的方式保存在服务器。
  • Session默认的过期时间是两周,如果自己设置了过期时间,这样自己设定的优先级就会高于默认的
  • Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。

2.3 Session原理

在这里插入图片描述

2.4 Session常用方法

属性 说明
session[key] = value 设置Session的值 设置过期时间,默认为2周: session.set_expiry(60*60)
session.get(key) 获取Session的值,如果没有这个key,返回None
flush() 删除表数据
clear() 清空sessionId对应的数据

2.5 代码实例

2.5.1 设置

  1. url配置
re_path('set_session/(.+)/(.+)',views.set_session_handler,name='set_session'), 
  1. views配置
def set_session_handler(request,key,value):
    request.session[key] = value 
    #设置过期时间 
    request.session.set_expiry(60 * 60) 
    return HttpResponse('设置成功') 

2.5.2 获取

1.url配置

re_path('get_session/(.+)',views.get_session_handler,name='get_session'), 

2.views配置

def get_session_handler(request,key): 
    value = request.session.get(key) 
    return HttpResponse(value) 

2.5.3 删除

  1. url配置
path('flush',views.flush_session_handler,name='flush'), 

  1. views配置
def flush_session_handler(request): 
    request.session.flush()

2.5.4 clear

  1. url配置
path('clear',views.clear_session_handler,name='clear'),

  1. views配置
def clear_session_handler(request): 
    request.session.clear() 
    return HttpResponse('clear')

2.6 Session—mysql

2.6.1 数据库信息配置

项目settings文件的DATABASES中配置mysql引擎。

DATABASES = {
    'default': {
    'ENGINE' : 'django.db.backends.mysql', 'HOST': 'localhost',
                          #一般都是localhost 
                          'PORT': '3306',
                          #本地mysql服务运行的端口号 
                          'NAME': 'django3',
                          #本地mysql库中存在设置的库 
                          'USER': 'root',
                          #用户必须为root 
                          'PASSWORD': '12345',
                          #cmd下连接mysql数据库使用的密码 } } 

2.6.2 执行迁移,生成Session表

在终端Terminal 项目目录下执行数据表更新命令:

python manag.py makemigrations # 生成迁移文件
python manag.py migrate  # 执行迁移

刷新数据库,查看是否生成了django_session表

3 Session和Cookie的区别

  • cookie数据存放在客户的浏览器上,session数据放在服务器上。
  • cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗 考虑到安全应当使用session。
  • session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能 考虑到减轻服务器性能方面,应当使用COOKIE。
  • 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
  • 所以个人建议: 将登陆信息等重要信息存放为SESSION 其他信息如果需要保留,可以放在COOKIE中

4 Redis数据库

4.1 Redis概述

  • 非关系型数据库
  • 数据读写的速度快
  • 可以存储的数据量少
  • 内存数据库,支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值