Django 登陆注册模块

Django自带auth,非常的好,那就利用auth来写一个登陆注册模块吧!

auth的基本功能如下:

from django.contrib import auth


def demo(request):
  print(request.user) # 默认匿名用户对象 AnonymousUser
  print(request.user.id) # None
  print(request.user.username) # ""
  print(request.user.is_active) # False

#authenticate去auth_user查询记录,查询成功返回用户对象,查询失败返回None
user_obj = auth.authenticate(username=hello, password=1234)

# 保存用户状态信息(保存到session中)
auth.login(request, user_obj) 
# 退出登录
auth.logout(request)


@login_required(login_url='/login/') #判断ruquest.user中是否有对象,没有跳转到/login/
def index(request):
 return render(request, "index.html", locals())


#修改密码用set_password(密码被加密)
user=User.objects.get(username=request.user.username)
user.set_password(raw_password="666")
user.save()

主要实现三个视图,即登陆,登出,注册:

登陆视图代码:

@csrf_exempt
def login(request):
    if request.method=="GET":
        return render(request,"login/login.html")
    else:
        try:
            username = request.POST.get("InputUsername").strip()
        except Exception as e:
            dict= {"err":"email输入错误!"}
            return JsonResponse(dict)
        try:
            passowrd = request.POST.get("InputPassword").strip()
        except Exception as e:
            dict = {"err": "密码输入错误!"}
            return JsonResponse( dict)
        user_obj = auth.authenticate(username=username, password=passowrd)
        if user_obj:
            auth.login(request, user_obj)
            dict= {"statu":1,"err":"登陆成功!"}
        else:
            dict= {"err":"登陆失败!"}
        return JsonResponse( dict)

登出视图:

@csrf_exempt
def logout(request):
    auth.logout(request)
    return redirect("/login")

注册视图:

@csrf_exempt
def register(request):
    if request.method == "GET":
        return render(request, "login/register.html")
    else:
        try:
            email = request.POST.get("InputEmail").strip()
        except Exception as e:
            dict = {"err": "email输入错误!"}
            return JsonResponse(dict)
        try:
            password = request.POST.get("InputPassword").strip()
            passowrd2 = request.POST.get("RepeatPassword").strip()
            if passowrd2!=password:
                dict = {"err": "重复密码不一致!"}
                return JsonResponse(dict)
        except Exception as e:
            dict = {"err": "密码输入错误!"}
            return JsonResponse(dict)
        try:
            username = request.POST.get("InputUsername").strip()
        except Exception as e:
            dict = {"err": "姓名输入错误!"}
            return JsonResponse(dict)
        if not User.objects.filter(username=username).exists():
            new_obj = User.objects.create_user(username=username,email=email, password=password)
            dict = {"err": "注册成功!点击前往确认登陆!","statu":1}
        else:
            dict = {"err": "用户已存在!"}
        return JsonResponse(dict)

这里有个问题,Ajax和重定向一起用会崩,后端会直接法网页内容给浏览器,这样不好,因此传一个状态码,让前端自己重定向。

登陆后跳转:

@login_required
def covidindex(request):
    print("test")
    return render(request, 'COVID_19Analyse/main.html')

前端使用的SB admin2,可以去Github上找找资源。

login

{% load static %}
<!DOCTYPE html>
<html lang="en">

<head>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>Login</title>

    <!-- Custom fonts for this template-->
    <link href="{% static 'login/vendor/fontawesome-free/css/all.min.css' %}" rel="stylesheet" type="text/css">
    <link href="https://fonts.googleapis.com/css?family=Nunito:200,200i,300,300i,400,400i,600,600i,700,700i,800,800i,900,900i"
          rel="stylesheet">

    <!-- Custom styles for this template-->
    <link href="{% static 'login/css/sb-admin-2.min.css' %}" rel="stylesheet" type="text/css">

</head>

<body class="bg-gradient-primary">

<div class="container">

    <!-- Outer Row -->
    <div class="row justify-content-center">

        <div class="col-xl-10 col-lg-12 col-md-9">

            <div class="card o-hidden border-0 shadow-lg my-5">
                <div class="card-body p-0">
                    <!-- Nested Row within Card Body -->
                    <div class="row">
                        <div class="col-lg-6 d-none d-lg-block bg-login-image"></div>
                        <div class="col-lg-6">
                            <div class="p-5">
                                <div class="text-center">
                                    <h1 class="h4 text-gray-900 mb-4">Welcome Back!</h1>
                                </div>
                                <form class="user" id="UserForm">
                                    <div class="form-group">
                                        <input type="text" class="form-control form-control-user"
                                               id="InputUsername" name="InputUsername" aria-describedby="emailHelp"
                                               placeholder="Enter Username ...">
                                    </div>
                                    <div class="form-group">
                                        <input type="password" class="form-control form-control-user"
                                               id="InputPassword" name="InputPassword" placeholder="Password">
                                    </div>
                                    <div class="form-group">
                                        <div class="custom-control custom-checkbox small">
                                            <input type="checkbox" class="custom-control-input" id="customCheck">
                                            <label class="custom-control-label" for="customCheck">Remember Me</label>
                                        </div>
                                    </div>
                                    <a href="#" class="btn btn-primary btn-user btn-block" id="click">
                                        Login
                                    </a>
                                    <hr>
                                    <a href="#" class="btn btn-google btn-user btn-block">
                                        <i class="fab fa-google fa-fw"></i> Login with Google
                                    </a>
                                    <a href="#" class="btn btn-facebook btn-user btn-block">
                                        <i class="fab fa-facebook-f fa-fw"></i> Login with Facebook
                                    </a>
                                </form>
                                <hr>
                                <div class="text-center">
                                    <a class="small" href="#">Forgot Password?</a>
                                </div>
                                <div class="text-center">
                                    <a class="small" href="/register">Create an Account!</a>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>

        </div>

    </div>

