Django商城项目笔记No.4用户部分-注册接口-图片验证码

1、首先分析注册业务接口

1.1.分析可得,至少这么几个接口

  • 图片验证码
  • 短信验证码
  • 用户名是否存在
  • 手机号是否存在
  • 整体注册接口

图片验证码、短信验证码考虑到后续可能会在其他业务中也用到,因此我们将图片验证码独立,创建一个新应用verifications,在此应用中实现图片验证码、短信验证码。

python ../../manage.py startapp verifications

创建应用后记得在配置文件里注册应用

2、图片验证码接口

2.1.具体视图实现

分析思路:

这个逻辑应该继承DRF中的哪个类视图呢?

我们这个ImageCodeView继承APIView即可,原因分析如下:

因为这个视图逻辑,不需要校验参数,因为这个参数由url路由中的正则就可以校验,所以这里压根就不用考虑数据校验,这里也不需要查询数据库,所以也不需要做序列化操作。那么其实说白了,就是不需要序列化器。

那么DRF提供的类视图中只有APIView,可不用序列化器,其他的类视图都需要设置序列化器。

2.2.后端接口实现

首先需要用到第三方的captcha,来生成图片验证码

copy到md_mall的libs中:

具体视图代码如下

from django.http import HttpResponse
from django.shortcuts import render
from rest_framework.views import APIView
from md_mall.libs.captcha.captcha import captcha
from django_redis import get_redis_connection from . import constants
# Create your views here. # 图片验证码
# /image_codes/(?P<image_code_id>[\w-]+)/
# image_code_id参数类型uuid字符串
class ImageCodeView(APIView): def get(self, request, image_code_id): # 生成图片验证码
text, image =captcha.generate_captcha() # 保存真实值到redis
redis_conn = get_redis_connection('verify_codes')
redis_conn.setex('img_%s' % image_code_id, constants.IMAGE_CODE_REDIS_EXPIRES, text)
# 返回图片给前端
return HttpResponse(image, content_type='image/jpg')

verify_codes的redis配置

"verify_codes": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/2",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}

过期时间: 在verifications应用中新建constants,然后增加图片验证码过去时间

最后是使用HttpResponse返回的响应

问题一,为啥还能返回HttpResponse,不是应该返回Response对象么?

首先Response是间接继承HttpResponse的,而视图本身就应该返回的是HttpResponse。在DRF中可以返回Response,主要是因为Response继承了HttpResponse。

问题二,为啥不返回Response?

这是因为Response会将内容交给json渲染器进行数据格式转换,如下:

但是我们这里是要返回一张图片,那么将图片交给json渲染器是会报错的。所以使用HttpResponse


我在写redis_conn.setex()的时候,在django-redis的文档中https://redis-py.readthedocs.io/en/latest/#indices-and-tables

查到

TODO这两种用法,经过实践,发现使用第一种,会出错,具体原因还未细查

3、url配置

在verifications应用下新建urls.py

3.1配置url

from django.conf.urls import url
from . import views urlpatterns = [
url(r'^image_codes/(?P<image_code_id>[\w-]+)/$', views.ImageCodeView.as_view()),
]

TODO

url中对image_code_id并没有做具体到uuid字符串格式的正则匹配

配置应用的url:

from django.conf.urls import url, include
from django.contrib import admin urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'', include('verifications.urls')),
]

运行程序,浏览器输入http://127.0.0.1:8000/image_codes/1111-2222/

正常显示验证码


图片验证码逻辑中,并没有对路径参数中的image_code_id做具体限制(uuid字符串)

