ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

用户注册功能

2019-06-23 09:00:52  阅读:126  来源: 互联网

标签:功能 用户注册 image redis 验证码 django import 图片


### 一、设计接口思路

 

- 分析业务逻辑,明确在这个业务中需要涉及到几个相关子业务,将每个子业务当做一个接口来设计

- 分析接口的功能任务,明确接口的访问方式与返回数据:

  - 接口的请求方式,如GET 、POST 、PUT等

  - 接口的URL路径定义

  - 需要前端传递的数据及数据格式(如路径参数、查询字符串、请求体表单、JSON等)

  - 返回给前端的数据及数据格式

 

 

 

### 二、功能分析

 

- 用户名判断是否存在

- 手机号判断是否存在

- 图片验证码

- 短信验证码

- 注册保存用户数据

 

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

 

 

 

### 三、图片验证码接口代码实现

 

#### 1.图片验证码认证

 

**请求方法**:**GET** 

 

**url定义**:`/image_codes/<uuid:image_code_id>/`

 

**请求参数**:url路径参数

 

| 参数        | 类型       | 前端是否必须传 | 描述           |

| ----------- | ---------- | -------------- | -------------- |

| image_codes | uuid字符串 | 是             | 图片验证码编号 |

 

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

 

 

 

#### 2.后端视图实现

 

a.将生成图像验证码的模块文件夹(百度云盘有提供captcha文件夹)复制粘贴到项目根目录utils文件夹下

 

 

 

b.由于验证(图片验证、短信验证)功能,以后有可能在其他应用或项目中重用,所以单独创建一个应用来实现,所有验证相关的业务逻辑接口。在apps目录中创建一个verifications应用,并在settings.py文件中的INSTALLED_APPS列表中指定。

 

需要安装pillow包

 

```python

# 在verifications/views.py文件中添加如下代码:

 

 

import logging

 

from django.shortcuts import render

from django.views import View

from django_redis import get_redis_connection

from django.http import HttpResponse

 

from utils.captcha.captcha import captcha

# 安装图片验证码所需要的 Pillow 模块

# pip install Pillow

from . import constants

from users.models import Users

 

# 导入日志器

logger = logging.getLogger('django')

 

 

class ImageCode(View):

    """

    define image verification view

    # /image_codes/<uuid:image_code_id>/

    """

    def get(self, request, image_code_id):

        text, image = captcha.generate_captcha()

        

        # 确保settings.py文件中有配置redis CACHE

        # Redis原生指令参考 http://redisdoc.com/index.html

        # Redis python客户端 方法参考 http://redis-py.readthedocs.io/en/latest/#indices-and-tables

        con_redis = get_redis_connection(alias='verify_codes')

        img_key = "img_{}".format(image_code_id).encode('utf-8')

        # 将图片验证码的key和验证码文本保存到redis中,并设置过期时间

        con_redis.setex(img_key, constants.IMAGE_CODE_REDIS_EXPIRES, text)

        logger.info("Image code: {}".format(text))

        

        return HttpResponse(content=image, content_type="images/jpg")

```

 

 

 

c.为了保存应用中用到的常量信息,需要在verifications应用下创建一个constants.py文件

 

```python

# 在verifications/constants.py文件中加入如下代码:

 

# 图片验证码redis有效期,单位秒

IMAGE_CODE_REDIS_EXPIRES = 5 * 60

```

 

 

 

d.本项目需要将图形验证码、短信验证码以及用户的会话信息保存到redis服务器中,所以需要在settings.py文件中指定如下配置信息:

 

```python

# settings.py文件中加入如下内容:

 

CACHES = {

    "default": {

        "BACKEND": "django_redis.cache.RedisCache",  # 指定redis缓存后端

        "LOCATION": "redis://127.0.0.1:6379/0",

        "OPTIONS": {

            "CLIENT_CLASS": "django_redis.client.DefaultClient",

            # "PASSWORD": "mysecret"

        }

    },

    # 同样可以指定多个redis

    "session": {

        "BACKEND": "django_redis.cache.RedisCache",

        "LOCATION": "redis://127.0.0.1:6379/1",

        "OPTIONS": {

            "CLIENT_CLASS": "django_redis.client.DefaultClient",

        }

    },

    "verify_codes": {

        "BACKEND": "django_redis.cache.RedisCache",

        "LOCATION": "redis://127.0.0.1:6379/2",

        "OPTIONS": {

            "CLIENT_CLASS": "django_redis.client.DefaultClient",

        }

    },

    "sms_codes": {

        "BACKEND": "django_redis.cache.RedisCache",

        "LOCATION": "redis://127.0.0.1:6379/3",

        "OPTIONS": {

            "CLIENT_CLASS": "django_redis.client.DefaultClient",

        }

    },

 

}

 

# 将用户的session保存到redis中

SESSION_ENGINE = "django.contrib.sessions.backends.cache"

# 指定缓存redis的别名

SESSION_CACHE_ALIAS = "session"

```

 

 

 

