Django认证系统实现的web页面实现代码


Posted in Python onAugust 12, 2019

结合数据库、ajax、js、Djangoform表单和认证系统的web页面

一:数据模块

扩展了Django中的user表,增加了自定义的字段

from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
class UserInfo(AbstractUser):
 phone = models.CharField(max_length=11)
 gender = models.CharField(max_length=2)

二:路由系统

from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
 url(r'^admin/', admin.site.urls),
 url(r'^register/',views.register),
 url(r'^login/',views.login_view),
 url(r'^home/',views.home),
 url(r'^logout/',views.logout_view),
 url(r'^modify_pwd/',views.modify_pwd),
 url(r'^$',views.home),
]

三:视图系统

from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from django.http import JsonResponse
from django.contrib.auth import authenticate, login,logout
from app01 import forms
from app01.models import UserInfo
# Create your views here.
def register(request):
 form_obj = forms.Reg_form()
 if request.method == 'POST':
  form_obj = forms.Reg_form(request.POST)
  if form_obj.is_valid():
   info_dic = form_obj.cleaned_data
   sex_dic = {'1':'男','2':'女','3':'保密'}
   info_dic['gender']=sex_dic[info_dic['gender']]

   UserInfo.objects.create_user(
    username=info_dic['username'],
    password = info_dic['pwd'],
    gender=info_dic['gender'],
    phone =info_dic['phone']
   )
   return redirect('/login/')
 return render(request, "register.html",{'form_obj':form_obj})


def login_view(request):
 if request.method == 'POST':
  username = request.POST.get('username')
  pwd = request.POST.get('pwd')
  user = authenticate(username=username, password=pwd)
  if user:
   login(request, user)
   data = {'code':1}
  else:
   data = {'code': 0,'msg':'用户名或密码错误'}
  return JsonResponse(data)
 return render(request, 'login.html')


@login_required
def logout_view(request):
 logout(request)
 return redirect('/login/')

@login_required
def home(request):
 user_id = request.session['_auth_user_id']
 use_obj = request.user
 return render(request,'home.html',{'user':use_obj})

@login_required
def modify_pwd(request):
 if request.method == 'POST':
  old_pwd = request.POST.get('old_pwd')
  pwd = request.POST.get('pwd')
  re_pwd = request.POST.get('re_pwd')
  user_obj = request.user
  if user_obj.check_password(old_pwd):
   if re_pwd == pwd:
    user_obj.set_password(pwd)
    user_obj.save()
    data = {'code': 1}
   else:
    data = {'code': 0, 'msg': '两次输入密码不一致'}
  else:
   data = {'code': 0, 'msg': '原始密码输入错误'}
  return JsonResponse(data)
 return render(request,'modify_pwd.html')

四:form表单

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# Author:YiJun
from django import forms
from app01 import models
from django.forms import widgets
from django.core.exceptions import ValidationError # 导入异常
import re
# Create your views here.
class Reg_form(forms.Form):
 # 用户名表单
 username = forms.CharField(
  min_length=4,
  label="设置用户名",
  error_messages={
   "required": "不能为空",
   "invalid": "格式错误",
   "min_length": "用户名最少4个字符"
  },
  widget=widgets.TextInput(
   attrs={
    'class': "form-control",
    'placeholder': '用户名'
   })
 )
 # 用户密码设置表单
 pwd = forms.CharField(
  min_length=6,
  label="设置密码",
  widget=forms.widgets.PasswordInput(
   attrs={
    'class': 'form-control',
    'placeholder': '密码'},
   render_value=True,
  ),
  error_messages={
   "required": "不能为空",
   "invalid": "格式错误",
   "min_length": "密码至少6位"

  }
 )
 # 用户密码确认表单
 r_pwd = forms.CharField(
  min_length=6,
  label="确认密码",
  widget=forms.widgets.PasswordInput(
   attrs={
    'class': 'form-control',
    'placeholder': '确认密码'},
   render_value=True,
  ),
  error_messages={
   "required": "不能为空",
   "invalid": "格式错误",
   "min_length": "密码至少6位"

  }
 )
 # 用户性别选择表单
 gender = forms.ChoiceField(
  choices=((1, "男"), (2, "女"), (3, "保密")),
  label="性别",
  initial=3,
  widget=forms.widgets.RadioSelect
 )
 # 用户手机号码表单
 phone = forms.CharField(
  label="手机号码",
  max_length=11,
  min_length=11,
  error_messages={
   "required": "不能为空",
   "invalid": "格式错误",
   "min_length": "手机号码至少11位",
   "max_length": "手机号码最多11位",
  },
  widget=widgets.TextInput(attrs={'class': "form-control",'placeholder': '手机号码'})
 )

 def clean_phone(self):
  value = self.cleaned_data['phone']
  expression = re.compile('^1[3589][0-9]{9}')
  if not expression.search(value).group():
   raise ValidationError('请输入正确的手机号码')
  else:
   return value
 def clean_username(self):
  value = self.cleaned_data['username']
  if models.UserInfo.objects.filter(username=value):
   raise ValidationError('用户名已经注册')
  else:
   return value
 def clean(self):
  pwd = self.cleaned_data.get("pwd")
  r_pwd = self.cleaned_data.get("r_pwd")
  if pwd != r_pwd:
   self.add_error("r_pwd", "两次输入的密码不一致!")
   # 两次输入的密码不一致
   raise ValidationError("两次输入的密码不一致!")
  else:
   self.cleaned_data.pop('r_pwd')
   return self.cleaned_data

