Django中的Cookie--实现登录

Django Cookie 

Cookie

Cookie 是什么

保存在浏览器端的键值对,让服务器提取有用的信息。

为什么要有 Cookie

因为HTTP请求是无状态的。

无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况。

状态可以理解为客户端和服务器在某次会话中产生的数据,那无状态的就以为这些数据不会被保留。会话中产生的数据又是我们需要保存的,也就是说要“保持状态”。因此Cookie就是在这样一个场景下诞生。

Cookie 的原理

服务端可以在返回响应的时候 做手脚
在浏览器上写入键值对(Cookie)

浏览器发送请求的时候会自动携带该网站保存在我浏览器的键值对(Cookie)

Chrome 上查看 Cookie

查看Cookie

Django 中操作 Cookie

设置 Cookie

只有响应对象才能设置 Cookie

# 响应对象
rep = HttpResponse(...)
rep = render(request, ...)
rep = redirect(...) # 不加密方式设置Cookie
rep.set_cookie(key,value,...) # 加密方式设置Cookie
rep.set_signed_cookie(key,value,salt='加密盐',...)

参数

  • key, 键
  • value='', 值
  • max_age=None, 超时时间
  • expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)
  • path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的 cookie 可以被任何url的页面访问
  • domain=None, Cookie 生效的域名
  • secure=False, https 传输
  • httponly=False 只能 http 协议传输,无法被 JavaScript 获取(不是绝对,底层抓包可以获取到也可以被覆盖)

获取 Cookie

  1. 不加密的 Cookie 获取:

    request.COOKIES['key']
    request.COOKIES.get('key')
  2. 加密的 Cookie 获取
    request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)

    参数:

    • default: 默认值
    • salt: 加密盐
    • max_age: 后台控制过期时间

删除 Cookie

删除 Cookie 操作大多是在注销时用的,也是 通过响应对象删除

def logout(request):
# 删除cookie,操作的是响应对象,最后需要返回
rep = redirect("/app01/login/")
rep.delete_cookie("is_login")
return rep

Cookie 版登录代码

from django.shortcuts import render, redirect

# 导入用于装饰器修复技术的包
from functools import wraps
# Create your views here. # 装饰器函数,用来判断是否登录
def check_login(func):
@wraps(func) # 装饰器修复技术
def inner(request, *args, **kwargs):
ret = request.get_signed_cookie("is_login", default="0", salt="ban")
if ret == "1":
# 已经登录,继续执行
return func(request, *args, **kwargs)
# 没有登录过
else:
# ** 即使登录成功也只能跳转到home页面,现在通过在URL中加上next指定跳转的页面
# 获取当前访问的URL
next_url = request.path_info
return redirect("/app01/login/?next={}".format(next_url))
return inner def login(request):
if request.method == "POST":
username = request.POST.get("username")
pwd = request.POST.get("pwd")
next_url = request.GET.get("next") if username == "alex" and pwd == "dsb":
# return redirect("/home/")
# 服务器返回的响应对象 # 通过URL中的next参数指定跳转的页面,如果为空,默认跳转到home页面
if next_url:
rep = redirect(next_url)
else:
print("ban")
rep = redirect("/app01/home/") # 1. 设置cookie
# rep.set_cookie("is_login", "1") # 2. 设置加盐cookie,max_age是cookie的生存时间
rep.set_signed_cookie("is_login", "1", salt="ban", max_age=100)
return rep return render(request, "app01/login.html") def home(request):
# 获取cookie并判断
# if request.COOKIES.get("is_login", 0) == "1":
# 获取加盐cookie并判断
ret = request.get_signed_cookie("is_login", default="0", salt="ban")
if ret == "1":
return render(request, "app01/home.html")
else:
return redirect("/app01/login/") # 注销函数
def logout(request):
# 删除cookie,操作的是响应对象,最后需要返回
rep = redirect("/app01/login/")
rep.delete_cookie("is_login")
return rep @check_login
def index(request):
return render(request, "app01/index.html")

参考:https://www.cnblogs.com/liwenzhou/p/8343243.html
GitHub地址:https://github.com/protea-ban/oldboy/tree/master/s9day71/xiawu

