验证码生成源码:https://files.cnblogs.com/files/icewky/captcha.zip

一、用户模型设计

1、用户表字段分析

- 添加用户手机号字段
- 添加邮箱状态字段

2、用户模式设计

Django提供了`django.contrib.auth.models.AbstractUser`用户抽象模型类允许我们继承,扩展字段来使用Django认证系统的用户模型类。
要使用Django自带的user模型类,需要先导入`UserManager`包,创建新模型时继承它

用户模型类

from django.db import models
from django.contrib.auth.models import AbstractUser ,UserManager as _UserManager # 以防重名,映射一个新名字
# Create your models here. class UserManager(_UserManager):
'''
重写用户管理器
'''
def create_superuser(self, username, password, email=None, **extra_fields): return super(self,UserManager).create_superuser(username=username,password=password,email=email,**extra_fields) class Users(AbstractUser):
'''
重写用户模型,继承AbstractUser模型类
'''
objects = UserManager()
# help_text在api接口文档中会用到 mobile = models.CharField(max_length=11, unique=True, verbose_name='手机号码', error_messages={
'unique':'此手机号已经注册' # 指定报错的中文信息
},help_text='手机号')
email_as = models.BooleanField(default=False,verbose_name='邮箱状态') class Meta:
db_table = 'tb_user' # 指明数据库表名
verbose_name = '用户' # 在admin站点中显示的名称
verbose_name_plural = verbose_name # 显示的复数名称 def __str__(self): # 打印对象时调用
return self.username

我们自定义的用户模型类还不能直接被Django的认证系统所识别,需要在配置文件中告知Django认证系统使用我们自定义的模型类。

在配置文件中进行设置

在settings.py文件中添加如下配置:

# 思考:为什么Django默认用户模型类是User?
# 阅读源代码:'django.conf.global_settings'
# AUTH_USER_MODEL = 'auth.User'
# AUTH_USER_MODEL = '应用名.模型类名'
# AUTH_USER_MODEL 参数的设置以点.来分隔,表示应用名.模型类名。
# 自定义用户模型
AUTH_USER_MODEL = 'user.Users'

注意:Django建议我们对于AUTH_USER_MODEL参数的设置一定要在第一次数据库迁移之前就设置好,否则后续使用可能出现未知错误。

二、执行迁移

python manage.py makemigrations
python manage.py migrate

注意:如果迁移时提示找不到users,请参考:https://www.cnblogs.com/icewky/p/12364717.html

数据库

三、图形验证码

将图形验证码生成工具captcha解压出来放到utils目录下

注意:captcha工具需要安装第三包:pip install pillow

在视图文件中导入captcha工具,需要根据自己文件路径导入

from dj13.utils.captcha.captcha import captcha

编写视图:

from dj13.utils.captcha.captcha import captcha

def image_code(request):
text,image = captcha.generate_captcha() return HttpResponse(content=image, content_type='image/jpg')

添加路由:

from . import views

# APP名字,用于解析路由地址,需在path中添加name属性
app_name = 'users' # 路由设置
urlpatterns = [
path('image_code',views.image_code,name='image_code'),
]

访问路由查看是否正常:

四、将图形验证加入到前端文件中

新建js文件

目录:static > js > register.js

$(function () {
let $img =$('.form-item .captcha-graph-img img');
genre();
$img.click(genre);
function genre() {
image_code_uuid = generateUUID();
let imageCodeUrl = '/image_code/' + image_code_uuid + '/';
$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;
}
})

注册页面引入js文件:

{% block script %}
<script src="../../static/js/register.js"></script>
{% endblock %}

修改视图文件:

from django.http import HttpResponse
from dj13.utils.captcha.captcha import captcha
from django_redis import get_redis_connection
# Create your views here.
import logging
logger = logging.getLogger('django') def image_code(request,img_id):
text,image = captcha.generate_captcha()
redis_conn = get_redis_connection('verify_code') # 连接Redis数据库
# 保存 (键 过期时间 值)
redis_conn.setex('img_{}'.format(img_id).encode('utf8'),300,text)
logger.info('图形验证码是:{}'.format(text)) return HttpResponse(content=image, content_type='image/jpg')

修改路由,接收参数

from . import views

# APP名字,用于解析路由地址,需在path中添加name属性
app_name = 'users' # 路由设置
urlpatterns = [
path('image_code/<uuid:img_id>/',views.image_code,name='image_code'),
]

最终效果:





