1 创建⽤户模块⼦应⽤
1.1 在项⽬包⽬录下 创建apps的python包。
1.2 在apps包下 创建应⽤userapp
- $ cd 项⽬包⽬录/apps
- $ python ../../manage.py startapp userapp
复制代码 1.3 设置导包路径 默认情况下导包路径指向项⽬根⽬录
- # 通过下⾯语句可以打印当前导包路径
- print(sys.path)
- # 在dev.py⽂件中配置导包路径
- sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
复制代码 1.4 注册⼦应⽤
- INSTALLED_APPS = [
- 'django.contrib.admin',
- 'django.contrib.auth',
- 'django.contrib.contenttypes',
- 'django.contrib.sessions',
- 'django.contrib.messages',
- 'django.contrib.staticfiles',
- 'userapp',
- ]
复制代码 2. 实现展示⽤户注册⻚⾯功能
2.1 在项⽬包⽬录 /templates下 创建基础模板⽂件
2.2 在项⽬包⽬录/templates下 创建userapp⽂件夹
2.3 将 register.html 存放⾄ 项⽬包⽬录/templates/userapp⽬录 下
register: 注册
2.4 创建注册视图
- class Register(View):
- def get(self,request):
- return render(request,'userapp/register.html')
复制代码 2.5 定义 ⽤户注册路由
- # 项⽬根路由
- from django.contrib import admin
- from django.urls import path, re_path, include
- urlpatterns = [
- path('admin/', admin.site.urls),
- re_path('^', include(('userapp.urls', 'userapp',), namespace='userapp'
- )),
- ]
- # ⽤户模块⼦路由
- from django.urls import re_path
- from . import views
- urlpatterns = [
- re_path('^register/$', views.Register.as_view(), name='register'),
- ]
复制代码
3 Django默认⽤户认证系统
- Django⾃带⽤户认证系统
- 它处理 ⽤户账号、组、权限以及基于cookie的⽤户会话。
- Django认证系统位置
- django.contrib.auth包罗 认证框架的核⼼和默认的模型。
- django.contrib.contenttypes是 Django内容类型系统,它允许权限与你创建的模型关联。
- Django认证系统同时处理 认证和授权
- 认证:验证⼀个⽤户是否它声称的那个⼈,可⽤于账号登录。
- 授权:授权决定⼀个通过了认证的⽤户被允许做什么。
- Django认证系统包罗的内容
- ⽤户:⽤户模型类、⽤户认证。
- 权限:标识⼀个⽤户是否可以做⼀个特定的任务,MIS系统常⽤到。
- 组:对多个具有雷同权限的⽤户进⾏统⼀管理,MIS系统常⽤到。
- 密码:⼀个可设置的密码哈希系统,设置密码、密码校验。
3.1 Django默认⽤户模型类
- Django认证系统中提供了⽤户模型类,User保存⽤户的数据。
- Django认证系统⽤户模型类位置
- django.contrib.auth.models.User
- class User(AbstractUser):
- """
- Users within the Django authentication system are represented
- by this
- model.
- Username and password are required. Other fields are optional.
- """
- class Meta(AbstractUser.Meta):
- swappable = 'AUTH_USER_MODEL'
复制代码
- ⽗类AbstractUser先容
- User对象根本属性
- 创建⽤户(注册⽤户)必选: username、password
- 创建⽤户(注册⽤户)可选:email、first_name、last_name、last_login、 date_joined、is_active 、is_staff、is_superuse
- 判定⽤户是否通过认证(是否登录):is_authenticated
- 创建⽤户(注册⽤户)的⽅法
- user = User.objects.create_user(username, email, password, **extra_fields)
复制代码- # 源码
- def _create_user(self, username, email, password, **extra_fields):
- """
- Create and save a user with the given username, email, and
- password.
- """
- if not username:
- raise ValueError('The given username must be set')
- email = self.normalize_email(email)
- username = self.model.normalize_username(username)
- user = self.model(username=username, email=email, **extra_fields)
- user.set_password(password)
- user.save(using=self._db)
- return user
- def create_user(self, username, email=None, password=None, **extra_fields):
- extra_fields.setdefault('is_staff', False)
- extra_fields.setdefault('is_superuser', False)
- return self._create_user(username, email, password,
- **extra_fields)
复制代码
- from django.contrib.auth import authenticate
- user = authenticate(username=username, password=password, **kwargs)
复制代码
- 处理密码的⽅法 设置密码:
- set_password(raw_password)
- 校验密码:check_password(raw_password)
3.2 ⾃定义⽤户模型类
Django⾃带AbstractUser⽤户模型类中 没有⼿机号字段。
- class Users(AbstractUser):
- phone = models.CharField(max_length=11, unique=True,
- verbose_name='⼿机号')
- class Meta:
- db_table = 't_user'
- verbose_name = '⽤户表'
- verbose_name_plural = verbose_name
- def __str__(self):
- return self.username
复制代码 3.3 设置Django⽤户模型类
- # Django⽤户认证系统中的⽤户模型类
- # django.conf下的global_settings.py⽂件中
- AUTH_USER_MODEL = 'auth.User'
- # 配置规则:
- # AUTH_USER_MODEL = '应⽤名.模型类名'
- # 指定芒果头条项⽬⽤户模型类
- AUTH_USER_MODEL = 'userapp.Users'
复制代码 3.4 迁移⽤户模型类
注意:假如迁移⾃定义⽤户模型类,必须先设置 AUTH_USER_MODEL
- # 1.创建迁移⽂件
- $ python manage.py makemigrations userapp
- # 2.执⾏迁移⽂件
- $ python manage.py migrate
复制代码
4 用户注册功能接口设计
4.1 ⽤户注册业务逻辑分析
4.2 ⽤户注册接⼝设计和定义
- 对于接⼝的设计,我们要根据详细的业务逻辑,设计出适合业务逻辑的接⼝。
- 设计接⼝的思路:
- 分析要实现的业务逻辑:
- 明确在这个业务中涉及到⼏个相干⼦业务。
- 将每个⼦业务当做⼀个接⼝来设计。
- 分析接⼝的功能任务,明确接⼝的访问⽅式与返回数据:
- 请求⽅法(如GET、POST、PUT、DELETE等)。
- 请求地址。
- 请求参数(如路径参数、查询字符串、表单、JSON等 )。
- 相应数据(如HTML、JSON等)。
GET接口
- 用于获取数据,比如从服务器拿信息。
- 参数在URL里,能被缓存,但不适合传敏感信息,长度有限制。
POST接口
- 用于创建新资源,比如提交表单,向服务器添加数据。
- 参数在请求体里,不会袒露在URL中,适合传大量数据和敏感信息。
PUT接口
- 用于更新资源,一般是 替换整个资源。
- 参数在请求体里,和POST雷同,但语义上强调更新已有资源。
DELETE接口
- 用于删除资源,告诉服务器删除某个数据。
- 通常不需要参数,或者参数很少,直接通过URL指定要删除的资源。
4.3 ⽤户注册接⼝设计
- 请求⽅式
- 请求⽅法:POST
- 请求地址:/register/
- 请求参数(表单参数)
4.4 ⽤户注册接⼝定义
- class RegisterView(View):
- """⽤户注册"""
- def get(self, request):
- """
- 提供注册界⾯
- :param request: 请求对象
- :return: 注册界⾯
- """
- return render(request, 'register.html')
- def post(self, request):
- """
- 实现⽤户注册
- :param request: 请求对象
- :return: 注册结果
- """
- pass
复制代码
- # 项⽬根路由
- from django.contrib import admin
- from django.urls import path, re_path, include
- urlpatterns = [
- path('admin/', admin.site.urls),
- re_path('^', include(('userapp.urls', 'userapp',), namespace='userapp')),
- ]
- # 应⽤⼦路由
- # userapp/urls.py
- from django.urls import re_path
- from . import views
- urlpatterns = [
- re_path('^register/$', views.Register.as_view(), name='register'),
- ]
复制代码 5 用户注册前端逻辑
使⽤Vue.js的双向绑定实现⽤户的交互和⻚⾯局部刷新效果
5.1 ⽤户注册⻚⾯绑定Vue数据
5.1.1 准备div盒⼦标签
- <div id="register" v-cloak class="col-lg-6 col-md-6 col-sm-12">
- ......
- </div>
复制代码 5.1.2. register.html 【注册html】
- <div id="register" v-cloak class="col-lg-6 col-md-6 col-sm-12">
- <div class="login-item">
- <h5 class="title-login">⽤户注册
- {% if register_error %}
- <span class="error-tip">{{ register_error }}</span>
- {% endif %}
- </h5>
- <form class="register" method="post" @submit="reg_sub">
- {{ csrf_input }}
- <p class="form-row form-row-wide">
- <input placeholder="⽤户名" v-model='username'
- @blur="check_uname" name="username" type="text" class="input-text">
- <span class="error-tip" v-show="error_username">${error_username_msg}</span>
- </p>
- <p class="form-row form-row-wide">
- <input placeholder="⼿机号" v-model='phone'
- @blur="check_phone" name="phone" type="text" class="input-text">
- <span class="error-tip" v-show="error_phone">${error_phone_msg}</span>
- </p>
- <p class="form-row form-row-wide">
- <input style="width: 250px;" placeholder="短信验证码" v-model='smscode' @blur="check_smscode"
- name="msgcode" type="text" class="input-text" id="reg_mescode">
- <span class="error-tip" v-show="error_code">${error_msgcode_msg}</span>
- <button style="font-size: 16px;text-align: center;font-weight:
- normal;float: right" id="reg_mescode_btn" able="able"
- @click="send_code($event)">${smscode_tip}
- </button>
- </p>
- <p class="form-row form-row-wide">
- <input style="width: 250px;" placeholder="图⽚验证码" v-model='imgcode' @blur="check_imgcode"
- name="imgcode" type="text"
- class="input-text">
- <img style="height: 40px;float: right;" :src="img_url"
- @click="generate_img_code">
- <span class="error-tip" v-show="error_imgcode">${error_imgcode_msg}</span>
- </p>
- <p class="form-row form-row-wide">
- <input placeholder="设置密码" v-model='password'
- @blur="check_pwd" name="password" type="password" class="input-text">
- <span class="error-tip" v-show="error_password">${error_password_msg}</span>
- </p>
- <p class="form-row">
- <span class="inline">
- 点击 “注册” 即表示您同意并愿意遵守芒果头条 <a href="#">⽤户协议</a>
- 和 <a href="#">隐私政策</a> 。
- </span>
- </p>
- <p class="">
- <input type="submit" class="button-submit" style="font-size:
- 16px;font-weight: normal;" value="注册">
- </p>
- </form>
- </div>
- </div>
复制代码 5.2 ⽤户注册JS⽂件实现⽤户交互
5.2.1 导⼊Vue.js库和ajax请求的库
- <script src="{{static('js/vue.js')}}"></script>
- <script src="{{static('js/axios.min.js')}}"></script>
复制代码 5.2.2 准备register.js⽂件
- <script type="text/javascript" src="{{ static('js/register.js')}}"></script>
复制代码 register.js详细内容
- //注册⻚⾯js内容
- let vue = new Vue({
- el: '#register',
- delimiters: ['${', '}'],
- data: {
- // v-model
- username: '',
- password: '',
- smscode: '',
- imgcode: '',
- phone: '',
- // v-show
- error_username: false,
- error_password: false,
- error_phone: false,
- error_smscode: false,
- error_imgcode: false,
- // v-message
- error_username_msg: '请输⼊⻓度4-16的⽤户名!',
- error_password_msg: '密码不能为空!',
- error_phone_msg: '⼿机号输⼊有误!',
- error_smscode_msg: '验证码输⼊有误!',
- error_imgcode_msg: '验证码错误!',
- },
- methods: {
- // 校验⽤户名
- check_uname: function () {
-
- },
- // 校验密码
- check_pwd: function () {
- },
- // 校验⼿机号
- check_phone: function () {
- },
- // 监听表单提交事件
- reg_sub: function () {
- }
- }
- });
复制代码 5.2.3 ⽤户交互事件实现
- //注册⻚⾯js内容
- let vue = new Vue({
- el: '#register',
- delimiters: ['${', '}'],
- data: {
- // v-model
- username: '',
- password: '',
- smscode: '',
- imgcode: '',
- phone: '',
- // v-show
- error_username: false,
- error_password: false,
- error_phone: false,
- error_smscode: false,
- error_imgcode: false,
- // v-message
- error_username_msg: '请输⼊⻓度4-16的⽤户名!',
- error_password_msg: '密码不能为空!',
- error_phone_msg: '⼿机号输⼊有误!',
- error_smscode_msg: '验证码输⼊有误!',
- error_imgcode_msg: '验证码错误!',
- },
- methods: {
- // 校验⽤户名
- check_uname: function () {
- //获取⽤户名⻓度
- let reg = /^[a-zA-Z][a-zA-Z0-9_-]{4,7}$/;
- //校验规则
- if (!reg.test(this.username)) {
- this.error_username = true;
- } else {
- this.error_username = false;
- }
- //校验⽤户名是否唯⼀
- if (this.error_username == false) {
- let url = '/usernames/' + this.username + '/count/';
- axios.get(url, {
- responseType: 'json'
- })
- .then(response => {
- if (response.data.count == 1) {
- this.error_username_msg = '⽤户名已存在';
- this.error_username = true;
- } else {
- this.error_username = false;
- }
- })
- .catch(error => {
- console.log(error.response);
- })
- }
- },
- // 校验密码
- check_pwd: function () {
- //定义正则
- let reg = /^[0-9A-Za-z]{6,8}$/;
- //校验规则
- if (!reg.test(this.password)) {
- this.error_password = true;
- } else {
- this.error_password_msg = '';
- this.error_password = false;
- }
- },
- // 校验⼿机号
- check_phone: function () {
- let reg = /^1[3-9]\d{9}$/;
- if (!reg.test(this.phone)) {
- this.error_phone = true;
- } else {
- this.error_phone = false;
- }
- if (this.error_phone == false) {
- let url = '/phones/' + this.phone + '/count/';
- axios.get(url, {
- responseType: 'json'
- })
- .then(response => {
- if (response.data.count == 1) {
- this.error_phone_msg = '⼿机号已存在';
- this.error_phone = true;
- } else {
- this.error_phone = false;
- }
- })
- .catch(error => {
- console.log(error.response);
- })
- }
- },
- // 监听表单提交事件
- reg_sub: function () {
- this.check_uname();
- this.check_phone();
- this.check_smscode();
- this.check_pwd();
- this.check_imgcode();
- if (this.error_username || this.error_password ||
- this.error_phone || this.error_smscode || this.error_imgcode) {
- // 阻⽌表单提交
- window.event.returnValue = false;
- }
- }
- }
- });
复制代码 5.3 重点回顾
1 Vue绑定⻚⾯的套路
- 导⼊Vue.js库和ajax请求的库
- 准备div盒⼦标签
- 准备js⽂件
- html⻚⾯绑定变量、事件等
- js⽂件定义变量、事件等
2 错误提示
- 假如错误提示信息是固定的,可以把错误提示信息写死,再通过v-show控 制是否展示
- 假如错误提示信息不是固定的,可以 使⽤绑定的变量动态的展- 示错误提 示信息,再通过v-show控制是否展示
3 修改Vue变量的读取语法,制止和Django模板语法冲突
4 后续的⻚⾯中假如有雷同的交互和刷新效果,也可按照此套路实现。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |