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,來生成圖片驗證碼
copy到md_mall的libs中:
具體視圖代碼如下
from django.http import HttpResponse fromView Codedjango.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字符串 classImageCodeView(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", } }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用戶部分-註冊接口-圖片驗證碼