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(' 注册成功')

 

 

 

 

 

 


posted @ 2021-12-02 17:26  linuxTang  阅读(57)  评论(0)    收藏  举报