Django中的Cookie--实现登录的更多相关文章

  1. {Django基础八之cookie和session}一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session

    Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx 七 ...

  2. django中操作cookie与session

    cookie 什么是Cookie Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息. Cookie的 ...

  3. Django中的Session--实现登录

    Django中的Session--实现登录 Django Session  Session Session 是什么 Session保存在服务端的键值对. 为什么要有 Session Cookie 虽然 ...

  4. Django中的Cookie、Session、Token

    Cookie : 指望着为了辨别用户身份.进行会话跟踪而存储在用户本地的数据(通常经过加密),是由服务端生成,发送给客户端浏览器,浏览器会将Cookie以key/value保存,下一请求同一网站是就发 ...

  5. Django 中的 cookie 和 session

    一.cookie 由于HTTP协议是无状态的,而服务器端的业务必须是要有状态的.Cookie诞生的最初目的是为了存储web中的状态信息,以方便服务器端使用.比如判断用户是否是第一次访问网站.目前最新的 ...

  6. Django中的cookie与session

    cookie与session的实现原理 HTTP被设计为”无状态”,每次请求都处于相同的空间中. 在一次请求和下一次请求之间没有任何状态保持,我们无法根据请求的任何方面(IP地址,用户代理等)来识别来 ...

  7. Django中的cookie和session

    前言 HTTP协议 是短连接.且状态的,所以在客户端向服务端发起请求后,服务端在响应头 加入cokie响应给浏览器,以此记录客户端状态: cook是来自服务端,保存在浏览器的键值对,主要应用于用户登录 ...

  8. 【转】Django中的cookie与session

    转自:https://www.cnblogs.com/chenchao1990/p/5283725.html cookie与session的实现原理 HTTP被设计为”无状态”,每次请求都处于相同的空 ...

  9. 如何使用django中的cookie和session?

    1.Cookie 介绍 Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Co ...

随机推荐

  1. 动态执行SQL语句,接收返回值

    一.exec和sp_executesql介绍 当需要根据外部输入的参数来决定要执行的SQL语句时,常常需要动态来构造SQL查询语句.比如,一个比较通用的分页存储过程,可能需要传入表名,字段,过滤条件, ...

  2. web02

    高内聚,低耦合 写what 不写how 我们只关心他是什么,得到什么,我们并不关心怎么去得到的 ,那个细节去怎么得的, 都应该在这个层面上屏蔽掉,要关心的时候在点进去,这样就一层层的结构良好的代码 d ...

  3. MDK5使用技巧

    1.文本美化 修改 修改字体以及颜色如下: 修改用户自定义的关键字,如下: 代码编辑技巧 1.TAB键的妙用 使用TAB键可以整体向右移动相应位,使用SHIFT+TAB键整体左移相应位. 2.快速定位 ...

  4. 如何让多个android listview同时使用一个滚动条

    如何让多个android listview同时使用一个滚动条 重新设置ListView的高度 /** * 设置listview高度,注意listview子项必须为LinearLayout才能调用该方法 ...

  5. 获取weibo用户所有的关注列表

    1.新浪微博Python SDK笔记——获取粉丝列表或关注列表 http://www.tuicool.com/articles/VnQ3ye 2.friendships/friends关注列表 fri ...

  6. viewDidAppear在何时调用?

    [viewDidAppear在何时调用] If the view belonging to a view controller is added to a view hierarchy directl ...

  7. python使用git进行版本控制-分支管理

    1.远程克隆 最好的方式是先创建远程库,然后,从远程库克隆: 首先在github上创建一个新的仓库,名字叫gitskills 我们勾选Initialize this repository with a ...

  8. Layout布局源码浅析之——FrameLayout

    一直想研究下安卓各种布局控件,FrameLayout是安卓最简单的界面布局,所以就从FrameLayout讲起. 1.属性.frameLayout继承ViewGroup,除了拥有ViewGroup的属 ...

  9. zookeeper的主要应用

    master选举 数据发布和订阅 负载均衡

  10. .NET Core调用WCF的最佳实践

    现在.NET Core貌似很火,与其他.NET开发者交流不说上几句.NET Core都感觉自己落伍了一样.但是冷静背后我们要也看到.NET Core目前还有太多不足,别的不多说,与自家的服务框架WCF ...