Django实现登录注册

Django实现登录注册

目录

  • Django实现登录注册
    • 配置路由
    • 首页
    • 注册
      • 前端:
      • 后端:
    • 登录
      • 前端:
      • 后端:
      • 验证码部分逻辑

配置路由

首先分发路由[User,Blog,Article]

from django.contrib import admin
from django.urls import path
from Blog import views
from django.conf.urls import includeurlpatterns = [path('admin/', admin.site.urls),path('', views.home, name='home'),path('User/', include('User.urls', namespace='User')),path('Blog/', include('Blog.urls', namespace='Blog')),path('Article/', include('Article.urls', namespace='Article')),
]

配置路由

urlpatterns = [path('register/', views.register, name='register'),path('login/', views.login, name='login'),# 返回图片路由path('get_verify_img/', views.get_verify_img, name='get_verify_img'),path('blog/', views.blog, name='blog'),
]

首页

def home(request):if request.session.get('user'):online_user = request.session.get('user')else:online_user = '登录'return render(request, 'home.html', locals())
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><!--    引入jQuery--><script src="{% static 'js/jquery.js' %}"></script><!--    引入Bootstrap的CSS文件--><link href="{% static 'css/bootstrap.min.css' %}" rel="stylesheet"><!--    引入Bootstrap的JavaScript文件--><script src="{% static 'js/bootstrap.js' %}"></script><!-- 引入 layui.css --><link rel="stylesheet" href="{% static 'layui/css/layui.css' %}"><!-- 引入 layui.js --><script src="{% static 'layui/layui.js' %}"></script>
</head>
<body>

注册

