Django学习(二):Request对象、Response对象和Cookie、Session

概述

Django 使用Request 对象和Response 对象在系统间传递状态。

当请求一个页面时,Django会建立一个包含请求元数据的 HttpRequest 对象。 当Django 加载对应的视图时,HttpRequest 对象将作为视图函数的第一个参数。 每个视图会返回一个HttpResponse 对象。

 

一:HttpRequest对象

属性

HttpRequest.scheme -->一个字符串,表示请求的方案(通常是http 或https)

HttpRequest.body -->一个字节字符串,表示原始HTTP 请求的正文。 它对于处理非HTML 形式的数据非常有用:二进制图像、XML等。 如果要处理常规的表单数据,应该使用HttpRequest.POST。

HttpRequest.path -->表示请求页面的完整路径的字符串,不包括方案或域

HttpRequest.path_info -->在某些Web 服务器配置下,主机名后的URL 部分被分成脚本前缀部分和路径信息部分。 path_info 属性将始终只包含路径信息部分,不论使用的Web 服务器是什么。 使用它代替path 可以让代码在测试和开发环境中更容易地切换。

HttpRequest.method -->一个字符串,表示请求使用的HTTP 方法。 必须使用大写
HttpRequest.encoding -->一个字符串,表示提交的数据的编码方式
HttpRequest.content_type -->表示从CONTENT_TYPE头解析的请求的MIME类型的字符串。

HttpRequest.content_params -->包含在CONTENT_TYPE标题中的键/值对形式字典参数。

HttpRequest.GET -->一个类似于字典的对象(QueryDict对象),包含HTTP GET 的所有参数

HttpRequest.POST -->一个包含所有给定的HTTP POST参数的类字典对象,提供了包含表单数据的请求;POST 不包含文件上传信息

HttpRequest.FILES -->一个类似于字典的对象,包含所有上传的文件。 FILES中的每个键为中的name。 FILES中的每个值是一个UploadedFile对象。

注:上传文件时,

需要设置属性enctype="multipart/form-data"

HttpRequest.COOKIES -->包含所有Cookie的字典。 键和值都为字符串

HttpRequest.META -->包含所有可用HTTP标头的字典。 具体的头部信息取决于客户端和服务器

CONTENT_LENGTH —— 请求的正文的长度(是一个字符串)。
CONTENT_TYPE —— 请求的正文的MIME 类型。
HTTP_ACCEPT —— 响应可接收的Content-Type。
HTTP_ACCEPT_ENCODING —— 响应可接收的编码。
HTTP_ACCEPT_LANGUAGE —— 响应可接收的语言。
HTTP_HOST —— 客服端发送的HTTP Host 头部。
HTTP_REFERER —— Referring 页面。
HTTP_USER_AGENT —— 客户端的user-agent 字符串。
QUERY_STRING —— 单个字符串形式的查询字符串(未解析过的形式)。
REMOTE_ADDR —— 客户端的IP 地址。
REMOTE_HOST —— 客户端的主机名。
REMOTE_USER —— 服务器认证后的用户。
REQUEST_METHOD —— 一个字符串,例如"GET" 或"POST"。
SERVER_NAME —— 服务器的主机名。
SERVER_PORT —— 服务器的端口(是一个字符串)。

由应用程序代码设置的属性:
HttpRequest.current_app -->url模板标签将使用其值作为reverse()的current_app参数。
HttpRequest.urlconf -->这将用作当前请求的根URLconf,覆盖ROOT_URLCONF设置

 

由中间件设置的属性:
HttpRequest.session -->来自SessionMiddleware:一个可读写的,类似字典的对象,表示当前会话。
HttpRequest.user -->来自AuthenticationMiddleware:表示当前登录的用户的AUTH_USER_MODEL的实例。 如果用户当前未登录,则user将被设置为AnonymousUser的实例。 可以使用is_authenticated将它们分开

 

 

方法

HttpRequest.get_host()
返回请求的原始主机

当主机位于多个代理的后面,get_host() 方法将会失败。

HttpRequest.get_port()

返回请求的始发端口

HttpRequest.get_full_path()

返回path,以及加上查询字符串(如果适用)

HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
返回已签名cookie的cookie值;

可选参数salt 可以用来对安全密钥强力攻击提供额外的保护。 max_age 参数用于检查Cookie 对应的时间戳以确保Cookie 的时间不会超过max_age 秒

HttpRequest.is_secure()

是HTTPS请求则返回True

HttpRequest.is_ajax()
如果请求是通过XMLHttpRequest发起的,则返回True 

 