django项目班笔记-注册功能的更多相关文章

  1. django项目班笔记-模板抽取

    目录 一.将前端静态文件放置到项目文件目录 二.模板设置 三.将静态文件拖放到项目对应目录 四.检查HTML文件中的应用是否自动更改了 4.1 文件引用没有改变的解决方法 4.2 设置static文件 ...

  2. 潭州课堂25班:Ph201805201 django 项目 第三课 码云注册,django项目 (课堂笔记)

    d码云注册,登录, 创建项目: 生成秘钥 想看秘钥: 添加公钥 复制 ssh 连接 通过  git clone <ssh> 连接 在服务器上创建 python3 虚拟环境, 创建项目  p ...

  3. django项目一 登录注册

    STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static') ] AUTH_USER_MODEL = 'cr ...

  4. 跟老齐学Django 项目实战笔记

    创建项目 mysite 创建应用 blog mysit/settings.py配置app INSTALLED_APPS = [ 'django.contrib.admin', 'django.cont ...

  5. django项目后台权限管理功能。

    对后台管理员进行分角色,分类别管理,每个管理员登录账号后只显示自己负责的权限范围. 创建后台管理数据库 models.py文件内 # 管理员表 class Superuser(models.Model ...

  6. django项目中账号注册登陆使用JWT的记录

    需求分析 1.  注册用JWT做状态保持    1.1 安装jwt    pip install djangorestframework-jwt        1.2 去settings里面配置jwt ...

  7. 潭州课堂25班:Ph201805201 django 项目 第五课 静态页面转为模板 (课堂笔记)

    一.分析静态页面   1.静态vs动态 条目 静态页面 动态页面 网站内容 固定不变 经常变动 浏览器加载速度 更快(无需向服务器发起请求) 更慢 改变网站内容 很难(修改或者创建新的html页面) ...

  8. Django项目: 2.模板抽取

    为什么要抽模板,因为这样能够复用代码,减少代码量,需要原代码时就不需要修改,也不需要添加; 如果不同,就只需要单独修改不一样的地方就行  : 多挖坑,少代码,这就是抽模板的精髓,挖坑就是({% blo ...

  9. 潭州课堂25班:Ph201805201 django 项目 第九课 图片验证码前台实现,判断用户是否注册功能实现 (课堂笔记)

    u胎代码实现 : 针对每一个 app 写个 js 脚本, 先给 users 的 app 应用创建个 js:在指定目录下的 js 文件夹下,创建 users 文件夹,下创建 suth.js ,图片验证 ...

随机推荐

  1. c# 用户控件,usercontrol,自定义控件属性

    1.C#用户控件的使用 2.拖动添加:画面上如需多个usercontrol,添加TableLayoutPanel,然后在工具箱中找到usercontrol,拖到相应框中 3.代码添加:主窗口中有多个T ...

  2. quartz详解4:quartz线程管理

    http://blog.itpub.NET/11627468/viewspace-1766967/ quartz启动后有多个线程同时在跑.启动时会启动主线程.集群线程.检漏线程.工作线程.主线程负责查 ...

  3. 使用NtQueryInformationFile函数获得不到完整路径

    #include <windows.h> #include <iostream> using namespace std; typedef struct _OBJECT_NAM ...

  4. SpringCloud学习之手把手教你用IDEA搭建入门项目【番外篇】(一)

    之前的文章里,我曾经搭建了一个Springcloud项目,但是那个时候我对于SpringCloud架构的很多组件不甚清楚,只是通过查找资料然后动手稀里糊涂的把一个项目成功搭建起来了,其中有很多不合理和 ...

  5. Causal Corpus 事件因果关系语料统计

    Causal Corpus 事件因果关系语料统计 本文是对因果关系抽取领域数据库标注及开源情况的统计.除了对因果关系的标注,一些类似的语料也包含在内,从而为语料的使用提供灵活性,可以根据不同的目标选取 ...

  6. 刷题46. Permutations

    一.题目说明 题目是46. Permutations,给一组各不相同的数,求其所有的排列组合.难度是Medium 二.我的解答 这个题目,前面遇到过类似的.回溯法(树的深度优先算法),或者根据如下求解 ...

  7. Map的6种遍历方法

    声明:迁移自本人CSDN博客https://blog.csdn.net/u013365635 探讨有几种遍历Map的方法其实意义并不大,网上的文章一般讲4种或5种的居多,重要的是知道遍历的内涵,从遍历 ...

  8. PAT-输入输出

    测试样例输入方式 while...EOF型(题目没有给定输入的结束条件) while(~scanf("%s",s)) {} //等价于while(scanf("%s&qu ...

  9. 题解 P6098 【[USACO19FEB]Cow Land G】

    震惊,蒟蒻学树剖第二天就打题解 所以说,理解之后树剖这种东西其实难度真心不大.至少这种模板题都可以秒切的 这里推荐一个博客: 树剖详解 蒟蒻就是在这个博客上学到的 如果想看我自己写的总结,请点 我的博 ...

  10. Thread--使用condition实现顺序执行

    package condition; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Re ...