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命令行交互提示符的方法
Jan 14 Python
使用Node.js和Socket.IO扩展Django的实时处理功能
Apr 20 Python
Python多线程原理与用法实例剖析
Jan 22 Python
Python安装Flask环境及简单应用示例
May 03 Python
python虚拟环境的安装和配置(virtualenv,virtualenvwrapper)
Aug 09 Python
win10下python2和python3共存问题解决方法
Dec 23 Python
pytorch nn.Conv2d()中的padding以及输出大小方式
Jan 10 Python
Python 实现自动完成A4标签排版打印功能
Apr 09 Python
调整Jupyter notebook的启动目录操作
Apr 10 Python
利用PyQt5+Matplotlib 绘制静态/动态图的实现代码
Jul 13 Python
Python字典实现伪切片功能
Oct 28 Python
总结Python连接CS2000的详细步骤
Jun 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
php读取文件内容的几种方法详解
2013/06/26 PHP
一个简单且很好用的php分页类
2013/10/26 PHP
Drupal7 form表单二次开发要点与实例
2014/03/02 PHP
javascript document.compatMode兼容性
2010/02/23 Javascript
jQuery结合Json提交数据到Webservice,并接收从Webservice返回的Json数据
2011/02/18 Javascript
js猜数字小游戏的简单实现代码
2013/07/02 Javascript
JS判断不能为空实例代码
2013/11/26 Javascript
javaScript使用EL表达式的几种方式
2014/05/27 Javascript
JavaScript异步加载浅析
2014/12/28 Javascript
Javascript实现苹果悬浮虚拟按钮
2016/04/10 Javascript
javascript的BOM
2016/05/03 Javascript
VUE 更好的 ajax 上传处理 axios.js实现代码
2017/05/10 Javascript
解决React Native端口号修改的方法
2017/07/28 Javascript
vue props传值失败 输出undefined的解决方法
2018/09/11 Javascript
node.js的Express服务器基本使用教程
2019/01/09 Javascript
详解使用angular框架离线你的应用(pwa指南)
2019/01/31 Javascript
Nuxt页面级缓存的实现
2020/03/09 Javascript
python和shell实现的校验IP地址合法性脚本分享
2014/10/23 Python
深入浅出分析Python装饰器用法
2017/07/28 Python
详解django三种文件下载方式
2018/04/06 Python
浅谈Python2之汉字编码为unicode的问题(即类似\xc3\xa4)
2019/08/12 Python
python读取Kafka实例
2019/12/23 Python
Python3之外部文件调用Django程序操作model等文件实现方式
2020/04/07 Python
Python Process创建进程的2种方法详解
2021/01/25 Python
html Table 表头固定的实现
2019/01/22 HTML / CSS
台湾东南旅游社网站:东南旅游
2019/02/11 全球购物
俄语地区最大的中国商品在线购物网站之一:Umka Mall
2019/11/03 全球购物
EJB的几种类型
2012/08/15 面试题
我的梦想演讲稿
2014/04/30 职场文书
学雷锋的心得体会
2014/09/04 职场文书
农业局党的群众路线教育实践活动整改方案
2014/09/20 职场文书
离婚案件上诉状
2015/05/23 职场文书
小学毕业感言100字
2015/07/30 职场文书
考研经验交流会策划书
2015/11/02 职场文书
优质服务心得体会(共4篇)
2016/01/22 职场文书
JVM钩子函数的使用场景详解
2021/08/23 Java/Android