一、

1、cookie的由来!!!

    由于HTTP协议是无状态的,既每一次的请求都是独立的,他不会因为你之前来过,就记住你,所以每次浏览器去访问服务器的时候,都是一个全新的过程,之前的数据也不会保留,所以为了解决这个问题,cookie诞生了。

2、什么是cookie?

    Cookie具体指的是一段小信息,他是服务器发送出来存储在浏览器一组键值对,下次访问浏览器时会自动携带这些键值对,以便服务器提取信息。简单来说就是,Cookie会在你访问服务器时给你一个标记,下一次你再来访问只要携带这个标记,就能够访问了。所以他只认标记,不认用户。用的最普遍的就是做登录系统。

3、Cookie的工作原理。

    原理:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断是谁了。

4、查看cookie

    Name 和 Value就是键值对

二、Djangoz中操作Cookie

  1、获取cookie   

request.COOKIES['key']
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)

  参数:

    default:默认值

    salt:加密盐

    max_age:生命周期

  2、设置cookie

ret = render (request,'html文件')
ret.set_cookie('key','value')
return ret

    通过set_cookie,这样就对ret 设置了cookie。

   参数:

      key:键

      value:值

      max_age=None,超时时间

      expires = None,超时时间,用于IE浏览器的

      path='/':Cookie生效的路径,/表示根路径,他比较特殊。根路径的cookie可以被任何url页面访问。

      domain = None,cookie生效的域名

      secure= False:https传输

      httponly = False:只能http协议传输,无法被JavaScript获取。(不是绝对的,底层抓包可以获取到,也可以被覆盖)

  3、删除cookie

def logout(request):
rep = redirect("/login/")
rep.delete_cookie("key") # 删除用户浏览器上之前设置的cookie
return rep

  4、Cookie版登录校验的示例

from django.shortcuts import render, redirect, HttpResponse

# 这是一个装饰器,封装了一个匹配cookie的功能
def login_required(fn):
def inner(request, *args, **kwargs):
if not request.COOKIES.get('is_login') == '': # 获取cookie的键'is_login',判断它的值是不是1,如果不是就获通过path_info获取到域名之后的路径next
next = request.path_info # cookie匹配不上,就跳转到登录界面,不过这个登录界面拼接了路径。/login/?next={}'.format(next),
# 拼接的后缀就是为了能够确保,从哪个页面失败人后进入的登录界面,登陆成功后跳回对应的页面
return redirect('/login/?next={}'.format(next))
ret = fn(request, *args, **kwargs) # 如果匹配成功,就跳转到被装饰得页面。 return ret return inner # 这是一个登录函数
def login(request):
if request.method == 'POST': # 判断请求方法,是POST方法,执行下面的操作
user = request.POST.get('user')
pwd = request.POST.get('pwd')
if user == 'alex' and pwd == 'alexdsb': # 如果用户名和密码匹配成功了
next = request.GET.get('next') # 通过GET方法,获取next。 if next: # 如果next有值,说明不是直接进的登录界面,而是访问其他路径,没有成功,通过装饰器拼接了next跳转过来的
ret = redirect(next) # next有值,就跳到next这个路径下
else: # 如果next没有值,说明是直接进入的登录界面,登陆成功后,直接跳转到'/index/'界面
ret = redirect('/index/') ret.set_cookie('is_login', '', max_age=5) # 设置cookie值cookie('键','值','最大死亡时间')
return ret return render(request, 'login.html') @login_required
def home(request): # 被装饰器装饰的函数,
return HttpResponse('这是home页面') @login_required
def index(request):
return render(request, 'index.html') # 注销函数
def logout(request):
ret = redirect('/login/') ret.delete_cookie('is_login') # 删除cookie之后,跳转回登录页面 return ret

