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如何生成随机密码
Apr 20 Python
Flask框架的学习指南之开发环境搭建
Nov 20 Python
Python实现数据库并行读取和写入实例
Jun 09 Python
解读python logging模块的使用方法
Apr 17 Python
python实现字符串和字典的转换
Sep 29 Python
python使用xlrd模块读取xlsx文件中的ip方法
Jan 11 Python
python里 super类的工作原理详解
Jun 19 Python
Django框架视图函数设计示例
Jul 29 Python
python求解汉诺塔游戏
Jul 09 Python
Python使用Pygame绘制时钟
Nov 29 Python
Python操作CSV格式文件的方法大全
Jul 15 Python
python装饰器代码解析
Mar 23 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
Access数据库导入Mysql的方法之一
2006/10/09 PHP
php mysql数据库操作分页类
2008/06/04 PHP
深入解析php中的foreach问题
2013/06/30 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
javascript 获取网页参数系统
2008/07/19 Javascript
前端必备神器 Snap.svg 弹动效果
2014/11/10 Javascript
JQuery动态添加和删除表格行的方法
2015/03/09 Javascript
JavaScript控制网页层收起和展开效果的方法
2015/04/15 Javascript
JavaScript中字符串拼接的基本方法
2015/07/07 Javascript
JS实现点击复选框将按钮或文本框变为灰色不可用的方法
2015/08/11 Javascript
JS调用Android、Ios原生控件
2017/01/06 Javascript
JS中的数组转变成JSON格式字符串的方法
2017/05/09 Javascript
微信小程序实现弹框效果
2020/05/26 Javascript
python文件和目录操作方法大全(含实例)
2014/03/12 Python
Python利用字典将两个通讯录文本合并为一个文本实例
2018/01/16 Python
python3模块smtplib实现发送邮件功能
2018/05/22 Python
Python3随机漫步生成数据并绘制
2018/08/27 Python
Python文件读写常见用法总结
2019/02/22 Python
python3 小数位的四舍五入(用两种方法解决round 遇5不进)
2019/04/11 Python
django基于cors解决跨域请求问题详解
2019/08/06 Python
Python:type、object、class与内置类型实例
2019/12/25 Python
Pygame框架实现飞机大战
2020/08/07 Python
Myprotein瑞典官方网站:畅销欧洲英国运动营养品牌
2018/01/22 全球购物
Wojas罗马尼亚网站:波兰皮鞋品牌
2018/11/01 全球购物
蔻驰西班牙官网:COACH西班牙
2019/01/16 全球购物
C#基础面试题
2016/10/17 面试题
通信工程毕业生求职信
2013/11/16 职场文书
学校法制宣传日活动总结
2014/11/01 职场文书
财务工作个人总结
2015/02/27 职场文书
环境卫生整治简报
2015/07/20 职场文书
二胎满月酒致辞
2015/07/29 职场文书
特种设备安全管理制度
2015/08/06 职场文书
2016十一国庆节慰问信
2015/12/01 职场文书
php微信小程序解包过程实例详解
2021/03/31 PHP
Spring Security动态权限的实现方法详解
2022/06/16 Java/Android