Django认证系统实现的web页面
结合数据库、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 = {'':'男','':'女','':'保密'}
- 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">
- <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/">修改密码</a>
- <a class="btn btn-danger pull-right" href="/logout/">注销</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
Django认证系统实现的web页面的更多相关文章
- django 认证系统--3
WEB request中的认证 django使用sessions和middleware和reqeust对象联系在一起 它们通过给每一个reqeust请求添加一个request.user属性来代表当前用 ...
- Django认证系统并不鸡肋反而很重要
在使用django-admin startproject创建项目后,Django就默认安装了一个采用session实现的认证系统.这是Django相比于其他框架的一大特点:自带认证系统,开箱即用.有人 ...
- Django认证系统auth认证
使用Django认证系统auth认证 auth认证系统可以处理范围非常广泛的任务,且具有一套细致的密码和权限实现.对于需要与默认配置不同需求的项目,Django支持扩展和自定义认证;会将用户信息写入到 ...
- django认证系统 Authentication
Django自带一个用户认证系统,用于处理用户账户.群组.许可和基于cookie的用户会话. Django的认证系统包含了身份验证和权限管理两部分.简单地说,身份验证用于核实某个用户是否合法,权限管理 ...
- 自定义Django认证系统的技术方案
Django已经提供了开箱即用的认证系统,但是可能并不满足我们的个性化需求.自定义认证系统需要知道哪些地方可以扩展,哪些地方可以替换.本文就来介绍自定义Django认证系统的相关技术细节. 自定义认证 ...
- django 认证系统--2
使用django的认证系统 User 对象 User是认证系统的核心.典型代表是用户和你的站点进行交互还有限制访问.注册用户等等.django认证框架中,只存在一个User类,像'superuser' ...
- django 认证系统--1
django的认证系统提供认证和授权两种功能 认证系统包括如下部分: 1.Users 2.Permissions 主要是以 YES/NO 的形式反映一个用户是否能够做某事 3.Groups:就是对多个 ...
- django认证系统-user对象(创建,改密,认证)
User对象 User对象是认证系统的核心.它们通常表示与你的站点进行交互的用户,并用于启用限制访问.注册用户信息和关联内容给创建者等.在Django的认证框架中只存在一种类型的用户,因此诸如'sup ...
- Django认证系统
一.cooie与session 1.1 cookie与session cooie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又要保持状态,因此cookie就是在这样的一个场 ...
随机推荐
- Docker使用阿里云镜像加速
1.进入阿里云镜像加速页面: https://cr.console.aliyun.com/#/accelerator 2.修改/etc/docker/daemon.json文件配置,没有则新建: { ...
- [转帖]常见USB种类
随着 USB Type-C 接口被苹果推上热门话题,那么对于我们普通的消费者来说,各种 USB 接口类型我们知道多少?买一个设备回来我们是否会遇到各种接口各种线用不了的情况呢? 那么我们泪雪网新开的一 ...
- MacOS & .DS_Store
MacOS & .DS_Store .DS_Store === Desktop Services Store https://en.wikipedia.org/wiki/.DS_Store h ...
- JS选取DOM元素的方法
摘自JavaScript权威指南(jQuery根据样式选择器查找元素的终极方式是 先用getElementsByTagName(*)获取所有DOM元素,然后根据样式选择器对所有DOM元素进行筛选) 今 ...
- BAT等公司必问的8道Java经典面试题,你都会了吗?
工作多年以及在面试中,我经常能体会到,有些面试者确实是认真努力工作,但坦白说表现出的能力水平却不足以通过面试,通常是两方面原因: 1.“知其然不知其所以然”.做了多年技术,开发了很多业务应用,但似乎并 ...
- UVAlive5135_Mining Your Own Business
好题.给一个无向图,求最少染黑多少个点后,使得任意删除一个点,每一个点都有与至少一个黑点联通. 一开始的确不知道做.看白书,对于一个联通分量,如果它有两个或以上的割点,那么这个分量中间的任何一个点都是 ...
- Bank Robbery LightOJ - 1163(推方程 注意计算机的计算方式)
题意:一个数A,如果A去掉它的最后一位就变成了B,即B=A/10,给A - B,求A #include <iostream> #include <cstdio> #includ ...
- Fortinet Security Fabric
Fortinet Security Fabric 这个世界从不固步自封.在技术方面,这意味着解决方案供应商必须保持不断创新和探索才能实现生存与发展. 在网络安全领域,这更是至理名言.许多黑客都是才华横 ...
- 【uoj129】 NOI2015—寿司晚宴
http://uoj.ac/problem/129 (题目链接) 题意 给出2~n这n-1个数,求选2个集合,使得从两集合中任意各选取1个数出来它们都互质.求方案数. Solution PoPoQQQ ...
- Raven: 2靶机入侵
0x00 前言 Raven 2是一个中等难度的boot2root 虚拟靶机.有四个flag需要找出.在多次被攻破后,Raven Security采取了额外措施来增强他们的网络服务器安全以防止黑客入侵. ...