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 相关文章推荐
Python 文件操作技巧(File operation) 实例代码分析
Aug 11 Python
Python程序中使用SQLAlchemy时出现乱码的解决方案
Apr 24 Python
Python2.6版本中实现字典推导 PEP 274(Dict Comprehensions)
Apr 28 Python
Selenium chrome配置代理Python版的方法
Nov 29 Python
pyqt5移动鼠标显示坐标的方法
Jun 21 Python
python原类、类的创建过程与方法详解
Jul 19 Python
postman传递当前时间戳实例详解
Sep 14 Python
Python操作SQLite/MySQL/LMDB数据库的方法
Nov 07 Python
python二分法查找算法实现方法【递归与非递归】
Dec 06 Python
pycharm如何实现跨目录调用文件
Feb 28 Python
详解Pytorch显存动态分配规律探索
Nov 17 Python
python中封包建立过程实例
Feb 18 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中通过Ajax如何实现异步文件上传的代码实例
2011/05/07 PHP
TMDPHP 模板引擎使用教程
2012/03/13 PHP
基于php设计模式中工厂模式详细介绍
2013/05/15 PHP
PHP+jQuery实现自动补全功能源码
2013/05/15 PHP
php打造智能化的柱状图程序,用于报表等
2015/06/19 PHP
PHP代码实现表单数据验证类
2015/07/28 PHP
PHP简单处理表单输入的特殊字符的方法
2016/02/03 PHP
PHP7扩展开发教程之Hello World实现方法示例
2017/08/03 PHP
Django中通过定时任务触发页面静态化的处理方式
2018/08/29 PHP
javascript中IE浏览器不支持NEW DATE()带参数的解决方法
2012/03/01 Javascript
在js中判断checkboxlist(.net控件客户端id)是否有选中
2013/04/11 Javascript
判断及设置浏览器全屏模式
2014/04/20 Javascript
node.js中的path.dirname方法使用说明
2014/12/09 Javascript
浅析ES6的八进制与二进制整数字面量
2016/08/30 Javascript
移动端点击态处理的三种实现方式
2017/01/12 Javascript
微信小程序中上传图片并进行压缩的实现代码
2018/08/28 Javascript
浅谈vue方法内的方法使用this的问题
2018/09/15 Javascript
vue 项目 iOS WKWebView 加载
2019/04/17 Javascript
npm 语义版本控制详解
2019/09/10 Javascript
Vue+Vant 图片上传加显示的案例
2020/11/03 Javascript
Python中MySQL数据迁移到MongoDB脚本的方法
2016/04/28 Python
python+opencv实现的简单人脸识别代码示例
2017/11/14 Python
基于wxPython的GUI实现输入对话框(2)
2019/02/27 Python
详解python--模拟轮盘抽奖游戏
2019/04/12 Python
详解用python计算阶乘的几种方法
2019/08/14 Python
解决安装pyqt5之后无法打开spyder的问题
2019/12/13 Python
Python使用plt.boxplot() 参数绘制箱线图
2020/06/04 Python
深入了解python列表(LIST)
2020/06/08 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
2021/03/03 Python
丝芙兰法国官网:SEPHORA法国
2016/09/01 全球购物
英国最大的在线床超市:Bed Star
2019/01/24 全球购物
婚礼主持结束词
2014/03/13 职场文书
升职自荐书
2019/05/09 职场文书
Python djanjo之csrf防跨站攻击实验过程
2021/05/14 Python
golang实现一个简单的websocket聊天室功能
2021/10/05 Golang
win11无线投屏在哪设置? win11无线投屏功能的使用方法
2022/04/08 数码科技