Django组件之cookie与session的使用方法


Posted in Python onJanuary 10, 2019

一、引子

http协议是无状态的,就是它不会记录请求和响应的任何信息,比如你访问一个服务器的一个网页时,先要你登录一下,然后进入网页,但当你要进入这个服务器的另一个网页时,它照常不会知道刚才你已经登录过了,又要让你登录一下,就是一个bug。但是,你说你每次上网的时候,只需要登录一下就行了,并没有我说的让你每次都登录,这是会话路径技术帮你记录了你的登录信息,现在我们们就来讲讲Django的会话路径技术cookie和session,实现会话追踪。

二、cookie

cookie是key-value结构,类似于一个字典。随着服务器的响应发送给客户端浏览器,然后客户端浏览器会把cookie保存起来,当下一次再访问服务器时把cookie再发送给服务器。

Django组件之cookie与session的使用方法

语法:

response.set_cookie()   #这是设置cookie值
 request.COOKIES      #取cookie值

基于cookie的登录页面和主页面

def login(request):    #登录视图
  if request.method=="GET":   
    return render(request,"login.html")
  else:
    user = request.POST.get("user")
    pwd = request.POST.get("pwd")

    user_obj=UserInfo.objects.filter(name=user,pwd=pwd).first()
    if user_obj:     用户验证成功后,设置cookie值,响应给浏览器,浏览器会保存cookie
      # obj=HttpResponse("登录成功!")
      obj=redirect("/index/")
      obj.set_cookie("is_login",True,20)
      obj.set_cookie("username",user)
      return obj
    return HttpResponse("Error!")

def index(request):   #进入主页面视图

  print("request.COOKIES",request.COOKIES)
  is_login=request.COOKIES.get("is_login")  #首先取到cookie值,对值进行判断
  username=request.COOKIES.get("username")

  if not is_login: # 值为空时,执行这里,说明之前没有登录过,重定向到登录页面
    return redirect("/login/")

  return render(request,"index.html",{"username":username})

三、session

上面的cookie是浏览器端保存的,现在的session是基于cookie的,但是保存在服务器端的技术,服务器在运行时可以为每一个访问的浏览器设置一个session,然后保存在Django下的Django_session表中。

Django组件之cookie与session的使用方法

语法:

request.session["k1"]="v1"   设置session值
 request.session.get("k1")   取session值
 request.session.flush()    清空session值

基于session的登录页面和主页面的访问

def login(request):
  if request.method=="GET":
    return render(request,"login.html")
  else:
    user = request.POST.get("user")
    pwd = request.POST.get("pwd")
    user_obj=UserInfo.objects.filter(name=user,pwd=pwd).first()
    if user_obj:
      request.session["is_login"]=True
      request.session["username"]=user
      return redirect("/index/")
    return HttpResponse("Error!")def index(request):
  is_login=request.session.get("is_login")
  username=request.session.get("username")if not is_login:
    return redirect("/login/")
  return render(request,"index.html",{"username":username})

四、图片验证码的实现

HTML文件:登录页面

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <link rel="stylesheet" href="/static/css/bootstrap.css" rel="external nofollow" >
  <script src="/static/jquery-3.3.1.js"></script>
  <script src="/static/js/bootstrap.js"></script>
</head>
<body>
{% csrf_token %}
<div class="container">
  <div class="row">
    <div class="col-md-5">
      <div style="color: blue;font-size: 20px">登录页面</div>
      <div class="form-group">
        名字 <input type="text" name="user" class="form-control">
      </div>
      <div class="form-group">
        密码 <input type="password" name="pwd" class="form-control">
      </div>
      <div class="row form-group">
        <div class="col-md-6">验证码<input type="text" name="yan" class="form-control"></div>
        <div class="col-md-6" style="line-height:60px"><img src="/img_drow/" alt="" width="200" height="40"></div>
      </div>
      <button class="login">登录</button>
      <p style="color: red;font-size: 30px"></p>
    </div>
  </div>
</div>
  <script>
    $('.login').click(function () {
      var name = $('[name="user"]').val();
      var pw = $('[name="pwd"]').val();
      var yan = $('[name="yan"]').val();
      $.ajax({
        url: '/login/',
        type: 'post',
        data: {csrfmiddlewaretoken: $('[name="csrfmiddlewaretoken"]').val(), user: name, pwd: pw, yan: yan},
        success: function (data) {
          if (data == '200') {
            location.href = '/books/'
          }
          else if (data == '100') {
            $('p').html('用户名或密码输入错误')
          }
          else {
            $('p').html('验证码错误');
             var num=Math.random();
            $('img').attr('src', '/img_drow?'+num)
          }
        }
      })
    });
    $('img').click(function () {
      var num=Math.random();
      $(this).attr('src', '/img_drow?'+num)
    })
  </script>
</body>
</html>

views:

产生随机图片验证的视图函数
import random
from PIL import Image,ImageDraw,ImageFont
from io import BytesIO
def get_random_color():
  return random.randint(0,255),random.randint(0,255),random.randint(0,255)
