一、我们现在做一个登录页面
1、layui :前端开发框架,类似vue
2、jquery:js代码
二、layui的静态资源引用
layui静态资源下载:Layui - 经典开源模块化前端 UI 框架
image.png
三、下载js静态资源
https://code.jquery.com/jquery-3.6.0.min.js
打开后不要害怕,你没看错
image.png
点击右键,另存为就行了
四、django中加载layui和js的静态资源
在项目的根目录下建一个 static文件夹,把下载的都放进去
image.png
然后在settings.py中把路径加载进去
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"),
)
五、现在我们来看前端代码
{% load static %} {#加载静态资源路径#}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
{#加载所有静态资源#}
<link rel="stylesheet" href="{% static 'css/layui.css' %}">
<link rel="stylesheet" href="{% static 'css/modules/laydate/default/laydate.css' %}">
<link rel="stylesheet" href="{% static 'css/modules/layer/default/layer.css' %}">
</head>
<body>
<div class="layui-container">
<div class="layui-row" style="margin-top: 200px">
<div class="layui-col-xs6layui-col-sm6 layui-col-md6 layui-col-xs-offset3 layui-col-sm-offset3 layui-col-md-offset3">
<div class="layui-row layui-col-space15">
<div class="layui-col-xs12 layui-col-sm12 layui-col-md12">
<div class="layui-panel">
<div style="padding: 30px;">
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;">
<legend>自动化测试平台登录</legend>
</fieldset>
<form class="layui-form" action="" lay-filter="example">
<div class="layui-form-item">
<label class="layui-form-label">用户名</label>
<div class="layui-input-block">
<label>
<input type="text" name="username" lay-verify="title" autocomplete="off"
placeholder="请输入用户名"
class="layui-input">
</label>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">密码</label>
<div class="layui-input-block">
<label>
<input type="password" name="password" placeholder="请输入密码"
autocomplete="off"
class="layui-input">
</label>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="formDemo">立即提交</button>
<button class="layui-btn layui-btn-primary">注册</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
{#加载js资源#}
<script src={% static "jquery-3.6.0.min.js" %}></script>
<script src={% static "layui.js" %}></script>
<script src={% static "layui.all.js" %}></script>
<script src="{% static 'lay/modules/layer.js' %}"></script>
<script>
layui.use('layer', function () {
layer = layui.layer;
});
layui.use('form', function () {
form = layui.form;
});
{# 发送ajax请求#}
form.on('submit(formDemo)', function (data) {
{#/do_login/代表发送请求的链接,data.field是form表单中请求的所有参数,function (result)是回调函数#}
$.post("/do_login/", data.field, function (result) {
if (result.code == 0) {
layer.msg(result.message, {time: 3000}, function () {
window.location.href = "/basic/";
});
} else {
layer.msg(result.message, {time: 3000});
}
});
return false;
});
</script>
</body>
</html>
2、后端代码
(1)登录
from django.core.signing import BadSignature
from django.db import IntegrityError
from django.shortcuts import render
from rest_framework.decorators import api_view
from rest_framework.authtoken.models import Token
from django.contrib.auth import authenticate
from django.contrib.auth.models import User
from django.http import JsonResponse
@api_view(["POST", ])
def api_do_login(request):
username = request.POST.get("username")
print("username:" + str(username))
password = request.POST.get("password")
print("password:" + str(password))
uid = 0
token = ""
if username not in [None, ""]:
if password not in [None, ""]:
user = authenticate(username=username, password=password)
if user not in [None, ""]:
uid = user.id
token = Token.objects.filter(user=user).first().key
res = {"code": 0, "message": "登录成功", "uid": uid, "token": token}
else:
res = {"code": 10000, "message": "用户名或密码错误"}
else:
res = {"code": 10001, "message": "密码不能为空"}
else:
res = {"code": 10001, "message": "用户名不能为空"}
response = JsonResponse(res)
if res["code"] == 0: #如果登录成功,则种cookie,max_age是cookie超时时间
response.set_signed_cookie("uid", uid, salt="adbc", max_age=600)
response.set_signed_cookie("token", token, salt="adbc", max_age=600)
return response
(2)再次登录,如果token存在,且正确,直接显示首页
@api_view(["GET", ])
def api_basic(request):
try:
uid = request.get_signed_cookie("uid", salt="adbc")
token = request.get_signed_cookie("token", salt="adbc")
if uid not in ["", None]:
if token not in ["", None]:
key = Token.objects.filter(user_id=uid).first().key
print("key=" + key)
print("token=" + token)
if token == key:
res = render(request, "basic.html")
else:
res = render(request, "login.html")
else:
res = render(request, "login.html")
else:
res = render(request, "login.html")
except BadSignature: #加的盐校验不正确
res = render(request, "login.html")
except KeyError: #token错误
res = render(request, "login.html")
return res