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 相关文章推荐
Linux 发邮件磁盘空间监控(python)
Apr 23 Python
python 系统调用的实例详解
Jul 11 Python
Python设计模式之中介模式简单示例
Jan 09 Python
pandas DataFrame数据转为list的方法
Apr 11 Python
对python遍历文件夹中的所有jpg文件的实例详解
Dec 08 Python
谈一谈基于python的面向对象编程基础
May 21 Python
基于python 微信小程序之获取已存在模板消息列表
Aug 05 Python
Python3简单爬虫抓取网页图片代码实例
Aug 26 Python
keras 特征图可视化实例(中间层)
Jan 24 Python
计算Python Numpy向量之间的欧氏距离实例
May 22 Python
Python3+RIDE+RobotFramework自动化测试框架搭建过程详解
Sep 23 Python
Numpy中的数组搜索中np.where方法详细介绍
Jan 08 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中通过curl smtp发送邮件
2012/06/05 PHP
php中的PHP_EOL换行符详细解析
2013/10/26 PHP
php获取远程图片并下载保存到本地的方法分析
2016/10/08 PHP
php+ajax+json 详解及实例代码
2016/12/12 PHP
Yii2下点击验证码的切换实例代码
2017/03/14 PHP
yii2实现Ueditor百度编辑器的示例代码
2018/11/02 PHP
js展开闭合效果演示代码
2013/07/24 Javascript
纯js代码实现未知宽高的元素在指定元素中垂直水平居中显示
2015/09/12 Javascript
jquery实现两边飘浮可关闭的对联广告
2015/11/27 Javascript
js中遍历Map对象的简单实例
2016/08/08 Javascript
jQuery实现拼图小游戏(实例讲解)
2017/07/24 jQuery
vue2.0 elementUI制作面包屑导航栏
2018/02/22 Javascript
vue3.0 CLI - 2.1 -  component 组件入门教程
2018/09/14 Javascript
javascript中一些奇葩的日期换算方法总结
2018/11/14 Javascript
[02:24]DOTA2痛苦女王 英雄基础教程
2013/11/26 DOTA
Python性能优化的20条建议
2014/10/25 Python
Python多层装饰器用法实例分析
2018/02/09 Python
实践Vim配置python开发环境
2018/07/02 Python
python+selenium实现自动抢票功能实例代码
2018/11/23 Python
Python requests模块实例用法
2019/02/11 Python
python列表推导和生成器表达式知识点总结
2020/01/10 Python
Python分类测试代码实例汇总
2020/07/23 Python
美国最大婚纱连锁店运营商:David’s Bridal
2019/03/12 全球购物
德国高尔夫商店:Golfshop.de
2019/06/22 全球购物
德国受欢迎的旅游和休闲网站:lastminute.de
2019/09/23 全球购物
广州某公司软件工程师面试题
2014/12/22 面试题
js实现弹框效果
2021/03/24 Javascript
数控加工专业毕业生自荐信
2013/09/27 职场文书
大学本科毕业生求职简历的自我评价
2013/10/09 职场文书
财务专业大学生职业生涯规划范文
2013/12/30 职场文书
物业招聘计划书
2014/01/10 职场文书
主题团日活动总结
2014/06/25 职场文书
高中教师先进事迹材料
2014/08/22 职场文书
单位接收函范文
2015/01/30 职场文书
驾驶员管理制度范本
2015/08/06 职场文书
25句企业管理语录:助你迅速打开思路,句句经典!
2020/01/14 职场文书