19Django云笔记项目2(用户注册)
一模型类:
1在User应用中创建用户模型:
from django.db import models # Create your models here. class User(models.Model): username = models.CharField('手机号',max_length=11, blank=True, unique=True) password = models.CharField('密码',max_length=32) state = models.BooleanField('是否开通登录权限',default=False) site_id = models.IntegerField('注册网点', blank=True) email = models.EmailField(blank=False,default='') created_time = models.DateTimeField('创建时间',auto_now_add=True) updated_time = models.DateTimeField('更新时间',auto_now=True) def __str__(self): return 'username:%s'%(self.username)
2同步迁移文件到数据库
D:\PycharmProjects\tyj_note>python manage.py makemigrations
D:\PycharmProjects\tyj_note>python manage.py migrate
二注册页面规划:
url:/user/reg
视图函数:reg_view
模板位置:templates/user/register.html
三开干:
1)配置路由:
#主路由 from django.urls import path, include urlpatterns = [ path('user/',include('user.urls')), ] #子路由 from django.urls import path from . import views urlpatterns = [ path('reg',views.reg_view), ]
2)编写用户注册视图:
from django.http import HttpResponse from django.shortcuts import render from .models import User # Create your views here. def reg_view(request): if request.method == 'GET': return render(request, 'user/register.html') elif request.method == 'POST': username = request.POST.get('userNname') site_id = request.POST.get('select_site') email = request.POST.get('email') password1 = request.POST.get('password') password2 = request.POST.get('surePassword') if password1 != password2: return HttpResponse('两次密码输入不一致') old_users = User.objects.filter(username=username) if old_users: return HttpResponse('用户名已注册') User.objects.create(username=int(username),password=password1,site_id=int(site_id),email=email) return HttpResponse(' 注册成功')
3)编写前端注册页面:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>注册页面</title> </head> <body> <form action="/user/reg" method="post"> <h1>注册页面</h1> <p>手机号:<input id="userNname" name="userNname" type="text"></p> <p>密码:<input id="password" name="password" type="password"></p> <p>确认密码:<input id="surePassword" name="surePassword" type="password"></p> <p> 站点: <select name="select_site"> <option value="0">请选择</option> <option value="27">101</option> <option value="28">105</option> <option value="29">北分</option> </select> </p> <p> Email: <input id="email" name="email" type="email" required> </p> <p style="text-align: center;"> <input type="submit" value="提交"> <input type="reset" class="button" value="重置"> </p> </form> </body> </html>
4)浏览器注册测试:
http://127.0.0.1:8000/user/reg
5解决上面密码明文注册的问题:
m = hashlib.md5() # 生成md5对象
m.update(password1.encode()) # 将字符串转换为字节后再加密
password_m = m.hexdigest() # 转换成16进制字符串
6优化objects.create():
当同一时间大量用户注册同一个username(因为我们把用户名设为了唯一索),有可能回引起django的报错,引起大并发时我们的判断存在拦截不住用户的风险,因此需要做如下优化:
try: user = User.objects.create(username=int(username),password=password_m,site_id=int(site_id),email=email) except Exception as e: print('--create user error %s'%(e)) return HttpResponse('用户名已注册')
7最终视图函数代码如下:
from django.http import HttpResponse from django.shortcuts import render from .models import User import hashlib # Create your views here. def reg_view(request): if request.method == 'GET': return render(request, 'user/register.html') elif request.method == 'POST': username = request.POST.get('userNname') site_id = request.POST.get('select_site') email = request.POST.get('email') password1 = request.POST.get('password') password2 = request.POST.get('surePassword') if password1 != password2: return HttpResponse('两次密码输入不一致') old_users = User.objects.filter(username=username) m = hashlib.md5() # 生成md5对象 m.update(password1.encode()) # 将字符串转换为字节后再加密 password_m = m.hexdigest() # 转换成16进制字符串 if old_users: return HttpResponse('用户名已注册') try: user = User.objects.create(username=int(username),password=password_m,site_id=int(site_id),email=email) except Exception as e: print('--create user error %s'%(e)) return HttpResponse('用户名已注册') return HttpResponse(' 注册成功')

浙公网安备 33010602011771号