前端:

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><!--    引入jQuery--><script src="{% static 'js/jquery.js' %}"></script><!--    引入Bootstrap的CSS文件--><link href="{% static 'css/bootstrap.min.css' %}" rel="stylesheet"><!--    引入Bootstrap的JavaScript文件--><script src="{% static 'js/bootstrap.js' %}"></script><!-- 引入 layui.css --><link rel="stylesheet" href="{% static 'layui/css/layui.css' %}"><!-- 引入 layui.js --><script src="{% static 'layui/layui.js' %}"></script><style>.content {position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);}</style></head>
<body>
<div class="content"><!-- 注册表单 --><form class="layui-form" method="post" onsubmit="return false;" id="lay_register">{% csrf_token %}<div class="demo-reg-container"><div class="layui-form-item"><div class="layui-row"><div class="layui-col-xs7"><div class="layui-input-wrap"><div class="layui-input-prefix"><i class="layui-icon layui-icon-cellphone"></i></div><input type="text" name="phone" value=""lay-verify="required|phone" placeholder="手机号"lay-reqtext="请填写手机号" autocomplete="off"class="layui-input" id="reg-cellphone"></div></div></div></div><div class="layui-form-item"><div class="layui-input-wrap"><div class="layui-input-prefix"><i class="layui-icon layui-icon-username"></i></div><input type="text" name="username" value="" lay-verify="required"placeholder="用户名"autocomplete="off"class="layui-input" lay-affix="clear"></div></div><div class="layui-form-item"><div class="layui-input-wrap"><div class="layui-input-prefix"><i class="layui-icon layui-icon-password"></i></div><input type="password" name="password" value=""lay-verify="required" placeholder="密码"autocomplete="off" class="layui-input" id="reg-password"lay-affix="eye"></div></div><div class="layui-form-item"><div class="layui-input-wrap"><div class="layui-input-prefix"><i class="layui-icon layui-icon-password"></i></div><input type="password" name="confirmPassword" value=""lay-verify="required|confirmPassword"placeholder="确认密码" autocomplete="off" class="layui-input"lay-affix="eye"></div></div><div class="layui-form-item"><button class="layui-btn layui-btn-fluid" lay-submitlay-filter="demo-reg" id="send_register">注册</button></div><div class="layui-form-item demo-reg-other"><a href="{% url 'Blog:login' %}">登录已有帐号</a></div></div></form>
</div>
<script>layui.use(function () {const $ = layui.$;const form = layui.form;const layer = layui.layer;const util = layui.util;util.on('lay-on', {msg: function () {{#layer.msg('登录成功');#}}})// 自定义验证规则form.verify({// 确认密码confirmPassword: function (value, item) {const passwordValue = $('#reg-password').val();if (value !== passwordValue) {return '两次密码输入不一致';}}});});{#注册事件#}const registerButton = document.getElementById('send_register');registerButton.addEventListener('click', function () {// 获取表单元素const form = document.getElementById('lay_register');// 创建 FormData 对象const formData = new FormData(form);formData.append('index', 'register_modal')$.ajax({url: '',type: 'POST',processData: false, // 设为false防止JQuery自动将formData转成字符串contentType: false, // 防止JQuery自动添加'Content-Type'请求头{#data: JSON.stringify(newData),#}data: formData,success: function (data) {if (data.err) {layui.layer.msg(data.err)}if (data.info) {layui.layer.msg('注册成功')$(document.getElementById('register')).modal('hide')window.open(data.info)}}})})
</script>
</body>
</html>

后端:

def register(request):print('注册页面')if request.method == 'POST' and request.is_ajax:data = request.POSTusername = data['username']password = data['password']phone = data['phone']if models.Userinfo.objects.filter(username=username):err_info = {'err': '用户名已存在'}return JsonResponse(err_info)else:models.Userinfo.objects._create_user(username=username, password=password, phone=phone, email='')back_info = {'info': 'http://127.0.0.1:8000/'}return JsonResponse(back_info)return render(request, 'register.html', locals())

登录

前端:

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><!--    引入jQuery--><script src="{% static 'js/jquery.js' %}"></script><!--    引入Bootstrap的CSS文件--><link href="{% static 'css/bootstrap.min.css' %}" rel="stylesheet"><!--    引入Bootstrap的JavaScript文件--><script src="{% static 'js/bootstrap.js' %}"></script><!-- 引入 layui.css --><link rel="stylesheet" href="{% static 'layui/css/layui.css' %}"><!-- 引入 layui.js --><script src="{% static 'layui/layui.js' %}"></script><style>.content {position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);}</style></head>
<body>
<div class="content"><form class="layui-form" method="post" onsubmit="return false;" id="lay_login">{% csrf_token %}<div class="demo-reg-container"><div class="layui-form-item"><div class="layui-input-wrap"><div class="layui-input-prefix"><i class="layui-icon layui-icon-username"></i></div><input type="text" name="username" value="" lay-verify="required"placeholder="用户名"autocomplete="off"class="layui-input" lay-affix="clear"></div></div><div class="layui-form-item"><div class="layui-input-wrap"><div class="layui-input-prefix"><i class="layui-icon layui-icon-password"></i></div><input type="password" name="password" value=""lay-verify="required" placeholder="密码"autocomplete="off" class="layui-input" id="reg-password"lay-affix="eye"></div></div><div class="layui-col-xs7"><div class="layui-input-wrap"><div class="layui-input-prefix"><i class="layui-icon layui-icon-vercode"></i></div><input type="text" name="captcha" value="" lay-verify="required"placeholder="验证码" lay-reqtext="请填写验证码"autocomplete="off" class="layui-input" lay-affix="clear"></div></div><div class="layui-col-xs5"><div style="margin-left: 10px;"><img src="{% url 'Blog:get_verify_img' %}" width="100%"height="37px" id="img_verify" alt=""></div></div><div class="layui-form-item"><button class="layui-btn layui-btn-fluid" lay-submitlay-filter="demo-reg" id="send_login" lay-on="msg">登录</button></div><div class="layui-form-item demo-reg-other"><a href="#">没有账号?立即注册</a></div></div></form>
</div>
<script>{#刷新验证码#}const verify = document.getElementById('img_verify')verify.addEventListener('click', function () {// 获取原始的 src 属性值const verify_src = verify.src;// 检查原始 src 是否已经包含时间戳if (verify_src.includes('?')) {// 如果已经包含时间戳,只替换最后一个时间戳verify.src = verify_src.replace(/\?.*$/, '') + '?' + new Date().getTime();} else {// 如果原始 src 没有时间戳,直接添加时间戳verify.src = verify_src + '?' + new Date().getTime();}}){#登录事件#}const loginButton = document.getElementById('send_login');loginButton.addEventListener('click', function () {// 获取表单元素const form = document.getElementById('lay_login');// 创建 FormData 对象const formData = new FormData(form);formData.append('index', 'login_modal')$.ajax({url: '',type: 'POST',processData: false, // 设为false防止JQuery自动将formData转成字符串contentType: false, // 防止JQuery自动添加'Content-Type'请求头data: formData,success: function (data) {if (data.err) {layui.layer.msg(data.err)}if (data.url)window.open(data.url)},error: function (xhr, status, error) {console.log('error')}})})
</script>
</body>
</html>

后端:

def login(request):if request.method == 'POST' and request.is_ajax:data = request.POSTuser = models.Userinfo.objects.filter(username=data['username']).first()if not user:err_info = JsonResponse({'err': '用户不存在'})return err_infoif not check_password(data['password'], user.password):print('密码错误')err_info = JsonResponse({'err': '密码错误'})return err_infoelse:request.session['user'] = data['username']return JsonResponse({'url': 'http://127.0.0.1:8000/'})return render(request, 'login.html', locals())

验证码部分逻辑

def get_verify_img(request):data, words = verify()print(words)return HttpResponse(data)def random_rgb():return random.randint(0, 256), random.randint(0, 256), random.randint(0, 256)def random_word():# 0-9数字random_num = random.randint(0, 9)# a-zrandom_lower = chr(random.randint(97, 122))# A-Zrandom_upper = chr(random.randint(65, 90))word = random.choice([random_upper, random_lower, str(random_num)])return word

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/751843.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习——yolov5的txt和xml互转

在学习工作的过程中&#xff0c;有时会需要自己新建数据集&#xff0c;向训练数据中添加新的数据&#xff0c;存在已有模型对新数据进行检测&#xff0c;得到yolov5对应的txt文件&#xff0c;之后转成xml&#xff0c;使用标注工具对数据进行校正。后续将xml转成yolov5训练使用的…

误删电脑C盘要重装系统吗 误删电脑C盘文件怎么恢复 误删c盘系统文件怎么修复 不小心删除C盘的东西恢复

C盘通常是操作系统(如Windows)的默认安装目录。它包含了操作系统的核心文件、驱动程序及系统所需的各种支持文件。这些文件对于计算机的正常运行至关重要。如果我们不小心将C盘的重要文件删除&#xff0c;会导致应用无法打开。本篇文章&#xff0c;我们将学习误删电脑C盘要重装…

面试算法-39-删除链表的倒数第 N 个结点

题目 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 解 class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {L…

基于支持向量机SVM的沉降预测,SVM详细原理,Libsvm详解

目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 Libsvm工具箱详解 简介 参数说明 易错及常见问题 完整代码和数据下载链接:基于支持向量机SVM的沉降预测资源-CSDN文库 https://download.csdn.net/download/abc991835105/88947544 SVM应用实例,基于支持向量机SVM的沉降预测…

vim,gcc,gdb与Makefile的使用

一、Linux编辑器-vim使用 1.vim的基本概念 vim的三种模式(其实有好多模式&#xff0c;目前掌握这3种即可),分别是命令模式&#xff08;command mode&#xff09;、插入模式&#xff08;Insert mode&#xff09;和底行模式&#xff08;last line mode&#xff09;&#xff0c;…

指挥航空公司架次与延误率占比

打开前端Vue项目kongguan_web&#xff0c;创建前端 src/components/Delay.vue 页面&#xff0c;并添加柱状图与折线图叠加&#xff0c;设置双Y轴。 页面div设计&#xff0c;代码如下&#xff1a; <template><div><div class"home"><div id&qu…

AJAX-XMLHttpRequest

XMLHttpRequest 定义&#xff1a; XMLHttpRequest对象用于与服务器交互。通过XMLHttpRequest可以在不断刷新页面的情况下请求特定URL&#xff0c;获取数据。这允许网页在不影响用户操作的情况下&#xff0c;更新页面的局部内容。 关系&#xff1a; axios内部采用XMLHttpReques…

关于volatile与指令重排序的探讨

写在开头 在之前的学习我们了解到&#xff0c;为了充分利用缓存&#xff0c;提高程序的执行速度&#xff0c;编译器在底层执行的时候&#xff0c;会进行指令重排序的优化操作&#xff0c;但这种优化&#xff0c;在有些时候会带来 有序性 的问题。 那何为有序性呢&#xff1f;…

乘积尾零啊填空题)

乘积尾零 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 如下的 10 行数据&#xff0c;每行有 10 个整数&#xff0c;请你求出它们的乘积的末尾有多少个零? 的乘积的末尾有多少个零? 5650 4542 3554 473 946 4…

Halcon OCR文字识别

1、OCR文字识别 OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;工具对图像中的文字进行识别和分析。 FontFile : Universal_0-9_NoRej dev_update_window (off) read_image (bottle, bottle2) get_image_size (bottle, Width, Height) dev…

JavaScript 中实现请求并发控制

文章目录 浏览器并发请求限制数&#xff08;图&#xff09;实现代码三方插件 假设有 30 个待办任务要执行&#xff0c;而我们希望限制同时执行的任务个数&#xff0c;即最多只有 3 个任务能同时执行。当正在执行任务列表 中的任何 1 个任务完成后&#xff0c;程序会自动从 待办…

(赋值)运算符号重载

概念以及语法 运算符重载&#xff1a;operator 函数原型&#xff1a;返回值类型 operator 操作符&#xff08;参数列表&#xff09; //操作符有几个操作数就有几个参数 //操作符只包含C/C已经有的&#xff0c;就是说我们不能创建新的操作符&#xff0c;只能重载已有的运算符 …

VMware安装Ubuntu 18.04.2

下载Ubuntu映像 下载地址&#xff1a;http://old-releases.ubuntu.com/releases/18.04/ 下载名称&#xff1a; ubuntu-18.04.2-desktop-amd64.iso 清华镜像站&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/ 阿里云镜像站&#xff1a;https://mirrors.ali…

python 统计中国观鸟记录中心官网已观测的鸟类种类

python 统计中国观鸟记录中心官网已观测的鸟类种类 中国观鸟记录中心网站&#xff1a;https://www.birdreport.cn/ 先下载官网 Excel 文件 文件放置目录如下&#xff1a; home dataset xxx.xlsxxxx.xlsxxxx.xlsx Excelgrep.py &#xff08;进行文件内容提取的程序&#xff…

关于Ubuntu虚拟机突然上不了网的问题

今天刚重新把Ubuntu虚拟机下回来准备大干一场&#xff0c;结果去吃饭回来虚拟机就上不去网了&#xff0c;具体体现为右上角没有网络的图标&#xff0c;下图是有网络的情况&#xff0c;废话不多说&#xff0c;直接给出解决方案&#xff1a;博客在此 我就是运行了这三行代码就成功…

如何杀死服务器出现的僵尸进程

今天在服务器上进行深度学习训练的时候&#xff0c;发现已经结束程序代码&#xff0c;但是GPU还是显示显存在运行。 为了解决这些问题&#xff0c;网上查找了大量的资料&#xff0c;发现是因为僵尸进程的原因&#xff0c;因此记录相关的解决步骤&#xff0c;方便自己和大家。 …

Error: Unable to find git in your PATH. flutter dart

我的是重装git &#xff0c;参考 flutter Unable to find git in your PATH - ZJH_BLOGS - 博客园 (cnblogs.com)

一周速递|全球车联网产业动态(2024年3月17日)

政策法规 1、3月16日&#xff0c;在中国电动汽车百人会论坛&#xff08;2024&#xff09;国际论坛上&#xff0c;国家发改委、工信部、科技部、商务部、住建部等国家部委表示将采取更多务实举措&#xff0c;支持新能源汽车行业企业发展&#xff0c;加大对全固态电池、智能网联…

Elasticsearch(12) match_bool_prefix的使用

elasticsearch version&#xff1a; 7.10.1 match_bool_prefix 是 Elasticsearch 中用于执行布尔前缀查询的一种查询类型。这种查询类型特别适用于当你想要匹配一个字段的前缀&#xff0c;并且希望这个字段中的词语是按照一定顺序出现的场景。 match_bool_prefix 语法 { &q…

设计模式 — — 单例模式

一、是什么 单例模式只会在全局作用域下创建一次实例对象&#xff0c;让所有需要调用的地方都共享这一单例对象 二、实现 // 单例构造函数 function CreateSingleton (name) {this.name name;this.getName(); };// 获取实例的名字 CreateSingleton.prototype.getName func…