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>
效果:
该代码还存在一定的问题:
需要对用户数据进行校验!!!需要在前端对数据校验后,在后端页校验一遍!!!
不要当用户是老实人!!!!!
不要当用户是老实人!!!!!
不要当用户是老实人!!!!!
我因为登陆不是重点问题,就不写啦!!!