Django认证系统实现的web页面

Posted Leslie-x

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django认证系统实现的web页面相关的知识,希望对你有一定的参考价值。

在学习了Django认证系统后,对于利用Django实现web开发的流程有了初步了解。结合这一段时间的所学,做了个web页面。结合数据库、ajax、js、Djangoform表单和认证系统等

一:数据模块

扩展了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">
    <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 Web开发 用户注册与管理

Django REST框架--认证和权限

开源web框架django知识总结

开源web框架django知识总结

基于Django Web框架(Python)实现简单的学生管理系统 -------学习笔记

几条jQuery代码片段助力Web开发效率提升