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>
效果:
該代碼還存在一定的問題:
需要對用戶數據進行校驗!!!需要在前端對數據校驗後,在後端頁校驗一遍!!!
不要當用戶是老實人!!!!!
不要當用戶是老實人!!!!!
不要當用戶是老實人!!!!!
我因爲登陸不是重點問題,就不寫啦!!!