e.在verifications应用下创建一个urls.py文件并添加如下内容:

 

```python

# verifications应用下创建一个urls.py

 

from django.urls import path, re_path

 

from . import views

 

app_name = "verifications"

 

urlpatterns = [

    # re_path(r'^image_codes/(?P<image_code_id>[\w-]+)/$', view=views.ImageCodeView.as_view(), name="image_code"),

    # image_code_id为uuid格式

    path('image_codes/<uuid:image_code_id>/', views.ImageCode.as_view(), name='image_code'),

 

]

```

 

 

 

#### 3.前端代码实现

 

html代码:

 

```jinja2

{% extends 'base/base.html' %}

{% load static %}

<!-- css title start -->

{% block title %}

  注册页

{% endblock %}

<!-- css title end -->

 

{% block link %}

<link rel="stylesheet" href="../../static/css/authPro/auth.css">

{% endblock %}

 

{% block main %}

<!-- container start -->

<main id="container">

  <div class="register-contain">

    <div class="top-contain">

      <h4 class="please-register">请注册</h4>

      <a href="{% url 'users:login' %}" class="login">立即登录 &gt;</a>

    </div>

    <form action="" method="post" class="form-contain">

      {% csrf_token %}

      <div class="form-item">

        <input type="text" placeholder="请输入用户名" name="username" id="user_name" class="form-control" autocomplete="off">

      </div>

      <div class="form-item">

        <input type="password" placeholder="请输入密码" name="password" class="form-control">

      </div>

      <div class="form-item">

        <input type="password" placeholder="请输入确认密码" name="password_repeat" class="form-control">

      </div>

      <div class="form-item">

        <input type="tel" placeholder="请输入手机号" name="telephone" class="form-control" id="mobile" autocomplete="off">

      </div>

      <div class="form-item">

        <input type="text" placeholder="请输入图形验证码" name="captcha_graph" id="input_captcha" class="form-captcha">

        <a href="javascript:void(0);" class="captcha-graph-img">

          <img src="" alt="验证码" title="点击刷新">

        </a>

      </div>

      <div class="form-item">

        <input type="text" placeholder="请输入短信验证码" name="sms_captcha" class="form-captcha" autocomplete="off">

        <a href="javascript:void(0);" class="sms-captcha" title="发送验证码">获取短信验证码</a>

      </div>

      <div class="form-item">

        <input type="submit" value="立即注册" class="register-btn">

      </div>

    </form>

  </div>

</main>

<!-- container end -->

{% endblock %}

 

{% block script %}

  <script src="{% static 'js/users/auth.js' %}"></script>

{#    <script src="../../static/js/users/auth.js"></script>#}

{% endblock %}

 

 

```

 

 

 

在js文件夹下创建一个users文件夹用户存放用户模块相关的js文件,在users文件下创建auth.js文件。

 

```javascript

$(function () {

  let $img = $(".form-item .captcha-graph-img img");  // 获取图像标签

  let sImageCodeId = "";  // 定义图像验证码ID值

 

  generateImageCode();  // 生成图像验证码图片

  $img.click(generateImageCode);  // 点击图片验证码生成新的图片验证码图片

 

  // 生成一个图片验证码的编号,并设置页面中图片验证码img标签的src属性

  function generateImageCode() {

    // 1、生成一个图片验证码随机编号

    sImageCodeId = generateUUID();

    // 2、拼接请求url /image_codes/<uuid:image_code_id>/

    let imageCodeUrl = "/image_codes/" + sImageCodeId + "/";

    // 3、修改验证码图片src地址

    $img.attr('src', imageCodeUrl)

  }

 

  // 生成图片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,redis,验证码,django,import,图片
来源: https://www.cnblogs.com/wdty/p/11071793.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有