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 元类使用说明
Dec 18 Python
python实现dict版图遍历示例
Feb 19 Python
利用Python爬取可用的代理IP
Aug 18 Python
python密码错误三次锁定(实例讲解)
Nov 14 Python
python字典快速保存于读取的方法
Mar 23 Python
pycharm远程linux开发和调试代码的方法
Jul 17 Python
Django 日志配置按日期滚动的方法
Jan 31 Python
如何通过python画loss曲线的方法
Jun 26 Python
Django 响应数据response的返回源码详解
Aug 06 Python
python标准库os库的函数介绍
Feb 12 Python
python中delattr删除对象方法的代码分析
Dec 15 Python
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
Jun 11 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
松下Panasonic RF-B65电路分析
2021/03/02 无线电
php判断类是否存在函数class_exists用法分析
2014/11/14 PHP
php获取网站百度快照日期的方法
2015/07/29 PHP
判断iframe是否加载完成的完美方法
2010/01/07 Javascript
artDialog 4.1.5 Dreamweaver代码提示/补全插件 附下载
2012/07/31 Javascript
js格式化货币数据实现代码
2013/09/04 Javascript
一个js导致的jquery失效问题的解决方法
2013/11/27 Javascript
Javascript浅谈之引用类型
2013/12/18 Javascript
js 删除数组的几种方法小结
2014/02/21 Javascript
纯js实现瀑布流布局及ajax动态新增数据
2016/04/07 Javascript
ionic实现带字的toggle滑动组件
2016/08/27 Javascript
jQuery操作DOM_动力节点Java学院整理
2017/07/04 jQuery
vue scroller返回页面记住滚动位置的实例代码
2018/01/29 Javascript
js实现二级菜单点击显示当前内容效果
2018/04/28 Javascript
解决koa2 ctx.render is not a function报错问题
2018/08/07 Javascript
vue2.0 element-ui中el-select选择器无法显示选中的内容(解决方法)
2018/08/24 Javascript
vuex存储复杂参数(如对象数组等)刷新数据丢失的解决方法
2019/11/05 Javascript
Vue 实现登录界面验证码功能
2020/01/03 Javascript
[50:27]Secret vs VG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
基于ID3决策树算法的实现(Python版)
2017/05/31 Python
Python网络编程使用select实现socket全双工异步通信功能示例
2018/04/09 Python
python print 按逗号或空格分隔的方法
2018/05/02 Python
Python工厂函数用法实例分析
2018/05/14 Python
python和opencv实现抠图
2018/07/18 Python
python 解决flask uwsgi 获取不到全局变量的问题
2019/12/22 Python
Links of London官方网站:英国标志性的珠宝品牌
2017/04/09 全球购物
亚马逊意大利站点:Amazon.it
2020/12/31 全球购物
.NET面试10题
2014/02/24 面试题
优秀的教师个人的中文求职信
2013/09/21 职场文书
房产销售经理职责
2013/12/20 职场文书
高中生职业生涯规划书
2014/02/24 职场文书
关于学习的演讲稿
2014/05/10 职场文书
婚育证明样本
2015/06/16 职场文书
Python趣味爬虫之用Python实现智慧校园一键评教
2021/05/28 Python
python lambda 表达式形式分析
2022/04/03 Python
Golang 遍历二叉树
2022/04/19 Golang