Django商城项目笔记No.4用户部分-注册接口-图片验证码的更多相关文章

  1. Django商城项目笔记No.9用户部分-注册接口签发JWTtoken

    Django商城项目笔记No.9用户部分-注册接口签发JWTtoken 我们在验证完用户的身份后(检验用户名和密码),需要向用户签发JWT,在需要用到用户身份信息的时候,还需核验用户的JWT. 关于签 ...

  2. Django商城项目笔记No.8用户部分-注册接口实现

    Django商城项目笔记No.8用户部分-注册接口实现 users的view.py中增加如下代码 class RegisterUserView(CreateAPIView): "" ...

  3. Django商城项目笔记No.7用户部分-注册接口-判断用户名和手机号是否存在

    Django商城项目笔记No.7用户部分-注册接口-判断用户名和手机号是否存在 判断用户名是否存在 后端视图代码实现,在users/view.py里编写如下代码 class UsernameCount ...

  4. Django商城项目笔记No.6用户部分-注册接口-短信验证码实现celery异步

    Django商城项目笔记No.4用户部分-注册接口-短信验证码实现celery异步 接上一篇,如何解决前后端请求跨域问题? 首先想一下,为什么图片验证码请求的也是后端的api.meiduo.site: ...

  5. Django商城项目笔记No.5用户部分-注册接口-短信验证码

    Django商城项目笔记No.4用户部分-注册接口-短信验证码 短信验证码也保存在redis里(sms_code_15101234567) 在views中新增SMSCodeView类视图,并且写出步骤 ...

  6. Django商城项目笔记No.10用户部分-登录接口

    Django商城项目笔记No.10用户部分-登录接口 添加url路由 接下来第二步,增加返回内容: 增加结果如下: 配置:上边的方法定义了返回的内容都有哪些,那这个方法jwt还不知道,需要配置: 修改 ...

  7. Django商城项目笔记No.12用户部分-QQ登录2获取QQ用户openid

    Django商城项目笔记No.12用户部分-QQ登录2获取QQ用户openid 上一步获取QQ登录网址之后,测试登录之后本该跳转到这个界面 但是报错了: 新建oauth_callback.html & ...

  8. Django商城项目笔记No.11用户部分-QQ登录1获取QQ登录网址

    Django商城项目笔记No.11用户部分-QQ登录 QQ登录,亦即我们所说的第三方登录,是指用户可以不在本项目中输入密码,而直接通过第三方的验证,成功登录本项目. 若想实现QQ登录,需要成为QQ互联 ...

  9. Django商城项目笔记No.3用户部分-用户模型类

    Django商城项目笔记No.3用户部分-用户模型类 Django提供了认证系统,文档资料https://yiyibooks.cn/xx/Django_1.11.6/topics/auth/index ...

随机推荐

  1. SQL Server复制入门(二)----复制的几种模式

    简介 本系列文章的上一篇对复制是什么做了一个概述.本篇文章根据发布服务器,分发服务器和订阅服务器的组织方式和复制类型来讲述常用复制的几种模式. 模式的选择 选择复制的模式取决于多个方面.首先需要考虑具 ...

  2. [日常] Go语言圣经-Goroutines和线程

    Goroutines和线程: 1.动态栈: 1)线程都有一个固定大小的内存块(一般会是2MB)来做栈 2)一个goroutine会以一个很小的栈开始其生命周期,一般只需要2KB,不是固定的:栈的大小会 ...

  3. 自己写一个java的mvc框架吧(五)

    自己写一个mvc框架吧(五) 给框架添加注解的支持 一段废话 上一章本来是说这一章要写视图处理的部分,但是由于我在测试代码的时候需要频繁的修改配置文件,太麻烦了.所以这一章先把支持注解的功能加上,这样 ...

  4. RabbitMQ安装教程

    最近几天在学习Spring Cloud,在学习Spring Cloud Config配置刷新使用Spring Cloud Bus时,其中用到消息代理组件RabbitMQ,在安装RabbitMQ的过程查 ...

  5. 四种简单的sql语句(增删改查语句)

    四种简单的sql语句(增删改查语句) 一.插入语句 insert into [table] ([column],[column],[column]) values(?,?,?) 二.删除语句 dele ...

  6. javascript:类数组 -- 对象

    在javascript中,对象与数组都是这门语言的原生规范中的基本数据类型,处于并列的位置. 类数组:本质是一个对象,只是这个 对象  的属性有点特殊,模拟出数组的一些特性. 一般来说,如果我们有一个 ...

  7. 【代码笔记】iOS-对数组进行排序

    一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, ...

  8. iTerm通过堡垒机自动登录服务器

    为了保障网络和数据安全,越来越多公司使用堡垒机.iTerm作为一个好用的终端利器,要实现自动通过堡垒机登录服务器的方式有多种.下面我就来介绍一种通过expect脚本的方式完成配置. 第一步,进入/us ...

  9. 如何在 Windows 10 中搭建 Node.js 环境?

    [编者按]本文作者为 Szabolcs Kurdi,主要通过生动的实例介绍如何在 Windows 10 中搭建 Node.js 环境.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 在本文中 ...

  10. centos6.5安装mysql

    1.yum -install  mysql mysql-server -y 2.修改mysql的root的密码 登录:mysql -uroot        修改密码:            use ...