fanan-uyun / LoginWork

这是一个Django基础项目:注册登录网站实现,包含了一些基本python技术及Django技术

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Django搭建注册登录功能项目

基于Django的基础学习做了一个简单的注册登录功能网站,主要搭建了3个网页(首页、注册页面、登录页面)来做一个基础的模型。注册登录界面实现刷新图片右缩form表单在左边。

1、新建一个base模板页面来作为三个页面的模板,使用Django模板继承标签实现

2、建立模型型实现简单注册登录功能的两个字段:用户名和密码(同步数据库)

3、视图函数与对应路由的编写(包括注册、登录、首页主要功能显示,后续功能实现优化了登录校验装饰器实现、注册登录密码加密、前端ajax和后端用户名重复校验、cookie和session的下发校验及删除实现用户及网站的安全性)

首页截图

首页


视图代码部分截图

视图


登录页面截图

登录


注册页面截图

注册


ajax用户名校验截图

ajax


视图函数完整代码展示

from django.shortcuts import render,render_to_response
from LoginApp.models import LoginUser # 导入数据模型类
from django.http import HttpResponseRedirect,JsonResponse
# 封装一个装饰器,登录校验,将index源代码放入装饰器中
def LoginValid(fun):
    def inner(request,*args,**kwargs):
        data = request.COOKIES
        cookie_user = data.get("username")
        session_user = request.session.get("username")
        if cookie_user and session_user:
            user = userValid(cookie_user)
            if user and cookie_user == session_user:
                return fun(request,*args,**kwargs)
        return HttpResponseRedirect('/login/')
    return inner

# 首页视图函数
# 新增校验功能
@LoginValid
def index(request):
    return render_to_response("index.html",locals())

# 注册视图函数
def register(request):
    # 定义一个保存状态的存储变量
    result = {"status":0,"data":""} # 默认状态0错误,数据为空;1为成功状态
    # 判断请求方式
    if request.method == "POST":
        # 获取账户输入框数据
        username = request.POST.get("username")
        # 获取密码输入框数据
        password = request.POST.get("password")
        # 判断数据是否为空
        if username and password:
            user = userValid(username)
            # 判断用户名是否重复
            if user: #用户存在
                result["data"] = "用户名重复"
            else:
                user = LoginUser() # 实例化模型类
                user.username = username
                user.password = setPassword(password)
                user.save() # 保存至数据库
                result["status"] = 1
                result["data"] = "用户注册成功"
                return HttpResponseRedirect('/login/')
        else:
            result["data"] = "用户名或密码不可以为空"
    # else:
    #     #     res["data"] = "请求方式有误"

    return render(request,"register.html",locals())

# 登录视图函数
def login(request):
    # 定义一个保存状态的存储变量
    result = {"status": 0, "data": ""}  # 默认状态0错误,数据为空;1为成功状态
    # 判断请求方式
    if request.method == "POST":
        # 获取账户输入框数据
        username = request.POST.get("username")
        # 获取密码输入框数据
        password = request.POST.get("password")
        # 判断数据是否为空
        if username:
            user = userValid(username)
            if user:#用户存在
                if user.password == setPassword(password):# 密码验证成功
                    # 密码验证成功,则设置cookie和session,并跳转index页面
                    response = HttpResponseRedirect('/index/')
                    response.set_cookie("username" , user.username)
                    request.session["username"] = user.username
                    return response
                else:
                    result["data"] = "密码错误"
            else:
                result["data"] = "用户名不存在"
        else:
            result["data"] = "用户名或密码不可以为空"
    return render(request,"login.html",locals())


# 退出功能
def exit(request):
    # username = request.COOKIES.get("username")
    response = HttpResponseRedirect('/login/')
    response.delete_cookie("username")
    del request.session["username"]
    return response

import hashlib  # 导入加密模块
# 密码加密
def setPassword(password):
    md5 = hashlib.md5()  # 创建一个hash对象,使用hashlib中的md5加密方法
    md5.update(password.encode())  # 填充要加密的数据,此处必须编码成字节,否则报错
    return md5.hexdigest()  # 返回加密的结果

# 用户名后端校验代码整合
def userValid(username):
    user = LoginUser.objects.filter(username=username).first()
    return user

# 用户名前端ajax校验
def ajax_userValid(request):
    result = {"status":0,"data":""}
    username = request.POST.get("username")
    if username:
        user = userValid(username)
        if user:
            result["data"] = "用户名已存在"
        else:
            result["status"] = 1
            result["data"] = "用户名可以使用"
    else:
        result["data"] = "用户名不能为空"
    return JsonResponse(result)

前端注册功能完整代码展示

{% extends "base.html" %}

{% block title %}
    注册页面
{% endblock %}

{% block style %}
    <link rel="stylesheet" href="/static/css/register.css">
    <script src="/static/js/jquery.min.js"></script>
{% endblock %}

{% block container %}
    <div class="left">
        <div class="header">
          <h2 class="animation a1">注册</h2>
          <h4 class="animation a2">请输入用户名及密码进行注册</h4>
        </div>
        <form action="" method="post" class="form">
            {% csrf_token %}
          <input type="text" id="id_username" class="form-field animation a3" name="username" placeholder="请输入用户名">
          <input type="password" class="form-field animation a4" name="password" placeholder="请输入密码">
          <p class="animation a5"><a href="#">忘记密码</a></p>
          <button id="submit" class="animation a6">注册</button>
        </form>
{#        <p style="color: red;font-size: 16px">{{ result.data }}</p>#}
        <p style="color: orangered;font-size: 16px" id="sign"></p>
    </div>

    <script>
        $("#id_username").blur(
            function () {
                var username = $("#id_username").val();
                var csrfmiddlewaretoken = '{{ csrf_token }}';
                var url = "/ajax/";
                send_data = {
                    "username":username,
                    "csrfmiddlewaretoken":csrfmiddlewaretoken
                };
                $.ajax(
                    {
                        url: url,
                        type: "post",
                        data: send_data,
                        success: function (data) {
                            var stat = data.status;
                            $("#sign").text(data.data);
                            if(stat=="0"){
                                $("#submit").attr("disabled",true);
                                document.getElementById('submit').style.color="#AFBABF";
                            }else {
                                $("#submit").attr("disabled",false);
                                document.getElementById('submit').style.color="#FFFFFF";
                            }
                        },
                        error: function (error) {
                            console.log(error)
                        }
                    }
                )
            }
        )
    </script>

{% endblock %}

个人博客地址:https://blog.csdn.net/z_ipython

About

这是一个Django基础项目:注册登录网站实现,包含了一些基本python技术及Django技术


Languages

Language:Python 47.1%Language:CSS 31.2%Language:HTML 21.7%