def img_drow(request):
  img=Image.new('RGB',(200,40),get_random_color())
  draw=ImageDraw.Draw(img)
  font=ImageFont.truetype('static/fonts/kumo.ttf',34)
  keep_str=''
  for i in range(5):
    num=str(random.randint(0,9))
    lower=chr(random.randint(65,90))
    upper=chr(random.randint(97,122))
    random_char=random.choice([num,lower,upper])
    draw.text((i*30+50,0),random_char,get_random_color(),font=font)
    keep_str+=random_char
  width = 200
  height=40
  for i in range(10):
    x1=random.randint(0,width)
    x2=random.randint(0,width)
    y1=random.randint(0,height)
    y2=random.randint(0,height)
    draw.line((x1,y1,x2,y2),fill=get_random_color())
  for i in range(10):
    draw.point([random.randint(0, width), random.randint(0, height)], fill=get_random_color())
    x = random.randint(0, width)
    y = random.randint(0, height)
    draw.arc((x, y, x + 4, y + 4), 0, 90, fill=get_random_color())
  request.session['keep_str']=keep_str
  f=BytesIO()
  img.save(f,'png')
  data=f.getvalue()
  return HttpResponse(data)
def login(request):
  if request.method=='GET':
    return render(request,'login.html')
  else:
    yan=request.POST.get('yan')
    if yan.upper()==request.session.get('keep_str').upper():
      user=request.POST.get('user')
      pwd=request.POST.get('pwd')
      obj=UserInfo.objects.filter(name=user,pwd=pwd).first()
      if obj :
        request.session['state']=True
        request.session['user']=user
        return HttpResponse('200')
      else:
        return HttpResponse('100')
    else:
      return HttpResponse('300')

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中几个比较常见的名词解释
Jul 04 Python
windows下python安装pip图文教程
May 25 Python
实例讲解Python爬取网页数据
Jul 08 Python
Django跨域请求CSRF的方法示例
Nov 11 Python
Python 带有参数的装饰器实例代码详解
Dec 06 Python
python实现可逆简单的加密算法
Mar 22 Python
python3实现猜数字游戏
Dec 07 Python
python或C++读取指定文件夹下的所有图片
Aug 31 Python
Python程序控制语句用法实例分析
Jan 14 Python
深入分析python 排序
Aug 24 Python
python的数学算法函数及公式用法
Nov 18 Python
Django+Nginx+uWSGI 定时任务的实现方法
Jan 22 Python
通过python的matplotlib包将Tensorflow数据进行可视化的方法
Jan 09 #Python
python pcm音频添加头转成Wav格式文件的方法
Jan 09 #Python
python基于C/S模式实现聊天室功能
Jan 09 #Python
python 通过麦克风录音 生成wav文件的方法
Jan 09 #Python
Python 利用pydub库操作音频文件的方法
Jan 09 #Python
Python简单过滤字母和数字的方法小结
Jan 09 #Python
使用python批量化音乐文件格式转换的实例
Jan 09 #Python
You might like
社区(php&amp;&amp;mysql)一
2006/10/09 PHP
教你在header中隐藏php的版本信息
2016/08/10 PHP
Kindeditor编辑器添加图片上传水印功能(php代码)
2017/08/03 PHP
laravel框架语言包拓展实现方法分析
2019/11/22 PHP
Javascript var变量隐式声明方法
2009/10/19 Javascript
jQuery 通过事件委派一次绑定多种事件,以减少事件冗余
2010/06/30 Javascript
jQuery的each终止或跳过示例代码
2013/12/12 Javascript
JavaScript中利用Array和Object实现Map的方法
2015/07/27 Javascript
js判断当前页面在移动设备还是在PC端中打开
2016/01/06 Javascript
JavaScript学习总结之JS、AJAX应用
2016/01/29 Javascript
jQuery选择器基础入门教程
2016/05/10 Javascript
纯JS代码实现隔行变色鼠标移入高亮
2016/11/23 Javascript
详解MVC如何使用开源分页插件(shenniu.pager.js)
2016/12/16 Javascript
详解angularjs中如何实现控制器和指令之间交互
2017/05/31 Javascript
NodeJS 实现手机短信验证模块阿里大于功能
2017/06/19 NodeJs
Bootstrap Table 搜索框和查询功能
2017/11/30 Javascript
深入浅析Node环境和浏览器的区别
2018/08/14 Javascript
element-ui表格数据转换的示例代码
2018/08/24 Javascript
javascript获取select值的方法完整实例
2019/06/20 Javascript
Nodejs实现图片上传、压缩预览、定时删除功能
2019/10/25 NodeJs
node.JS路径解析之PATH模块使用方法详解
2020/02/06 Javascript
Python简单操作sqlite3的方法示例
2017/03/22 Python
python 不同方式读取文件速度不同的实例
2018/11/09 Python
Python2和Python3的共存和切换使用
2019/04/12 Python
详解Python Qt的窗体开发的基本操作
2019/07/14 Python
Python SELENIUM上传文件或图片实现过程
2019/10/28 Python
PyCharm使用之配置SSH Interpreter的方法步骤
2019/12/26 Python
python爬取”顶点小说网“《纯阳剑尊》的示例代码
2020/10/16 Python
python 用opencv实现图像修复和图像金字塔
2020/11/27 Python
迪梵英国官方网站:Darphin英国
2017/12/06 全球购物
英国领先的维生素和营养补充剂直接供应商:Healthspan
2019/04/22 全球购物
2014年社区庆元旦活动方案
2014/03/08 职场文书
服装设计专业毕业生求职信
2014/04/09 职场文书
2015年环卫工作总结
2015/04/28 职场文书
JavaScript异步操作中串行和并行
2021/11/20 Javascript
服务器SVN搭建图文安装过程
2022/06/21 Servers