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


     

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

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

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

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

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

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

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

    2、图片验证码接口

    2.1.具体视图实现

    分析思路:

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

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

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

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

     2.2.后端接口实现

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

    copymd_malllibs:

     具体视图代码如下

    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')
    View Code

    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",
            }
        }
    View Code

    过期时间: 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()),
    ]
    View Code

    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')),
    ]
    View Code

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

    正常显示验证码


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

  • 相关阅读:
    关于可控进程数的PHP多进程以及信号控制
    编译安装PHP遇到的问题
    MySQL数据的导入导出
    关于svn的dump和load命令
    Nginx多域名的泛解析
    kafka
    JavaScript
    失误与经验
    Hadoop
    Storm
  • 原文地址:https://www.cnblogs.com/blog-rui/p/9736045.html
Copyright © 2020-2023  润新知