#TCP,HTTP通讯协议 Response、Request库 Cookie、Session、Token会话工具 crfs
HttpRequest
服务器在接受到http请求后,会根据报文创建httprequest对象,视图中第一个参数就是httprequest对象
django框架会进行自行包装,之后床底给视图
request
属性
path:请求的完整路径
method:请求的方法
encoding:编码方式
GET:类似字典参数,包含了get的所有参数
POST:类似该带你的参数,包含了post所有参数
###FILES:类似字典的参数,包含看上传的文件:
会话技术
解决度武器如何识别客户端的问题
http在web开发中基本都是短链接即从request开始response结束
一、Cookie
客户端技术,将数据信息存储到浏览器中,存储的结构是字典结构,即key-value.
Cookie是服务端创建,但保存于客户端,客户端每次发送请求时都会将Cookie信息发送到服务器(因为Cookie是请求头信息的一部分)
Cookie不支持中文,不能跨浏览器,不能跨域名
1、设置cookie
set_cookie(key, value=’’, max_age=None, expires=None, path=’/’, domain=None, secure=None, httponly=False)
set_signed_cookie(key, value, salt=’’, max_age=None, expires=None, path=’/’, domain=None, secure=None, httponly=True)设置加密的cookie,salt是秘钥
key: cookie的name
value:cookie的值
max_age:cookie存活时间,单位是秒
expires:具体过期时间
path:cookie的访问路径,只有在某个路径下访问
domain:域名,只有在某个域名下访问
secure:安全
httpoly:如果为True那么js就不能获取cookiemax-age 有效时长,单位为秒,指定为0,表示关闭浏览器失效(默认)指定为有效数值100表示100秒后自动失效,设置为None永不过期
expires 支持一个datetime或timedelta,可以指定一个具体的日期,expires=timedelta(days=10)表示十天后过期
max-age和xepires两个指定一个
# 普通设置,以明文的方式显示 def setcookie(request): response = HttpResponse('设置COOKIE成功') response.set_cookie('name','egon') return response
#加盐设置,以加密的形式显示 def do_login(request): uname = request.POST.get('uname') response = HttpResponseRedirect(reverse('app:mine')) # response.set_cookie('uname', uname, max_age=60) response.set_signed_cookie('content', uname, "Rock") return response
2、获取
HttpRequest.COOKIES.get(key)
request.get_signed_cookie(“cookie名称”,salt=“盐”)
def getcookie(request): return HttpResponse(request.COOKIES.get('name'))
def mine(request): # uname = request.COOKIES.get("content") try: uname = request.get_signed_cookie("content", salt="Rock") if uname: # return HttpResponse(uname) return render(request, 'mine.html', context={"uname": uname}) except Exception as e: print("获取失败") return redirect(reverse('app:login'))
3、删除
response.delete_cookie(key)
def logout(request): response = redirect(reverse("app:login")) response.delete_cookie("content") return response
二、Session
Session是用来表示一个用户与服务端的一次“会话”。使用客户端发送的sessionid(存在与Cookie中)与服务端的sessionid匹配,找到客户端请求所属的“会话”,经常用于登录验证。
Session一般保存在内存中,在Django中,Session默认使用数据库保存,若想变更Session的保存方式,需要添加SESSION_ENGINE配置信息,可以将session保存到redis中。
Django 默认 Session 数据保存到数据库中,可以在 settings.py 中看到配置信息项目。
INSTALLED_APPS = [ # 启用 sessions 应用 'django.contrib.sessions', ] MIDDLEWARE = [ # 启用 Session 中间层 'django.contrib.sessions.middleware.SessionMiddleware', ]
除了上述的基于数据库的会话,Django 还提供另外三种方法:
1)保存到缓存中
如果你的场景需要快速存储会话,可以选择该方案。使用之前,需要配置下 Django 的缓存框架。在 settings.py 中增加 SESSION_ENGINE 配置。这其中也是有两种保存数据的方案,具体配置如下:
- 方案一
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
这种配置方案 Django 只是简单保存会话。同时,这种方案持久性不好。因为当缓存数据存满时将清除部分数据,或者遇到缓存服务器重启时数据将丢失。
- 方案二
SESSION_ENGINE =