Django视图(cookie/session)使用(二)

HttpRequest对象

当请求一个页面时,Django会把请求数据包装成一个HttpRequest对象,然后调用对应的视图函数,把这个HttpRequest对象作为第一个参数传给视图函数。

AttributeDescription
path请求页面的全路径,不包括域名端口参数。例如: "/music/bands/beatles"
method一个全大写的字符串,表示请求中使用的HTTP方法。常用值:‘GET’, 'POST'。以下三种会为Get请求:
form表单默认提交(或者method指定为get)在浏览器中输入地址直接请求网页中的超链接(a标签)
form表单中指定method为post,则为post请求
encoding一个字符串,表示提交的数据的编码方式(如果为 None 则表示使用 DEFAULT_CHARSET 的设置,默认为 'utf-8')
GET类似字典的QueryDict对象,包含get请求的所有参数
POST类似字典的QueryDict对象,包含post请求的所有参数
服务器收到空的POST请求的情况也是有可能发生的因此,不能使用语句if request.POST来判断是否使用HTTP POST方法
应该使用if request.method == "POST"
COOKIES一个标准的python字典,包含所有的cookies, 键和值都是字符串
session可读可写的类似字典的对象(django.contrib.sessions.backends.db.SessionStore)。django提供了session模块,默认就会开启用来保存session数据
FILES类似字典的对象,包含所有的上传文件



QueryDict对象

  • 定义在django.http.QueryDict
  • HttpRequest对象的 属性 GET、POST 都是QueryDict类型的对象
  • 与python字典不同,使用QueryDict类型的对象,同一个键可以有多个值
  • get()方法:根据键获取值,如果一个键同时拥有多个值将获取最后一个值,键不存在则返回None,也可以指定默认值:

    dict.get('键',默认值)
    可简写为
    dict['键']
    

    注意:通过 dict['键'] 访问,如果键不存在会报错

QueryDict使用案例
  • 用来保存一个键可以有多个值的情况

    >>> QueryDict('a=1&a=2&a=3&b=4')
    <QueryDict: {'a': ['1', '2', '3'], 'b': ['4']}>
    
  • 通过[]取一个值(没有键会报错):

    >>> d = QueryDict('a=1&a=2&a=3&b=4')
    >>> d['a']
    '3'
    >>> d['c']
    django.utils.datastructures.MultiValueDictKeyError
    
  • 通过get方法取值,没有键不会报错

    >>> d.get('a')
    '3'
    >>> d.get('c', '默认值')
    '默认值'
    
  • 通过getlist()方法取出所有值

    >>> d.getlist('a')
    ['1', '2', '3']

GET属性

  • 关于GET请求:

    • 当需要从服务器中读取数据时使用get请求;
    • 请求参数会跟在url末尾传递给服务器: http://127.0.0.1:8000/login?username=admin&password=123
    • 提交的参数有大小限制(浏览器对url长度有限制);
    • 安全性较低
  • 案例: 从GET属性中获取请求参数

    例:url请求地址如下:

    http://127.0.0.1:8000/get?a=1&b=2&b=3
    

    其中get请求的参数为:

    a=1&b=2&b=3
    
    • 分析请求参数,键为'a'、'b',值为'1'、'2'、'3'
    • 在Django中,可以使用HttpRequest对象的GET属性获得get方式请求的参数
    • GET属性返回QueryDict类型的对象,键和值都是字符串类型


POST属性

  • POST请求

    • 用于向服务器提交数据,会修改服务器中的数据
    • 请求参数会通过请求体(request body)传递给服务器
    • 提交的参数没有大小限制
    • 安全性相对get较高(HTTPS)


HttpResponse对象

视图函数处理完逻辑后,必须返回一个HttpResponse对象或子对象作为响应:

  • HttpResponse对象 (render 函数)
  • HttpResponseRedirect对象 (redirect 函数)
  • JsonResponse对象

HttpResponseRedirect

redirect()函数类似,可以重定向到某个界面:

  • 它可以是一个完整的URL,例如: 'http://search.yahoo.com/'
  • 或者不包括域名的相对路径,例如:'/search'
  • 注意它返回HTTP 状态码 302。




JsonResponse