QueryDict对象

在HttpRequest对象中,GET和POST属性是django.http.QueryDict的实例

QueryDict 实现了字典的所有标准方法,因为它是字典的子类

QueryDict.get(key, default=None)

返回给出的key 的值。 如果键具有多个值,则返回最后一个值;如果该键不存在,则返回默认值

QueryDict.update(other_dict)

将条目添加到当前的字典,而并不会替换它们,即当key存在时,其原value也不会被替换,而是对此key再增加一个value

QueryDict.items()

以列表的形式返回所有的键值对二元组,如果键具有多个值,则返回最后一个值

QueryDict.values()

返回所有的值,如果键具有多个值,则返回最后一个值 (遵循的最后一个值逻辑)

QueryDict.getlist(key,default = None)

返回指定key的数据列表。 如果该键不存在并且未提供默认值,则返回一个空列表。

QueryDict.lists()

类似items(),只是它将字典中的每个成员的所有值作为列表返回。

QueryDict.pop(key)

返回给定键的值的列表,并从字典中移除它们。 如果键不存在,将引发KeyError

QueryDict.popitem()

删除字典任意一个成员,并返回二值元组,包含键和键的所有值的列表。 在一个空的字典上调用时将引发KeyError

QueryDict.dict()

返回QueryDict的dict表示,返回所有的键值对,如果键具有多个值,则返回最后一个值

QueryDict.urlencode(safe=None)
以查询字符串格式返回数据的字符串。如:'a=2&b=3&b=5'

 

二:HttpResponse对象

与由Django自动创建的HttpRequest 对象相比,HttpResponse 对象由程序员创建. 您编写的每个视图都负责实例化,填充和返回一个HttpResponse

属性

HttpResponse.content -->一个用来代替content的字节字符串
HttpResponse.charset -->一个字符串,用来表示response将会被编码的字符集
HttpResponse.status_code -->响应的状态码

HttpResponse.reason_phrase -->响应的HTTP原因短语

方法

HttpResponse.has_header(header)

通过检查首部中是否有给定的首部名称(不区分大小写),返回True 或 False

HttpResponse.setdefault(header, value)

设置一个首部,除非该首部 header 已经存在了

HttpResponse.set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=None, httponly=False)
设置一个Cookie;
max_age 以秒为单位;如果Cookie 只应该持续客户端浏览器的会话时长则应该为None(默认值)

如果想阻止客服端的JavaScript 访问Cookie,可以设置httponly=True

HttpResponse.set_signed_cookie(key, value, salt='', max_age=None, expires=None, path='/', domain=None, secure=None, httponly=True)
通常与HttpRequest.get_signed_cookie() 一起使用

HttpResponse.delete_cookie(key, path='/', domain=None)

删除带有指定的key 的Cookie

 

JsonResponse对象

class JsonResponse(data,encoder = DjangoJSONEncoder,safe = True,json_dumps_params = None ,** kwargs)

HttpResponse 的一个子类,帮助用来创建JSON 编码的响应

它的默认Content-Type 头部设置为application/json。
它的第一个参数data,应该为一个dict 实例。布尔参数safe 默认为True。 如果设置为False,可以传递任何对象进行序列化(否则,只允许dict 实例)

注:返回带中文字符的字符串时,想要前端页面正常显示中文,则需添加参数JsonResponse(data, json_dumps_params={'ensure_ascii':False})

 

三:Cookie&Session

1,Cookie

Cookie(复数形态Cookies),中文名称为“小型文本文件”,指某些网站为了辨别用户身份而储存在用户本地终端上的数据(通常经过加密)。由网景公司的前雇员卢·蒙特利在1993年3月发明

因为HTTP协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现。
Cookie就是用来绕开HTTP的无状态性的“额外手段”之一。服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。

Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie。
内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的。

硬盘Cookie保存在硬盘里,有一个过期时间,除非用户手工清理或到了过期时间,硬盘Cookie不会被删除,其存在时间是长期的。

Cookie的缺陷:
①Cookie会被附加在每个HTTP请求中,所以无形中增加了流量。
②由于在HTTP请求中的Cookie是明文传递的,所以安全性成问题,除非用HTTPS。

③Cookie的大小限制在4KB左右,对于复杂的存储需求来说是不够用的

2,Session

Cookie机制采用的是在客户端保持状态的方案,而Session机制采用的是在服务器端保持状态的方案。

Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;

Cookie是实现Session的一种方式。

Session工作原理简述:

