1. 程式人生 > >Django商城項目筆記No.4用戶部分-註冊接口-圖片驗證碼

Django商城項目筆記No.4用戶部分-註冊接口-圖片驗證碼

cut 原因分析 路徑 tcl uid rtc 原因 第三方 clu

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字符串)

Django商城項目筆記No.4用戶部分-註冊接口-圖片驗證碼