JsonReponse: 给客户端请求返回json格式的数据

  • 应用场景:网页的局部刷新(ajax技术)
  • 类JsonResponse继承自HttpResponse,被定义在django.http模块中
  • 接收字典作为参数
  • JsonResponse对象的 content-type 为 application/json


状态保存

  • 浏览器请求服务器是无状态的: 无状态指一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求。无状态的应用层面的原因是:浏览器和服务器之间的通信都遵守HTTP协议。根本原因是:浏览器与服务器是使用Socket套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的Socket连接,而且服务器也会在处理页面完毕之后销毁页面对象。

  • 但是: 有时服务器需要保存用户的浏览状态,比如: 用户是否登录过,用户浏览过哪些商品等

  • 解决:cookie和session

Cookie

一、Cookie介绍

  • Cookie是什么?

    • Cookie是由服务器生成的,存储在浏览器端的少量数据(键值对)
    • 服务器生成Cookie后,会在响应请求时发送Cookie数据给浏览器,浏览器接收到后会自动保存
    • 浏览器再次请求服务器时,会自动上传该服务器生成的所有的Cookie
    • Cookie是有过期时间的,默认关闭浏览器之后Cookie就会过期
    • 每个域名下保存的Cookie的个数是有限制的(50个),不同浏览器保存的个数不一样;
    • 每个Cookie保存的数据大小是有限制的(4K),不同的浏览器保存的数据大小不一样;

    • Cookie是基于域名安全的:

      • Cookie的存储是以域名的方式进行区分的;
      • 每个网站只能读取自己生成的Cookie,而无法读取其它网站生成的Cookie;
      • 浏览器请求某个网站时,会自动携带该网站所有的Cookie数据给服务器,但不会携带其它网站生成的Cookie数据。


二、Cookie操作:

在Django中Cookie的读写:

  • 读取数据

    request.COOKIES['键名']
    或者:
    request.COOKIES.get('键名')
    
  • 保存数据

    response.set_cookie('键名', countmax_age, expires)
    
    • max_age是一个整数,表示在指定秒数后过期
    • expires是一个datetime或timedelta对象,会话将在这个指定的日期/时间过期
    • max_age与expires二选一
    • 如果不指定过期时间,在关闭浏览器时cookie会过期


Session

一、Session介绍

  • 一些重要敏感的数据(银行卡账号,余额,验证码...),应该存储在服务器端,而不是存储在浏览器,这种在服务器端进行状态数据保存的方案就是Session

  • Session的使用依赖于Cookie,如果浏览器不能保存Cookie,那么Session则失效了

  • django项目有session模块,默认开启session功能,会自动存储session数据到数据库表中

  • Session也是有过期时间的,如果不指定,默认两周就会过期

二、Session的使用

  1. 开启session功能

    在django项目中,session功能默认是开启的;要禁用session功能,则可禁用下图中的session中间件:


2、session对象操作(request.session字典)

  • 保存session数据(键值对)

    request.session['键']=值
    
  • 读取session数据

    request.session.get('键',默认值)
    
  • 清除session数据数据:

    request.session.clear()
    或者:
    request.session.flush()
    
  • 删除指定的sessoin键值对数据(注意:键不存在会报错KeyError)

    del request.session['键']
    
  • 设置会话的超时时间,如果没有指定过期时间则两个星期后过期

    request.session.set_expiry(value)
    
    • 如果value是一个整数,会话将在value秒没有活动后过期。
    • 如果value为0,那么用户会话的Cookie将在用户的浏览器关闭时过期。
    • 如果value为None,那么会话永不过期。

三、session存储方式

Session数据可以存储在数据库、内存、Redis等,可以通过在项目的setting.py中设置SESSION_ENGINE项,指定Session数据存储的方式。

  • 存储在数据库中,如下设置可以写,也可以不写,这是默认存储方式。

    SESSION_ENGINE='django.contrib.sessions.backends.db'
    
  • 存储在内存中:存储在本机内存中,如果丢失则不能找回,比数据库的方式读写更快

    SESSION_ENGINE='django.contrib.sessions.backends.cache'
    
  • 混合存储:优先从本机内存中存取,如果没有则从数据库中存取。

    SESSION_ENGINE='django.contrib.sessions.backends.cached_db' 
    
  • 通过Redis存储session

联系方式

QQ:1217675462
欢迎交流


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值