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 08 Python
python定时器(Timer)用法简单实例
Jun 04 Python
使用Python的Flask框架来搭建第一个Web应用程序
Jun 04 Python
Python浅复制中对象生存周期实例分析
Apr 02 Python
Jupyter notebook远程访问服务器的方法
May 24 Python
mvc框架打造笔记之wsgi协议的优缺点以及接口实现
Aug 01 Python
基于python指定包的安装路径方法
Oct 27 Python
python通过配置文件共享全局变量的实例
Jan 11 Python
基于Python实现ComicReaper漫画自动爬取脚本过程解析
Nov 11 Python
python 算法题——快乐数的多种解法
May 27 Python
Pandas自定义选项option设置
Jul 25 Python
Python+Tkinter制作专属图形化界面
Apr 01 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脚本的10个技巧(7)
2006/10/09 PHP
第十三节--对象串行化
2006/11/16 PHP
一道关于php变量引用的面试题
2010/08/08 PHP
Yii操作数据库实现动态获取表名的方法
2016/03/29 PHP
PHP中addslashes与mysql_escape_string的区别分析
2016/04/25 PHP
javascript比较文档位置
2008/04/08 Javascript
jQuery 技巧小结
2010/04/02 Javascript
点击弹出层效果&amp;弹出窗口后网页背景变暗效果的实现代码
2014/02/10 Javascript
Jquery解析json字符串及json数组的方法
2015/05/29 Javascript
javascript顺序加载图片的方法
2015/07/18 Javascript
js实现网页收藏功能
2015/12/17 Javascript
Mongoose经常返回e11000 error的原因分析
2017/03/29 Javascript
关于foreach循环中遇到的问题小结
2017/05/08 Javascript
Angular限制input框输入金额(是小数的话只保留两位小数点)
2017/07/13 Javascript
vue2.0获取鼠标位置的方法
2018/09/13 Javascript
vue请求本地自己编写的json文件的方法
2019/04/25 Javascript
node.js的http.createServer过程深入解析
2019/06/06 Javascript
vue中实现点击变成全屏的多种方法
2020/09/27 Javascript
pycharm在调试python时执行其他语句的方法
2018/11/29 Python
Python 中的pygame安装与配置教程详解
2020/02/10 Python
python对文件的操作方法汇总
2020/02/28 Python
vscode+PyQt5安装详解步骤
2020/08/12 Python
Pycharm安装第三方库失败解决方案
2020/11/17 Python
Flask处理Web表单的实现方法
2021/01/31 Python
Html5实现二维码扫描并解析
2016/01/20 HTML / CSS
html5+css如何实现中间大两头小的轮播效果
2018/12/06 HTML / CSS
Expedia丹麦:全球领先的旅游网站
2018/03/18 全球购物
Sunglasses Shop英国:欧洲领先的太阳镜在线供应商之一
2018/09/19 全球购物
屈臣氏乌克兰:Watsons UA
2019/10/29 全球购物
汽车驾驶求职信
2013/10/25 职场文书
优秀德育工作者事迹材料
2014/05/07 职场文书
拔河比赛口号
2014/06/10 职场文书
颐和园英文导游词
2015/01/30 职场文书
导游词之蜀山胜景瓦屋山
2019/11/29 职场文书
mysql优化之query_cache_limit参数说明
2021/07/01 MySQL
vue实现移动端div拖动效果
2022/03/03 Vue.js