zoukankan      html  css  js  c++  java
  • Django认证系统之自定义认证表

    models.py

    1 from django.db import models
    2 
    3 from django.contrib.auth.models import AbstractUser
    4 
    5 
    6 class Userinfo(AbstractUser):
    7 
    8     email = models.EmailField()
    models.py

     

    seetings.py

    AUTH_USER_MODEL='app01.Userinfo'#自定义认证表:应用名.类名 

     

    views.py

      1 from django.shortcuts import render, HttpResponse, redirect
      2 from django import forms
      3 from django.core.validators import RegexValidator
      4 from django.core.exceptions import ValidationError
      5 import re
      6 from app01 import models
      7 from django.http import JsonResponse
      8 from django.urls import reverse
      9 from django.contrib import auth
     10  
     11 # Create your views here.
     12  
     13 def name_valid(value):
     14     name_re = re.compile(r'^[d]+')
     15     ret = name_re.match(value)
     16     if ret:
     17         raise ValidationError('用户名不能以数字开头!')
     18  
     19 class RegisterForm(forms.Form):
     20     name = forms.CharField(
     21         required=True,
     22         label='用户名:',
     23         min_length=6,
     24         max_length=32,
     25         help_text='只能有字母数字下划线组成,且不能以数字开头,长度6到32位!',
     26         # initial='admin123_',
     27         error_messages={
     28             'required': '用户名不能为空!',
     29             'min_length': '长度不能少于6位!',
     30             'max_length': '长度不能超过32位!',
     31         },
     32         validators=[RegexValidator(r'^[a-zA-Z0-9_]+$', '用户名只能包含字母数字下划线!'), name_valid],
     33     )
     34     password = forms.CharField(
     35         required=True,
     36         label='密码:',
     37         min_length=6,
     38         max_length=32,
     39         help_text='长度6到32位!',
     40         initial='',
     41         error_messages={
     42             'required': '密码不能为空!',
     43             'min_length': '长度不能少于6位!',
     44             'max_length': '长度不能超过32位!',
     45         },
     46         widget=forms.PasswordInput(render_value=True),
     47     )
     48     r_password = forms.CharField(
     49         required=True,
     50         label='确认密码:',
     51         min_length=6,
     52         max_length=32,
     53         help_text='长度6到32位!',
     54         initial='',
     55         error_messages={
     56             'required': '密码不能为空!',
     57             'min_length': '长度不能少于6位!',
     58             'max_length': '长度不能超过32位!',
     59         },
     60         widget=forms.PasswordInput(render_value=True),
     61     )
     62     email = forms.EmailField(
     63         required=True,
     64         label='邮箱',
     65         error_messages={
     66             'required': '邮箱不能为空!',
     67         }
     68     )
     69  
     70     def __init__(self, *args, **kwargs):
     71         super(RegisterForm, self).__init__(*args, **kwargs)
     72         for field in self.fields:
     73             self.fields[field].widget.attrs.update({'class': 'form-control'})
     74  
     75     def clean_name(self):
     76         pass
     77         return self.cleaned_data.get('name')
     78  
     79     def clean_password(self):
     80         pass
     81         return self.cleaned_data.get('password')
     82  
     83     def clean_r_password(self):
     84         pass
     85         return self.cleaned_data.get('r_password')
     86  
     87     def clean_email(self):
     88         pass
     89         return self.cleaned_data.get('email')
     90  
     91     def clean(self):
     92         password = self.cleaned_data.get('password')
     93         r_password = self.cleaned_data.get('r_password')
     94         if password != r_password:
     95             self.add_error('r_password', '两次密码不一致!')
     96             raise ValidationError('两次密码不一致!')
     97         else:
     98             return self.cleaned_data
     99  
    100  
    101 # 注册
    102 def register(request):
    103     if request.method == 'GET':
    104         register_obj = RegisterForm()
    105         return render(request, 'register.html', {'register_obj': register_obj})
    106     elif request.method == 'POST':
    107         data = request.POST
    108         # print(data)
    109         register_obj = RegisterForm(data)
    110         if register_obj.is_valid():
    111             user_obj = register_obj.cleaned_data
    112             print(user_obj)
    113             username = user_obj.get('name')
    114             password = user_obj.get('password')
    115             email = user_obj.get('email')
    116  
    117             if not models.Userinfo.objects.filter(username=username).exists():
    118                 new_obj = models.Userinfo.objects.create_user(username=username, password=password, email=email)
    119                 print(f'新用户{username}注册成功!')
    120                 return redirect('login')
    121             else:
    122                 register_obj.add_error('name', '用户名已存在!')
    123                 return render(request, 'register.html', {'register_obj': register_obj})
    124         else:
    125             return render(request, 'register.html', {'register_obj': register_obj})
    126 # 登录
    127 def login(request):
    128     if request.method == 'GET':
    129         return render(request, 'login.html')
    130     elif request.method == 'POST':
    131         # print(request.POST)
    132         username = request.POST.get('username')
    133         password = request.POST.get('password')
    134  
    135         user_obj = auth.authenticate(username=username, password=password)
    136         print(user_obj)
    137         if user_obj:
    138             auth.login(request, user_obj)
    139             return JsonResponse({'status': 1, 'url': reverse('index')})
    140         else:
    141             return JsonResponse({'status': 0, 'url': ''})
    142  
    143 #访问认证
    144 def index(request):
    145     if request.user.is_authenticated:
    146         print(request.user)
    147         if request.method == 'GET':
    148             return render(request, 'index.html')
    149     else:
    150         return redirect('login')
    151  
    152 #注销
    153 def logout(request):
    154     auth.logout(request)
    155     return redirect('login')
    156  
    157 #修改密码
    158 def reset_psd(request):
    159     if request.user.is_authenticated:
    160         if request.method == 'GET':
    161             return render(request, 'reset_psd.html')
    162         elif request.method == 'POST':
    163             old_password = request.POST.get('old_password')
    164             new_password = request.POST.get('new_password')
    165             r_new_password = request.POST.get('r_new_password')
    166             # ret=request.user.check_password(old_password)
    167             # print(ret)
    168             if request.user.check_password(old_password):
    169                 if new_password == r_new_password:
    170                     request.user.set_password(new_password)
    171                     request.user.save()
    172                     return JsonResponse({'status': True, 'info': '操作成功!', 'url': reverse('index')})
    173                 else:
    174                     return JsonResponse({'status': False, 'info': '两次新密码不一致!', 'url': ''})
    175             else:
    176                 return JsonResponse({'status': False, 'info': '操作失败:原密码输入有误!', 'url': ''})
    177         return JsonResponse({'status': False, 'info': '操作失败!', 'url': ''})
    178  
    179     else:
    180         return redirect('login')
    views.py

    urls.py

     1 from django.conf.urls import url
     2 from django.contrib import admin
     3 from app01 import views
     4  
     5 urlpatterns = [
     6     url(r'^admin/', admin.site.urls),
     7     url(r'^register/', views.register, name='register'),
     8     url(r'^login/', views.login, name='login'),
     9     url(r'^index/', views.index, name='index'),
    10     url(r'^logout/', views.logout, name='logout'),
    11     url(r'^reset_psd/', views.reset_psd, name='reset_psd'),
    12  
    13 ]
    14  
    urls.py

    templates

    register.html

     1 {% load static %}
     2 <!DOCTYPE html>
     3 <html lang="en">
     4 <head>
     5     <meta charset="UTF-8">
     6     <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
     7     <title>用户注册</title>
     8 </head>
     9 <body style="background-image: url('{% static 'images/register_bg.gif' %}');background-size: cover">
    10 <div class="container">
    11     <div class="row">
    12         <div class="col-xs-6 col-xs-offset-3" style="margin-top: 12%;">
    13             <div class="container-fluid" style="background-color: rgba(255,255,255,0.2);border-radius: 5%">
    14                 <div class="row">
    15                     <h2 class="text-left col-xs-8 text-primary">新用户注册:</h2>
    16                 </div>
    17                 <div class="row" >
    18                     <form action="{% url 'register' %}" method="post" novalidate class="form-horizontal">
    19                         {% csrf_token %}
    20                         {% for field in register_obj %}
    21                             <div class="form-group" >
    22                                 <label for="{{ field.id_for_label }}"
    23                                        class="col-xs-3 control-label" >{{ field.label }}</label>
    24                                 <div class="col-xs-7">
    25                                     {{ field }}
    26                                     <div style="height: 10px;" class="text-danger">{{ field.errors.0 }}</div>
    27                                 </div>
    28                             </div>
    29                         {% endfor %}
    30                         <div class="form-group">
    31                             <div class="col-sm-7  col-xs-offset-3">
    32                                 <span class="col-xs-10 text-success text-center"
    33                                       style="line-height: 200%">已有账号,请<a href="{% url 'login' %}">登录</a></span>
    34                                 <input type="submit" class="btn btn-success btn-sm col-xs-2 pull-right">
    35                             </div>
    36                         </div>
    37                     </form>
    38                 </div>
    39             </div>
    40         </div>
    41     </div>
    42 </div>
    43 </body>
    44 <script src="{% static 'jquery-3.4.1.js' %}"></script>
    45 <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
    46 </html>
    register.html

    login.html

      1 {% load static %}
      2 <!DOCTYPE html>
      3 <html lang="en">
      4 <head>
      5     <meta charset="UTF-8">
      6     <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
      7     <title>用户登录</title>
      8 </head>
      9 <body style="background-image: url('{% static "images/login_bg.jpg" %}');background-size: cover">
     10 <div>
     11     <div class="container">
     12         <div class="row">
     13             <div class='col-xs-4 col-xs-offset-4'>
     14                 <div class="row" style="margin-top: 50%;background-color: rgba(255,255,255,0.2 );border-radius: 3%">
     15                     <div class="row c1">
     16                         <h2 class=" col-xs-6  text-primary" style="margin-bottom: 30px">用户登录</h2>
     17                     </div>
     18                     <div class="row">
     19                         <div class="form-group" style="height: 60px;">
     20                             <label for="username" class="col-xs-3 control-label text-right">用户名:</label>
     21                             <div class="col-xs-8">
     22                                 <input type="text" class="form-control" id="username">
     23                                 <div class="text-danger"></div>
     24                             </div>
     25                         </div>
     26                         <div class="form-group" style="height: 60px;">
     27                             <label for="password" class="col-xs-3 control-label text-right">密码:</label>
     28                             <div class="col-xs-8">
     29                                 <input type="password" class="form-control" id="password">
     30                                 <div class="text-danger"></div>
     31                             </div>
     32                         </div>
     33                         <div class="form-group" style="height: 60px;">
     34                             {% csrf_token %}
     35                             <div class="col-xs-8 col-xs-offset-3">
     36                                 <a href="{% url 'register' %}">
     37                                     <button class="btn btn-primary col-xs-offset-2" id="register">注册</button>
     38                                 </a>
     39                                 <button class="btn btn-success col-xs-offset-2" id="submit">登录</button>
     40                                 <div class=" text-danger"></div>
     41                             </div>
     42                         </div>
     43                     </div>
     44                 </div>
     45             </div>
     46         </div>
     47     </div>
     48 </div>
     49  
     50 </div>
     51 </div>
     52 </body>
     53 <script src="{% static 'jquery-3.4.1.js' %}"></script>
     54 <script src="{% static 'jquery-cookie-1.4.1.js' %}"></script>
     55 <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
     56 <script>
     57     $(function () {
     58         $('#username').blur(function () {
     59            if(username !== ''){$('#username').next().text('');}
     60         });
     61         $('#password').blur(function () {
     62            if(username !== ''){$('#password').next().text('');}
     63         });
     64         $('#username').focus(function () {
     65            if(username !== ''){$('#submit').next().text('');}
     66         });
     67         $('#password').focus(function () {
     68            if(username !== ''){$('#submit').next().text('');}
     69         });
     70  
     71  
     72         $('#submit').click(function () {
     73  
     74             var username = $('#username').val().trim();
     75             var password = $('#password').val().trim();
     76  
     77  
     78             if (username === '' || password === '') {
     79                 if (username === '') {
     80                     $('#username').next().text('用户名不能为空!');
     81                 }
     82                 ;
     83                 if (password === '') {
     84                     $('#password').next().text('密码不能为空!')
     85                 }
     86                 ;
     87  
     88             } else {
     89                 $.ajax({
     90                     url: '{% url 'login' %}',
     91                     type: 'POST',
     92                     headers: {'X-CSRFToken': $.cookie('csrftoken')},
     93                     data: {
     94                         'username': username,
     95                         'password': password,
     96  
     97                     },
     98                     success: function (request) {
     99                         console.log(request);
    100                         if (request.status === 1) {
    101                             location.href = request.url;
    102                         } else {
    103                             $('#submit').next().text('账号或密码有误!');
    104                         }
    105                     }
    106  
    107                 })
    108             }
    109  
    110         })
    111     })
    112 </script>
    113 </html>
    114  
    login.html

    index.html

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>首页</title>
     6 </head>
     7 <body>
     8 <h1>index</h1>
     9 <a href="{%  url 'logout' %}"><h6>注销</h6></a>
    10 <a href="{% url 'reset_psd' %}">修改密码</a>
    11 </body>
    12 </html>
    index.html

    reset_psd.html

     1 {% load static %}
     2 <!DOCTYPE html>
     3 <html lang="en">
     4 <head>
     5     <meta charset="UTF-8">
     6     <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
     7     <title>修改密码</title>
     8 </head>
     9 <body>
    10 <div><h3>当前用户:{{ username }}</h3>
    11         <p>请输入原密码:<input type="password" id="old_password"></p>
    12         <P>请输入新密码:<input type="password" id="new_password"></P>
    13         <p>请确认新密码:<input type="password" id="r_new_password"></p>
    14         {% csrf_token %}
    15         <p><button class="btn btn-success" id="submit">保存</button></p>
    16     </form>
    17 </div>
    18 </body>
    19 <script src="{% static 'jquery-3.4.1.js' %}"></script>
    20 <script src="{% static 'jquery-cookie-1.4.1.js' %}"></script>
    21 <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
    22 <script>
    23     $(function () {
    24         $('#submit').click(function () {
    25             var old_password=$('#old_password').val().trim();
    26             var new_password=$('#new_password').val().trim();
    27             var r_new_password=$('#r_new_password').val().trim();
    28  
    29             if(old_password===''||new_password==='' || r_new_password===''){
    30                 alert('不允许有空!');
    31                 return false
    32             };
    33  
    34             if(new_password!==r_new_password){
    35                 alert('两次输入的新密码不一致,请重新确认输入!');
    36                 return false
    37             };
    38             $.ajax({
    39                 url:'{% url "reset_psd" %}',
    40                 type:'post',
    41                 headers:{'X-CSRFToken':$.cookie('csrftoken')},
    42                 data:{
    43                     old_password:old_password,
    44                     new_password:new_password,
    45                     r_new_password:r_new_password,
    46                 },
    47                 success:function (response) {
    48                     if(response.status===true){
    49                         alert(response.info);
    50                         location.href=response.url;
    51                     }
    52                     else {
    53                         alert(response.info)
    54                     }
    55                 }
    56             }
    57             )
    58         })
    59     })
    60 </script>
    61 </html>
    reset_psd.hml

     

     

     

     

  • 相关阅读:
    如何使用vs2008单元测试416a3648
    限制TextBox的长度
    DataGrid双击事件
    结构与类
    DataGrid删除对话框 & 限制编辑模试TextBox长度
    安逸...
    新来的,请多关照~!
    asp.net中使用JMail发邮件
    silverlight3datagrid中的数据导出到excel
    sl3中的DataGrid中的数据导出到Excel中 使用csv格式 解决中文是乱码的问题
  • 原文地址:https://www.cnblogs.com/open-yang/p/11223250.html
Copyright © 2011-2022 走看看