三、Session

  1、Session的由来

    由于Cookie是存在浏览器上的,所以很不安全,随时可能被拦截和窃取,同时Cookie最大支持4096个字节,多了就没法存储了。这时,为了解决这个问题,提高cookie的安全性,有了Session。它能够支持更多的字节,并且把保存在服务器上,有较高的安全性。  

     由于HTTP是无状态的,所以服务器也不知道是谁再访问,所以就需要Cookie做桥接。给每个客户端的Cookie分配一个唯一的ID,这样用户在访问时,通过Cookie,服务器就知道来的认识谁。

   2、Django中Session的用法

    1、

# 获取、设置、删除Session中数据
request.session['k1']
request.session.get('k1',None)
request.session['k1'] = 123
request.session.setdefault('k1',123) # 存在则不设置
del request.session['k1'] # 所有 键、值、键值对
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems() # 会话session的key
request.session.session_key # 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired() # 检查会话session的key在数据库中是否存在
request.session.exists("session_key") # 删除当前会话的所有Session数据
request.session.delete()
  
# 删除当前的会话数据并删除会话的Cookie。
request.session.flush()
这用于确保前面的会话数据不可以再次被用户的浏览器访问
例如,django.contrib.auth.logout() 函数中就会调用它。 # 设置会话Session和Cookie的超时时间
request.session.set_expiry(value)
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。

  3、Session流程解析

  3、Session版登录验证

from functools import wraps

def check_login(func):
@wraps(func)
def inner(request, *args, **kwargs):
next_url = request.get_full_path()
if request.session.get("user"):
return func(request, *args, **kwargs)
else:
return redirect("/login/?next={}".format(next_url))
return inner def login(request):
if request.method == "POST":
user = request.POST.get("user")
pwd = request.POST.get("pwd") if user == "alex" and pwd == "alex1234":
# 设置session
request.session["user"] = user
# 获取跳到登陆页面之前的URL
next_url = request.GET.get("next")
# 如果有,就跳转回登陆之前的URL
if next_url:
return redirect(next_url)
# 否则默认跳转到index页面
else:
return redirect("/index/")
return render(request, "login.html") @check_login
def logout(request):
# 删除所有当前请求相关的session
request.session.delete()
return redirect("/login/") @check_login
def index(request):
current_user = request.session.get("user", None)
return render(request, "index.html", {"user": current_user}) Session版登录验证

Session 版登录验证

最新文章

  1. favicon.ico 404的问题(title栏前面的图标)
  2. jsf初学解决faces 中文输入乱码问题
  3. 洛谷P1901 发射站
  4. UVM Top Testbench
  5. Verilog之串口(UART)通信
  6. Careercup - Google面试题 - 6271724635029504
  7. socket.io的抽象实现:engine.io
  8. Java事务处理总结
  9. 【LA2796】Concert Hall Scheduling(最大费用最大流)
  10. (转)yum 和 apt-get 用法及区别
  11. Servlet的学习之Session(2)
  12. 【javascript】函数中的this的四种绑定形式
  13. conda虚拟环境实践
  14. 题解 P2763 【试题库问题】
  15. Facebook授权登录
  16. 【AI】神经网络基本词汇
  17. 报错500 DEFAULT_INCOMPATIBLE_IMPROVEMENTS
  18. python 遍历enumerate
  19. python实战——网络爬虫
  20. rails 中http请求发生access-control-allow-origin错误

热门文章

  1. Centos7 安装配置优化mysql(mariadb分支)
  2. [POJ1741]Tree(点分治模板)
  3. spring之Annotation
  4. 启动第一个 KVM 虚机
  5. 易语言报错:无法定位链接器!请检查 tools\link.ini 中的配置是否正确。 静态连接失败
  6. 标准C程序设计七---03
  7. 【笔记】Linux内核中的循环缓冲区
  8. BZOJ 3675 [Apio2014]序列分割 (斜率优化DP)
  9. 【WEB基础】HTML & CSS 基础入门(6)超链接
  10. ubuntu下安装jdk、tomcat、mysql