@llplmlyd
2019-05-10T03:21:22.000000Z
字数 10126
阅读 1488
论文
实现以下功能:
用户注册: 注册完成后转到登录页面
用户登录: 登录完成后转到用户资料页面
用户资料页面: 查看用户注册信息,并提供编辑资料按钮
用户资料编辑:编辑完成后转到用户资料查看页面
用户密码重置
用户退出登陆
FSCIIDB|---FSCIIDB|--- __init__.py|--- __pycache__/|--- settings.py # modified|--- urls.py # modified|--- wsgi.py|---login # created:python manage.py startapp login|--- __init__.py|--- admin.py # add to register login: admin.site.register(models.User)|--- apps.py|--- forms.py # created file: defaultname is forms.py|--- urls.py # created file: defaultname is urls.py|--- models.py # modified|--- views.py # modified|--- tests.py|--- migrations/|--- static/ # created directory and files as you see|--- login/|--- css/|--- login.css|--- register.css|--- img/|--- templates/ # created directory and files as you see|--- confirm.html|--- index.html|--- login.html|--- register.html
# models.py# 可以继承Django自带的User# coding:utf-8from django.db import modelsfrom django.contrib.auth.models import AbstractUser# Create your models here.# 继承了django中的用户基本 类AbstractUserclass User(AbstractUser):right_level = [(0, "普通用户"), (1, "司法鉴定员"), (2, "系统用户")]username = models.CharField("用户名称", unique=True, max_length=50)# django 要求用户名唯一password = models.CharField("用户密码", max_length=128)created_time = models.DateTimeField("账户创建时间", auto_now_add=True)email = models.EmailField("邮箱")phone = models.CharField("手机号码", unique=True, max_length=30)right = models.SmallIntegerField("权限等级", choices=right_level, default=0)has_confirmed = models.BooleanField(default=False) # 确认# 元数据 增强可读性class Meta:verbose_name = '用户'ordering = ['-id']def __str__(self):return self.username
forms.py表单与models.py功能并不相同,forms.py提供快速渲染html表单的方法,并没有与数据库交互,其写入数据库的过程大致可以表示为:
forms.py → templates.html(action/render/redirect) →
views.py (models.User())→ models.py → 数据库
from django import forms# 用户登录表单class UserForm(forms.Form):username = forms.CharField(label="用户名", max_length=50, widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': '用户名', 'autofocus': ''}))password = forms.CharField(label="密码", max_length=30, widget=forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': '用户密码'}))#用户注册表单class RegisterForm(forms.Form):gender = (('male', "男"),('female', "女"),)departments = ((0, "海珠区"), (1, "天河区"), (2, "荔湾区"), (3, "番禺区"),)username = forms.CharField(label="用户名", max_length=50, widget=forms.TextInput(attrs={'class': 'form-control'}))password1 = forms.CharField(label="密码", max_length=30, widget=forms.PasswordInput(attrs={'class': 'form-control'}))password2 = forms.CharField(label="确认密码", max_length=30, widget=forms.PasswordInput(attrs={'class': 'form-control'}))email = forms.CharField(label="邮箱地址", widget=forms.EmailInput(attrs={'class': 'form-control'}))# 注意sex这里是Choicesex = forms.ChoiceField(label="性别", choices=gender)phone = forms.CharField(label="手机号码", max_length=30, widget=forms.TextInput(attrs={'class': 'form-control'}))# 注意department这里是Choicedepartment = forms.ChoiceField(label="所属部门", choices=departments)
这里有几个注意的点:页面逻辑、用户输入提示message、用户验证。
可以说html基本上就是表单的实现,而借用了forms.py 减少了代码的编写量。
confirm.html其实暂时不需要用到
# login.html{% load static %} # add 引入自己设置的css<!DOCTYPE html><html lang="en"><head><!-- required meta tags --> # 添加注释<meta charset="UTF-8">、<!-- Bootstrap CSS --> # add Bootstrap CSS<link href="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet"><link href="{% static 'login/css/login.css' %}" rel="stylesheet" /><title>FSCI IDC|登录</title> # modified title name</head><body><div class="container"><div class="col"># 登录表单开始,注意action,将表单发送到哪里<form class="form-login" action="/login/" method="post"># 如果有 message 产生 则显示{% if message %}<div class="alert alert-warning">{{ message }}</div>{% endif %}# django本身的csrf 问题需要在有post的request中添加以下内容{% csrf_token %}<h3 class="text-center">法庭科学硅藻鉴定智能数据库</h3># form-group 是 Bootstrap CSS的 样式<div class="form-group">{{ login_form.username.label_tag }}{{ login_form.username }}</div><div class="form-group">{{ login_form.password.label_tag }}{{ login_form.password }}</div># 这里是登录框的下注内容了<div><a href="/register/" class="text-success"><ins>注册</ins></a><button type="submit" class="btn btn-primary float-right">登录</button></div></form></div></div><!-- container end --><!-- Optional JavaScript --><!-- jQuery first, then Popper.js, then Bootstrap JS --><script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script><script src="https://cdn.bootcss.com/popper.js/1.15.0/umd/popper.min.js"></script><script src="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script></body></html>
# register.html# 基本上和login.html实现原理相同{% load static %}<!DOCTYPE html><html lang="en"><head><!-- required meta tags --><meta charset="UTF-8"><!-- Bootstrap CSS --><link href="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet"><link href="{% static 'login/css/register.css' %}" rel="stylesheet" /><title>FSCI IDC|注册</title></head><body><div class="container"><div class="col"><form class="form-register" action="/register/" method="post">{% if message %}<div class="alert alert-warning">{{ message }}</div>{% endif %}{% csrf_token %}<h3 class="text-center">欢迎注册</h3><div class="form-group">{{ register_form.username.label_tag }}{{ register_form.username }}</div><div class="form-group">{{ register_form.password1.label_tag }}{{ register_form.password1 }}</div><div class="form-group">{{ register_form.password2.label_tag }}{{ register_form.password2 }}</div><div class="form-group">{{ register_form.email.label_tag }}{{ register_form.email }}</div><div class="form-group">{{ register_form.sex.label_tag }}{{ register_form.sex }}</div><div class="form-group">{{ register_form.department.label_tag }}{{ register_form.department }}</div><div class="form-group">{{ register_form.phone.label_tag }}{{ register_form.phone }}</div><div><a href="/login/" class="text-success"><ins>直接登录</ins></a><button type="submit" class="btn btn-primary float-right">注册</button></div></form></div></div> <!-- container end--><!-- Optional JavaScript --><!-- jQuery first, then Popper.js, then Bootstrap JS --><script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script><script src="https://cdn.bootcss.com/popper.js/1.15.0/umd/popper.min.js"></script><script src="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script></body></html>
# index.html<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>FSCI IDB|首页</title></head><body>{% csrf_token %}<h1>{{ request.session.user_name }}! 欢迎回来! </h1>{% csrf_token %}<p><a href="/logout/">注销</a></p></body></html>
# views.pyfrom django.shortcuts import renderfrom django.shortcuts import redirectfrom django.conf import settingsfrom . import modelsfrom . import formsimport hashlibfrom django.contrib.auth import authenticate # 用于验证admin账号import datetime# Create your views here.# 普通用户的密码加密方式def hash_code(s,salt='fsciidb'):h = hashlib.sha256()s += salth.update(s.encode())return h.hexdigest()# 首页视图 使用了模板def index(request):# 必须使用session才能进入index页面:if not request.session.get('is_login', None):return redirect('/login/')return render(request, 'index.html')# 登录视图 使用了模板def login(request):if request.session.get('is_login', None):# 不允许重复登录return redirect('/index/')if request.method == 'POST':login_form = forms.UserForm(request.POST)message = '请检查填写的信息!'if login_form.is_valid():username = login_form.cleaned_data.get('username')password = login_form.cleaned_data.get('password')temper_user = models.User()try:user = models.User.objects.get(username=username)except:message = '用户不存在!'return render(request, 'login.html', locals())# 管理员登录user_admin = authenticate(username=username, password=password)if user_admin:request.session['is_login'] = Truerequest.session['user_id'] = user.idrequest.session['user_name'] = user.usernamereturn redirect('/index/')# 普通用户登录if user.password == hash_code(password):request.session['is_login'] = Truerequest.session['user_id'] = user.idrequest.session['user_name'] = user.usernamereturn redirect('/index/')else:message = '密码不正确!'return render(request, 'login.html', locals())else:return render(request, 'login.html', locals())login_form = forms.UserForm()return render(request, 'login.html', locals())# 注册视图 使用了模板def register(request):if request.session.get('is_login', None):return redirect('/index/')if request.method == 'POST':register_form = forms.RegisterForm(request.POST)message = "请检查填写的信息!"if register_form.is_valid():username = register_form.cleaned_data.get('username')password1 = register_form.cleaned_data.get('password1')password2 = register_form.cleaned_data.get('password2')email = register_form.cleaned_data.get('email')sex = register_form.cleaned_data.get('sex')department = register_form.cleaned_data.get('department')phone = register_form.cleaned_data.get('phone')if password1 != password2:message = '两次输入密码不同!'return render(request, 'register.html', locals())else:same_phone_user = models.User.objects.filter(phone=phone)if same_phone_user:message = '该账号已存在'return render(request, 'register.html', locals())same_email_user = models.User.objects.filter(email=email)if same_email_user:message = '该邮箱已经被注册'return render(request, 'register.html', locals())# 将form表单中输入的内容保存到数据库当中new_user = models.User()new_user.username = username# 数据库不明文存储密码,使用hash加密new_user.password = hash_code(password1)new_user.email = emailnew_user.sex = sexnew_user.department = departmentnew_user.phone = phone# 最后需要使用save()函数保存才能生效new_user.save()return render(request, 'confirm.html', locals())else:return render(request, 'register.html',locals())register_form = forms.RegisterForm()return render(request, 'register.html', locals())# 注销视图,无使用模板def logout(request):if not request.session.get('is_login', None):return redirect('/login/')# 清空session 断开连接 回到login界面request.session.flush()# del request.session['is_login']return redirect("/login/")
# 一级路由urls.pyfrom django.contrib import adminfrom django.urls import pathfrom django.urls import includeurlpatterns = [path('admin/', admin.site.urls),path('',include('login.urls')), # 进入二级路由进行正则匹配判断]
# 二级路由urls.pyfrom django.urls import pathfrom . import viewsurlpatterns = [path('index/', views.index, name='index'),path('login/', views.login, name='login'),path('register/', views.register, name='register'),path('logout/', views.logout, name='logout'),]
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql', # your db# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),'NAME': 'IDB', # your db_name'HOST': '127.0.0.1', # your host'USER': 'root', # your db_user'PASSWORD': '****', # your db_password'PORT': '3306', # your db_port}}LANGUAGE_CODE = 'zh-hans' # modifed by llpTIME_ZONE = 'Asia/Shanghai' # modifed by llpUSE_TZ = False # modifed by llp# add by llp 扩展django自身的用户表,需要修改它的模型# your_aap.models_NameAUTH_USER_MODEL = 'login.User'