网站首页 > 开源技术 正文
在完成了之前的事情之后,接下来就是实现注册功能了。
首先进行基础的分析工作
- 判断用户名是否为空,是否已注册
- 判断邮箱是否为空,是否已注册
- 判断密码是否为空,格式是否正确
- 一般的注册操作还会有确认密码的输入,所以我们会在前端中增加一列。
- 判断确认密码与密码是否相同
请求方法:POST
url定义:/register/
请求参数:url路径参数
参数类型前端是否必须传描述username字符串是用户输入的用户名password字符串是用户输入的密码password_repeat字符串是用户输入的重复密码email字符串是用户输入的邮箱地址
注:由于是post请求,在向后端发起请求时,需要附带csrf token
加入我们需要完成注册,那就需要把这三个字段username,password,email存入到数据库中
我们首先编写数据库相关的代码
因为Django框架功能齐全自带数据库操作功能,所以我们可以很方便的完成数据库的设计。不过还是从最普通的开始了解吧。
正常的情况我们如果操作数据库需要:
- 创建数据库,设计表结构和字段
- 使用 MySQLdb 来连接数据库,并编写数据访问层代码
- 业务逻辑层去调用数据访问层执行数据库操作
- Django采用ORM的形式完成数据库的操作
ORM是什么?:(在django中,根据代码中的类自动生成数据库的表也叫--code first)
ORM:Object Relational Mapping(关系对象映射)
类名对应------》数据库中的表名
类属性对应---------》数据库里的字段
类实例对应---------》数据库表里的一行数据
obj.id obj.name…..类实例对象的属性
也就是说django与数据库的交互被写在了黑盒子里面了,如果我们要用只需要知道输入,不用管黑盒子是MySQL、Oracle、sqlite还是其他乱七八糟的数据库,它都会按照我们的需求输出正确的操作。
ORM系统
下面我们打开apps/login/models.py开始编写数据库相关约束。
1id = models.AutoField() 2username = models.CharField() 3password = models.CharField() 4email = models.EmailField()
了解一下常用的类型,接触过数据库的应该都知道
- IntegerField : 整型,映射到数据库中的int类型。
- CharField: 字符类型,映射到数据库中的varchar类型,通过max_length指定最大长度。
- TextField: 文本类型,映射到数据库中的text类型。
- BooleanField: 布尔类型,映射到数据库中的tinyint类型,在使用的时候,传递True/False进去。如果要可以为空,则用NullBooleanField。
- DateField: 日期类型,没有时间。映射到数据库中是date类型,
- 在使用的时候,可以设置DateField.auto_now每次保存对象时,自动设置该字段为当前时间。设置DateField.auto_now_add当对象第一次被创建时自动设置当前时间。
- DateTimeField: 日期时间类型。映射到数据库中的是datetime类型,
- 在使用的时候,传递datetime.datetime()进去。
但是写了这些还不够的,因为用户名,密码,邮箱等都需要进行一定的约束,id一般是作为主键
知道了这个之后,就需要想办法解决了,但是受限于我的编码经验,所以我选择借鉴django大佬的代码。直接查看Django为admin编写的用户类
from django.contrib.auth.models import AbstractUser按住ctrl+AbstractUser跳进去。
以下是django中的源码:
1class AbstractUser(AbstractBaseUser, PermissionsMixin): 2 """ 3 An abstract base class implementing a fully featured User model with 4 admin-compliant permissions. 5 6 Username and password are required. Other fields are optional. 7 """ 8 username_validator = UnicodeUsernameValidator() 9 10 username = models.CharField( 11 _('username'), 12 max_length=150, 13 unique=True, 14 help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'), 15 validators=[username_validator], 16 error_messages={ 17 'unique': _("A user with that username already exists."), 18 }, 19 ) 20 first_name = models.CharField(_('first name'), max_length=30, blank=True) 21 last_name = models.CharField(_('last name'), max_length=150, blank=True) 22 email = models.EmailField(_('email address'), blank=True) 23 is_staff = models.BooleanField( 24 _('staff status'), 25 default=False, 26 help_text=_('Designates whether the user can log into this admin site.'), 27 ) 28 is_active = models.BooleanField( 29 _('active'), 30 default=True, 31 help_text=_( 32 'Designates whether this user should be treated as active. ' 33 'Unselect this instead of deleting accounts.' 34 ), 35 ) 36 date_joined = models.DateTimeField(_('date joined'), default=timezone.now) 37 38 objects = UserManager() 39 40 EMAIL_FIELD = 'email' 41 USERNAME_FIELD = 'username' 42 REQUIRED_FIELDS = ['email'] 43 44 class Meta: 45 verbose_name = _('user') 46 verbose_name_plural = _('users') 47 abstract = True 48 49 def clean(self): 50 super().clean() 51 self.email = self.__class__.objects.normalize_email(self.email) 52 53 def get_full_name(self): 54 """ 55 Return the first_name plus the last_name, with a space in between. 56 """ 57 full_name = '%s %s' % (self.first_name, self.last_name) 58 return full_name.strip() 59 60 def get_short_name(self): 61 """Return the short name for the user.""" 62 return self.first_name 63 64 def email_user(self, subject, message, from_email=None, **kwargs): 65 """Send an email to this user.""" 66 send_mail(subject, message, from_email, [self.email], **kwargs)
在变成我们自己的代码之前先了解以下里面的东西吧:
- primary_key: 指定是否为主键。
- unique: 指定是否唯一。
- null: 指定是否为空,默认为False。
- blank: 等于True时form表单验证时可以为空,默认为False。
- default: 设置默认值。
- DateField.auto_now: 每次修改都会将当前时间更新进去,只有调用,QuerySet.update方法将不会调用。这个参数只是Date和DateTime以及TimModel.save()方法才会调用e类才有的。
- DateField.auto_now_add: 第一次添加进去,都会将当前时间设置进去。以后修改,不会修改这个值
- 我们复制其中的username和email再稍加整改
- 突然先到我们好像缺少了创建时间,更新时间。而且这两个内容在全部表中都可以被应用到。所以我们封装一个基类好了。
1from django.db import models 2 3class ModelBase(models.Model): 4 create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') 5 update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间') 6 is_delete = models.BooleanField(default=False, verbose_name='逻辑删除') 7 8 class Meta: 9 # 为抽象模型类,用于其他模型来继承,数据库迁移时不会创建ModelBase表 10 abstract = True
所以我们的用户表的model文件就是:
1from django.db import models 2 3from utils.models import ModelBase 4 5 6class User(ModelBase): 7 id = models.AutoField(primary_key=True) 8 username = models.CharField( 9 max_length=30, 10 unique=True, 11 ) 12 password = models.CharField( 13 max_length=30, 14 ) 15 email = models.EmailField() 16 17 class Meta: 18 ordering = ['-update_time', '-id'] 19 db_table = "tb_user" # 指明数据库表名 20 21 def __str__(self): # 这个__str__方法的作用将在查询时看到 22 return f'User<id={self.id},username={self.username},email={self.email}'
表名为tb_user
数据库迁移
运行manage.py
找到Tools中的Run manage.py Task...
首先输入makemigrations login
再输入migrate login
数据库迁移
可以打开数据库可视化工具查看
数据库展示
以上就完成了用户表的创建,不过里面的一些约束条件什么的感觉还是有点问题,但是应该不影响正常的使用(无法应对破坏性的测试)。之后修改models之后在使用makemigrations [app name] 和migrate [app name]就可以修改表结构了。以后出问题了再改好了,问题驱动开发是比较合理的模式,毕竟在一开始就面面俱到难度不是一般的大。
- 上一篇: 数据库编程入门(数据库编程步骤)
- 下一篇: JAVA数据库编程(java数据库编程包含哪些类)
猜你喜欢
- 2024-11-10 一杯茶的功夫就把日志搜索引擎性能调优了?
- 2024-11-10 详解MySQL复制拓扑管理工具Orchestrator--高可用机制
- 2024-11-10 JDBC、JDBC Driver、Java访问数据库
- 2024-11-10 JAVA数据库编程(java数据库编程包含哪些类)
- 2024-11-10 数据库编程入门(数据库编程步骤)
- 2024-11-10 AOT使用经验总结(aot应用)
- 2024-11-10 AlpineLinux安装部署php8(alpine linux安装python)
- 2024-11-10 C++ Qt面试题 | 精选25题(c++,qt)
- 2024-11-10 一杯茶的功夫就把日志搜索引擎性能调优了
- 2024-11-10 Flask-Login处理用户登录和认证(flask login current_user)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)