</div>

<!-- Bootstrap core JavaScript-->
<script src="{% static 'login/vendor/jquery/jquery.min.js' %}"></script>
<script src="{% static 'login/vendor/bootstrap/js/bootstrap.bundle.min.js' %}"></script>
<!-- Core plugin JavaScript-->
<script src="{% static 'login/vendor/jquery-easing/jquery.easing.min.js' %}"></script>

<!-- Custom scripts for all pages-->
<script src="{% static 'login/js/sb-admin-2.min.js' %}"></script>

<script>

    $(document).ready(function () {
        $("#click").click(function () {
            $.ajax({
                url: "/login/",
                type: "POST",
                data:$("#UserForm").serialize(),
                success: function (data) {
                    if(data.statu==1){
                        window.location="/data/";
                    }
                    alert(data.err);
                }
            })
        });
    })
</script>


</body>

</html>

register:

{% load static %}
<!DOCTYPE html>
<html lang="en">

<head>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>Register</title>

    <!-- Custom fonts for this template-->
    <link href="{% static 'login/vendor/fontawesome-free/css/all.min.css' %}" rel="stylesheet" type="text/css">
    <link href="https://fonts.googleapis.com/css?family=Nunito:200,200i,300,300i,400,400i,600,600i,700,700i,800,800i,900,900i"
          rel="stylesheet">

    <!-- Custom styles for this template-->
    <link href="{% static 'login/css/sb-admin-2.min.css' %}" rel="stylesheet" type="text/css">

</head>

<body class="bg-gradient-primary">

<div class="container">

    <div class="card o-hidden border-0 shadow-lg my-5">
        <div class="card-body p-0">
            <!-- Nested Row within Card Body -->
            <div class="row">
                <div class="col-lg-5 d-none d-lg-block bg-register-image"></div>
                <div class="col-lg-7">
                    <div class="p-5">
                        <div class="text-center">
                            <h1 class="h4 text-gray-900 mb-4">Create an Account!</h1>
                        </div>
                        <form class="user" id="UserForm">
                            {% csrf_token %}
                            <div class="form-group">
                                <input type="text" class="form-control form-control-user" id="Username" name="InputUsername" placeholder="UserName">
                            </div>
                            <div class="form-group">
                                <input type="email" class="form-control form-control-user" id="InputEmail"
                                       name="InputEmail" placeholder="Email Address">
                            </div>
                            <div class="form-group row">
                                <div class="col-sm-6 mb-3 mb-sm-0">
                                    <input type="password" class="form-control form-control-user"
                                           id="InputPassword" name="InputPassword" placeholder="Password">
                                </div>
                                <div class="col-sm-6">
                                    <input type="password" class="form-control form-control-user"
                                           id="RepeatPassword" name="RepeatPassword" placeholder="Repeat Password">
                                </div>
                            </div>
                            <a href="#" class="btn btn-primary btn-user btn-block" id="click">
                                Register Account
                            </a>
                            <hr>
                            <a href="#" class="btn btn-google btn-user btn-block">
                                <i class="fab fa-google fa-fw"></i> Register with Google
                            </a>
                            <a href="#" class="btn btn-facebook btn-user btn-block">
                                <i class="fab fa-facebook-f fa-fw"></i> Register with Facebook
                            </a>
                        </form>
                        <hr>
                        <div class="text-center">
                            <a class="small" href="#">Forgot Password?</a>
                        </div>
                        <div class="text-center">
                            <a class="small" href="/login">Already have an account? Login!</a>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>

</div>

<!-- Bootstrap core JavaScript-->
<script src="{% static 'login/vendor/jquery/jquery.min.js' %}"></script>
<script src="{% static 'login/vendor/bootstrap/js/bootstrap.bundle.min.js' %}"></script>
<!-- Core plugin JavaScript-->
<script src="{% static 'login/vendor/jquery-easing/jquery.easing.min.js' %}"></script>

<!-- Custom scripts for all pages-->
<script src="{% static 'login/js/sb-admin-2.min.js' %}"></script>

<script>
    $.ajaxSetup({
        data: {csrfmiddlewaretoken: '{{ csrf_token }}'},
    });

    $(document).ready(function () {
        $("#click").click(function () {
            alert(1);
            $.ajax({
                url: "/register/",
                type: "POST",
                data:$("#UserForm").serialize(),
                success: function (data) {
                    alert(data.err);
                    if (data.statu==1){
                        window.location="/login";
                    }
                }
            })
        });
    })
</script>


</body>

</html>

效果:

该代码还存在一定的问题:

需要对用户数据进行校验!!!需要在前端对数据校验后,在后端页校验一遍!!!

不要当用户是老实人!!!!!

不要当用户是老实人!!!!!

不要当用户是老实人!!!!!

我因为登陆不是重点问题,就不写啦!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章