注冊功能實現(xiàn) -- 3.圖片驗證碼接口實現(xiàn)

圖片驗證碼

1. 分析

前端發(fā)送圖片uuid该溯,后端生成圖片雅倒,返回前端

2. 請求方式

request: GET

3. 接口URL路徑定義

url: /captcha_codes/<uuid:captcha_uuid>/

4. 前端傳遞參數(shù)方式及數(shù)據(jù)格式

傳遞參數(shù)方式:url 路徑參數(shù)傳參

參數(shù) 類型 前端是否必須傳 描述
captcha_uuid uuid字符串 圖片驗證碼編號

uuid:Universally unique identifier(eg. 123e4567-e89b-12d3-a456-426655440000)

5.代碼實現(xiàn)
  • 后端代碼
    • 配置 verifications app
      manage.py@Dreamblog > startapp verifications
      
      • 注冊
      INSTALLED_APPS = [
      # ...
      'verifications',
      ]
      
      • 導(dǎo)入路徑
      urlpatterns = [
      # ...
      path('verifications/', include('verifications.urls')),
      ]
      
    • 將 圖像驗證碼的模塊文件夾(captcha文件夾)復(fù)制粘貼到項目根目錄utils文件夾下
    • 安裝圖片驗證碼所需要的 Pillow 模塊 pip install Pillow
    • 確保settings.py文件中有配置redis CACHE
      Redis原生指令參考 http://redisdoc.com/index.html
      Redis python客戶端 方法參考 http://redis-py.readthedocs.io/en/latest/#indices-and-tables
    # 配置redis緩存
    # 在settings.py文件中指定redis配置
    CACHES = {
        # 默認(rèn)redis數(shù)據(jù)庫 -- default
        "default": {
            "BACKEND": "django_redis.cache.RedisCache",  # 引擎
            "LOCATION": "redis://127.0.0.1:6379/0",  # 0 代表第一個數(shù)據(jù)庫嫁佳,端口默認(rèn)6379
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
            }
        },
    
        # 指定redis數(shù)據(jù)庫 -- "verify_codes"
        # 保存圖片以及短信驗證碼
        "verify_codes": {
            "BACKEND": "django_redis.cache.RedisCache",
            "LOCATION": "redis://127.0.0.1:6379/1",  # 1 代表第一個數(shù)據(jù)庫挨队,
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
            }
        },
      }
    
    • 代碼實現(xiàn)
# views.py
import logging


from django.views import View
from django.http import HttpResponse
from django_redis import get_redis_connection


from . import constants
from utils.captcha.captcha import captcha


logger =logging.getLogger('django')

# 圖片驗證碼視圖
class CaptchaView(View):
    """
    1.創(chuàng)建一個類視圖: CaptchaView
    2.明確請求方式:   GET
    3.url路徑定義:    /captcha_codes/<uuid:captcha_uuid>/
    4.前端傳參方式及參數(shù):
        -- 傳參方式:  url路徑傳參,
        -- 參數(shù):      captcha_uuid
    5.獲取前端參數(shù):
        -- get(self, request, captcha_uuid)
    6.業(yè)務(wù)處理:
        -- 1.是否需要校驗以及校驗方式   不需要蒿往,url路徑傳參已校驗
        -- 2.是否需要儲存以及儲存方式   需要盛垦,redis儲存
        -- 3.其他                      利用uuid生成圖片驗證碼
    7.返回前端參數(shù):
        -- return HttpResponse(content=captcha_content, content_type='image/jpg')
    """
    def get(self, request, captcha_uuid):
        """

        :param request:
        :param captcha_uuid:
        :return:
        """
        # 利用接口,生成圖片驗證碼文本以及二進制文件
        captcha_text, captcha_content = captcha.generate_captcha()

        # redis 保存數(shù)據(jù)三部曲
        # 1. 連接redis
        conn_redis = get_redis_connection(alias="verify_codes")
        # 2. 建立key值    -- key值設(shè)為二進制
        captcha_key = 'captcha_{}'.format(captcha_uuid).encode('utf-8')
        # 3. 保存數(shù)據(jù)瓤漏,并設(shè)置有效期
        conn_redis.setex(captcha_key, constants.CAPTCHA_CODE_REDIS_EXPIRES, captcha_text)

        # 日志器記錄腾夯,后臺顯示
        logger.info('圖片驗證碼為:{}'.format(captcha_text))

        # 返回前端參數(shù),驗證碼二進制文件
        # type='image/jpg'默認(rèn)打開, type='images/jpg'默認(rèn)下載
        return HttpResponse(content=captcha_content, content_type='image/jpg')


# constants.py
# 圖片驗證碼redis有效期蔬充,單位秒
CAPTCHA_CODE_REDIS_EXPIRES = 5 * 60
  # urls.py
  from django.urls import path
  from . import views

  app_name = 'verifications'

  urlpatterns = [
      path('captcha_codes/<uuid:captcha_uuid>/', views.CaptchaView.as_view(),   name='captcha_code'),
  ]
  • postman測試


    image.png
  • redis數(shù)據(jù)庫查看數(shù)據(jù)

127.0.0.1:6379[1]> keys *
(empty list or set)
127.0.0.1:6379[1]> keys *
1) "captcha_123e4567-e89b-12d3-a456-426655440000"
127.0.0.1:6379[1]> ttl "captcha_123e4567-e89b-12d3-a456-426655440000"
(integer) 183
127.0.0.1:6379[1]> 