五:模板系统

注册页面

<!doctype html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport"
   content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css" rel="external nofollow" >
 <title>Document</title>
</head>
<body>
<div class="container">
 <div class="row" style="margin-top: 50px">
  <div class="panel panel-primary">

   <div class="panel-heading"><h4>用户详细信息</h4></div>
   <div class="panel-body">

   </div>

   <!-- Table -->
   <div class="table-responsive">
    <table class="table table-bordered">
     <thead>
     <tr>
      <th>#</th>
      <th>用户名</th>
      <th>手机号码</th>
      <th>上次登陆时间</th>
      <th>注册时间</th>
      <th>用户性别</th>
     </tr>
     </thead>
     <tbody>
     <tr>
      <th scope="row">1</th>
      <td>{{ user.username }}</td>
      <td>{{ user.phone }}</td>
      <td>{{ user.last_login|date:'Y-m-d H:i:s' }}</td>
      <td>{{ user.date_joined|date:'Y-m-d H:i:s' }}</td>
      <td>{{ user.gender }}</td>
     </tr>
     </tbody>
    </table>
   </div>
  </div>
  <div style="margin-top: 20px">
   <a class="btn btn-info " href="/modify_pwd/" rel="external nofollow" >修改密码</a>
   <a class="btn btn-danger pull-right" href="/logout/" rel="external nofollow" >注销</a>
  </div>
 </div>
</div>
<script src="/static/jquery-3.3.1.min.js"></script>
<script src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script>
</body>
</html>
home.html

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
bat和python批量重命名文件的实现代码
May 19 Python
numpy中的高维数组转置实例
Apr 17 Python
Django如何配置mysql数据库
May 04 Python
Python实现求两个数组交集的方法示例
Feb 23 Python
聊聊python里如何用Borg pattern实现的单例模式
Jun 06 Python
python SVD压缩图像的实现代码
Nov 05 Python
Python爬取爱奇艺电影信息代码实例
Nov 26 Python
python GUI库图形界面开发之PyQt5浏览器控件QWebEngineView详细使用方法
Feb 26 Python
基于Numba提高python运行效率过程解析
Mar 02 Python
pandas中的ExcelWriter和ExcelFile的实现方法
Apr 24 Python
matplotlib.pyplot.matshow 矩阵可视化实例
Jun 16 Python
Python3利用scapy局域网实现自动多线程arp扫描功能
Jan 21 Python
django 自定义过滤器(filter)处理较为复杂的变量方法
Aug 12 #Python
django-filter和普通查询的例子
Aug 12 #Python
利用python实现汉字转拼音的2种方法
Aug 12 #Python
python面向对象 反射原理解析
Aug 12 #Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
Aug 12 #Python
Django 查询数据库并返回页面的例子
Aug 12 #Python
python3 深浅copy对比详解
Aug 12 #Python
You might like
PHP实现单例模式最安全的做法
2014/06/13 PHP
PHP中spl_autoload_register()函数用法实例详解
2016/07/18 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
PHPUnit + Laravel单元测试常用技能
2019/11/06 PHP
HTML IMG标签 onload 内存溢出导致浏览器CPU占用过高
2021/03/09 Javascript
js获取checkbox复选框选中的选项实例
2014/08/24 Javascript
JS数组的常见用法实例
2015/02/10 Javascript
jQuery使用post方法提交数据实例
2015/03/25 Javascript
jquery代码实现简单的随机图片瀑布流效果
2015/04/20 Javascript
JavaScript实现的多种鼠标拖放效果
2015/11/03 Javascript
jQuery实例—选项卡的简单实现(js源码和jQuery)
2016/06/14 Javascript
JS实现类似51job上的地区选择效果示例
2016/11/17 Javascript
js实现界面向原生界面发消息并跳转功能
2016/11/22 Javascript
详解js的六大数据类型
2016/12/27 Javascript
nodejs 最新版安装npm 的使用详解
2018/01/18 NodeJs
详解Node 定时器
2018/02/26 Javascript
基于angular6.0实现的一个组件懒加载功能示例
2018/04/12 Javascript
微信小程序实现省市区三级地址选择
2020/06/21 Javascript
NodeJS读取分析Nginx错误日志的方法
2019/05/14 NodeJs
python实现诗歌游戏(类继承)
2019/02/26 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
2019/03/20 Python
python 抓包保存为pcap文件并解析的实例
2019/07/23 Python
python单线程下实现多个socket并发过程详解
2019/07/27 Python
python:批量统计xml中各类目标的数量案例
2020/03/10 Python
aws 通过boto3 python脚本打pach的实现方法
2020/05/10 Python
Keras中的多分类损失函数用法categorical_crossentropy
2020/06/11 Python
详解vscode实现远程linux服务器上Python开发
2020/11/10 Python
使用pandas读取表格数据并进行单行数据拼接的详细教程
2021/03/03 Python
《我要的是葫芦》教学反思
2014/02/23 职场文书
授权委托书
2014/07/31 职场文书
入党积极分子批评与自我批评思想汇报
2014/09/14 职场文书
读后感作文评语
2014/12/25 职场文书
兵马俑导游词
2015/02/02 职场文书
小学生暑假安全公约
2015/07/14 职场文书
SpringBoot全局异常处理方案分享
2022/05/25 Java/Android
WinServer2012搭建DNS服务器的方法步骤
2022/06/10 Servers