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>

效果:

該代碼還存在一定的問題:

需要對用戶數據進行校驗!!!需要在前端對數據校驗後,在後端頁校驗一遍!!!

不要當用戶是老實人!!!!!

不要當用戶是老實人!!!!!

不要當用戶是老實人!!!!!

我因爲登陸不是重點問題,就不寫啦!!!

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