6.前端代碼

register.html代碼

<a href="javascript:void(0);" class="captcha-graph-img">
 <img src="" alt="" title="點擊刷新" class="captcha_image">
</a>
 
{% block script %}
  <script src="{% static 'js/users/register.js' %}"></script>
{% endblock %}

在js文件夾下創(chuàng)建一個users文件夾用戶存放用戶模塊相關(guān)的js文件蝶俱,在users文件下創(chuàng)建users.js文件

// -----------------register.js--------------------- //
$(function () {
// -----------------圖像驗證碼邏輯代碼--------------------- //

   let $captcha = $('.captcha_image');  // 獲取圖像標(biāo)簽
   let s_UUID = '';                     // 定義圖像驗證碼ID值
   let s_captcha_url= '';               // 定義獲取圖像驗證碼 url

    // 生成圖像驗證碼圖片
  generateImageCode();

    // 點擊圖片驗證碼生成新的圖片驗證碼圖片
  $captcha.click(generateImageCode);

    // 生成請求驗證碼 url
  function generateImageCode() {
    // 1、生成一個圖片驗證碼隨機編號
    s_UUID = generateUUID();
    // 2饥漫、拼接請求url  verifications/captcha_codes/<uuid:captcha_uuid>/
    s_captcha_url = '/verifications/captcha_codes/' + s_UUID + '/';
    // 3榨呆、修改驗證碼圖片src地址(此時后端傳入圖片二進制,顯示)
    $captcha.attr('src',s_captcha_url)

  }

    // 生成圖片UUID驗證碼
  function generateUUID() {
    let d = new Date().getTime();
    if (window.performance && typeof window.performance.now === "function") {
        d += performance.now(); //use high-precision timer if available
    }
    let uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
        let r = (d + Math.random() * 16) % 16 | 0;
        d = Math.floor(d / 16);
        return (c == 'x' ? r : (r & 0x3 | 0x8)).toString(16);
    });
    return uuid;
  }
});

展示


image_1.png

image_2.png
127.0.0.1:6379[1]> keys *
1) "captcha_9cdb9550-b409-4dc9-aa35-52b865f19108"
2) "captcha_fcb8934b-8086-48f2-a712-de1b9b1ab516"
3) "captcha_034ea509-5423-4d9d-a074-e996366af401"
4) "captcha_09aef28e-22ef-4587-b37a-77acb4376a57"
5) "captcha_85b481da-f926-4182-b474-7c2324be351f"
6) "captcha_d58f4beb-a9a3-4e8b-8c4f-979c7a96acea"
7) "captcha_abf202b8-63f8-4e68-b3af-5f234c2c7342"
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末庸队,一起剝皮案震驚了整個濱河市积蜻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌彻消,老刑警劉巖竿拆,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異宾尚,居然都是意外死亡丙笋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來不见,“玉大人澳化,你說我怎么就攤上這事崔步∥人保” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵井濒,是天一觀的道長灶似。 經(jīng)常有香客問我,道長瑞你,這世上最難降的妖魔是什么酪惭? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮者甲,結(jié)果婚禮上春感,老公的妹妹穿的比我還像新娘。我一直安慰自己虏缸,他們只是感情好鲫懒,可當(dāng)我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著刽辙,像睡著了一般窥岩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宰缤,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天颂翼,我揣著相機與錄音,去河邊找鬼慨灭。 笑死朦乏,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的氧骤。 我是一名探鬼主播集歇,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼语淘!你這毒婦竟也來了诲宇?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤惶翻,失蹤者是張志新(化名)和其女友劉穎姑蓝,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吕粗,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡纺荧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宙暇。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡输枯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出占贫,到底是詐尸還是另有隱情桃熄,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布型奥,位于F島的核電站瞳收,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏厢汹。R本人自食惡果不足惜螟深,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望烫葬。 院中可真熱鬧界弧,春花似錦、人聲如沸搭综。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽设凹。三九已至舰讹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間闪朱,已是汗流浹背月匣。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奋姿,地道東北人锄开。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像称诗,于是被迫代替她去往敵國和親萍悴。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 【本教程目錄】 1.redis是什么2.redis的作者3.誰在使用redis4.學(xué)會安裝redis5.學(xué)會啟動r...
    徐猿猿閱讀 1,865評論 0 35
  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個 Awesome - XXX 系列...
    小邁克閱讀 2,963評論 1 3
  • redis是什么 redis是一個開源的寓免、使用C語言編寫的癣诱、支持網(wǎng)絡(luò)交互的、可基于內(nèi)存也可持久化的Key-Valu...
    燁楓_邱閱讀 770評論 0 6
  • 我們的故事,到此為止◎谑祝現(xiàn)在的你实抡,已經(jīng)配不上曾經(jīng)那么愛你的我欠母,已經(jīng)配不上當(dāng)初那么在乎你的我。 我即將追逐我想要的生活...
    孟小苒閱讀 793評論 2 7
  • 不知道從何時起吆寨,頭上的白發(fā)從廖若星辰赏淌,變成了繁星滿天。 我說白發(fā)君啄清,你就不能學(xué)學(xué)人家黑發(fā)六水,謙虛低調(diào)些嘛,你就不能盒延,...
    清心若蘭閱讀 1,282評論 1 8