服务器检查客户端的请求里(一般是在Cookie里)是否包含一个session标识 - 称为session id,如果已包含一个session id则说明之前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用;如果客户端请求不包含session id,则为此客户端创建一个session(即在session表中增加一条记录),并把生成的session id加入响应的Cookie中。

由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面

 

四:Django中的Cookie与Session

 

Django 提供对匿名会话的完全支持。

会话是通过一个middleware实现的,
即MIDDLEWARE设置中的django.contrib.sessions.middleware.SessionMiddleware

 

操作Cookie

HttpResponse.set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=None, httponly=False)
设置一个Cookie;

max_age 以秒为单位;如果Cookie 只应该持续客户端浏览器的会话时长则应该为None(默认值)。

HttpResponse.set_signed_cookie(key, value, salt='', max_age=None, expires=None, path='/', domain=None, secure=None, httponly=True)
设置一个签名Cookie;
通常与HttpRequest.get_signed_cookie() 一起使用。

HttpResponse.delete_cookie(key, path='/', domain=None)

删除带有指定的key 的Cookie

 

HttpRequest.COOKIES -->包含所有Cookie的字典。 键和值都为字符串

HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
返回签名过的Cookie 对应的值,如果签名不再合法则返回django.core.signing.BadSignature。 如果提供default 参数,将不会引发异常并返回default 的值。

可选参数salt 可以用来对安全密钥强力攻击提供额外的保护。 max_age 参数用于检查Cookie 对应的时间戳以确保Cookie 的时间不会超过max_age 秒

 

HttpRequest.session

当SessionMiddleware 激活时,每个HttpRequest 对象 —— 传递给Django 视图函数的第一个参数 —— 将具有一个session 属性,它是一个类字典对象。

class backends.base.SessionBase

这是所有会话对象的基类。具有标准的字典方法。

SessionBase方法:

get(key, default=None) -->如 fav_color = request.session.get('fav_color', 'red')
pop(key, default=__not_given) -->如 fav_color = request.session.pop('fav_color', 'blue')

set_test_cookie()-->设置一个测试的Cookie 来验证用户的浏览器是否支持Cookie。 因为Cookie 的工作方式,只有到用户的下一个页面才能验证。
test_cookie_worked()-->返回True 或False,取决于用户的浏览器是否接受测试的Cookie。

delete_test_cookie()-->删除测试的Cookie。 使用这个函数来自己清理

flush()-->从会话中删除当前会话数据,并删除会话cookie。 这用于确保前面的会话数据不可以再次被用户的浏览器访问

set_expiry(value)-->设置会话的超时时间
如果value是一个整数,会话将在这么多秒没有活动后过期;
若果value是一个datetime或timedelta 对象,会话将在这个指定的日期/时间过期;
如果value为0,那么会话的Cookie将在用户的浏览器关闭时过期;

如果value为None,那么会话转向使用全局的会话过期策略

get_expiry_age()-->返回会话离过期的秒数。 对于没有自定义过期的会话(或者设置为浏览器关闭时过期的会话),它将等于SESSION_COOKIE_AGE。

get_expiry_date()-->返回过期的日期。 对于没有自定义过期的会话(或者设置为浏览器关闭时过期的会话),它将等于从现在开始SESSION_COOKIE_AGE秒后的日期。

clear_expired()-->从会话的存储中清除过期的会话

 

补充:

1,使用数据库支持的会话,需要添加'django.contrib.sessions' 到INSTALLED_APPS设置中

2,设置SESSION_ENGINE为"django.contrib.sessions.backends.cached_db":持久的缓存数据
设置SESSION_ENGINE 为"django.contrib.sessions.backends.cache":简单的缓存会话存储,缓存数据将可能不会持久

设置SESSION_ENGINE 为"django.contrib.sessions.backends.signed_cookies":使用基于Cookie 的会话

3,默认情况下,Django使用JSON序列化会话数据。 您可以使用SESSION_SERIALIZER设置自定义会话序列化格式

4,默认情况下,SESSION_EXPIRE_AT_BROWSER_CLOSE设置为False,表示会话的Cookie 保存在用户的浏览器中的时间为SESSION_COOKIE_AGE。 

如果SESSION_EXPIRE_AT_BROWSER_CLOSE 设置为True,Django 将使用浏览器时长的Cookie —— 用户关闭他们的浏览器时立即过期。 

5,Django 会话框架完全地、唯一地基于Cookie。 它不像PHP一样,实在没办法就把会话的ID放在URL 中。

 

 

你可能感兴趣的:(Django学习(二):Request对象、Response对象和Cookie、Session)