Flask 继学习 之 py与js文件的关系和通信

py文件是如何和js文件互动的?

在Python和JavaScript之间实现互动通常需要使用一些特定的工具或技术。以下是一种常见的方法:

  1. 使用Web框架:可以使用Python的Web框架(如Django、Flask等)来创建一个Web应用程序。在这种情况下,你可以将Python代码和JavaScript代码嵌入到HTML文件中,并通过HTTP请求进行通信。

  2. 使用AJAX:AJAX(Asynchronous JavaScript and XML)是一种在不重新加载整个页面的情况下与服务器进行异步通信的技术。你可以使用JavaScript中的AJAX方法(如XMLHttpRequest或fetch)向服务器发送HTTP请求,并接收来自服务器的响应response服务器端可以使用Python来处理这些请求,并return返回相应的数据。

  3. 使用WebSocket:WebSocket是一种在客户端和服务器之间实现双向通信的协议。你可以使用JavaScript中的WebSocket API与服务器建立WebSocket连接,并通过该连接发送和接收数据。在服务器端,你可以使用Python的WebSocket库(如Tornado、Flask-SocketIO等)来处理WebSocket连接和消息。

  4. 使用RPC(远程过程调用):RPC是一种允许不同进程或计算机之间进行通信的技术。你可以使用Python中的RPC库(如Pyro4、xmlrpc等)来创建一个RPC服务器,并使用JavaScript中的RPC库(如JSON-RPC、gRPC-web等)来调用该服务器上的方法。

login.html

{% extends "common/layout_user.html" %}
{% block content %}
<div class="loginColumns animated fadeInDown"><div class="row"><div class="col-md-6 text-center"><h2 class="font-bold">{{ config.SEO_TITLE }}</h2><p><img src="{{ buildStaticUrl('/images/common/mini_qrcode.jpg') }}" width="300px"></p></div><div class="col-md-6"><div class="ibox-content"><div class="m-t login_wrap" ><div class="form-group text-center"><h2 class="font-bold">登录</h2></div><div class="form-group"><input type="text" name="login_name" class="form-control" placeholder="请输入登录用户名"></div><div class="form-group"><input type="password" name="login_pwd" class="form-control" placeholder="请输入登录密码"></div><button type="button" class="btn btn-primary block full-width m-b do-login">登录</button><h3>账号和密码请联系公司管理员</h3></div></div></div></div><hr><div class="row"><div class="col-md-6">{{ config.SEO_TITLE }} <a href="{{ buildUrl('/') }}" target="_blank"> 技术支持 </a></div><div class="col-md-6 text-right"><small>© 2024</small></div></div>
</div>{% endblock %}{% block js %}<script src="{{ buildStaticUrl('/js/user/login.js') }}"></script>
{% endblock %}

user.py
 

route_user = Blueprint('user_page', __name__)@route_user.route('/login', methods = ['GET', 'POST'])
# 这段代码是一个用户登录的处理函数
def login():if request.method =="GET":# 当请求方法为GET时,如果用户已经登录,则重定向到首页if g.current_user:return redirect( UrlManager.buildUrl("/index/"),)# 否则渲染登录页面return render_template("user/login.html")# 当请求方法为POST时,获取登录名和密码,并查询数据库中是否存在对应的用户信息。resp = {'code': 200, 'msg': '登录成功~~', 'data': {}}req = request.valueslogin_name = req['login_name'] if 'login_name' in req else ''login_pwd = req['login_pwd'] if 'login_pwd' in req else ''# 如果存在,则返回登录成功的消息,并设置一个名为AUTH_COOKIE_NAME的cookie,保存用户的认证信息和用户ID,有效期为120天if login_name is None or len( login_name ) < 1:resp['code'] = -1resp['msg'] = "请输入正确的登录用户名~~"return jsonify(resp)if login_pwd is None or len(login_name) < 1:resp['code'] = -1resp['msg'] = "请输入正确的密码~~"return jsonify(resp)user_info = User.query.filter_by( login_name = login_name ).first()if not user_info:resp['code'] = -1resp['msg'] = '请输入正确的登录用户名和密码-1~~'return jsonify(resp)if user_info.login_pwd != UserService.genePwd( login_pwd, user_info.login_salt ):resp['code'] = -2resp['msg'] = '请输入正确的登录用户名和密码-2~~'return jsonify(resp)if user_info.status !=1:resp['code'] = -3resp['msg'] = '账号已被禁用,请联系管理员处理~~'return jsonify(resp)# 设置相应# # make_response()函数的作用是创建一个包含指定内容的响应对象。它可以将字符串、字典、元组或者响应对象转换为一个响应对象。response = make_response(json.dumps({'code':200, 'msg':'登录成功~~'}))# # json.dumps()函数的作用是将Python对象转换为JSON格式的字符串。它可以将字典、列表等Python对象转换为JSON字符串,以便在网络传输或存储时使用。#  设置cookieresponse.set_cookie( app.config['AUTH_COOKIE_NAME'], '%s#%s' % (UserService.geneAuthCode(user_info), user_info.uid), 60 * 60 * 24 * 120)   # 保存120填# 最后返回一个包含登录成功消息的JSON响应。return response#
# set_cookie()函数用于设置响应对象的cookie。它接受多个参数,其中包括cookie的名称、值、过期时间等。
# 通过调用set_cookie()函数,可以将cookie添加到响应对象中,并在客户端保存。

login.js

;
var user_login_ops = {init:function(){this.eventBind();},eventBind:function(){$(".login_wrap .do-login").click( function(){var btn_target = $(this);if( btn_target.hasClass("disabled") ){common_ops.alert("正在处理!!请不要重复提交~~");return;}var login_name = $(".login_wrap input[name=login_name]").val();var login_pwd = $(".login_wrap input[name=login_pwd]").val();if( login_name == undefined || login_name.length < 1){common_ops.alert( "请输入正确的登录用户名~~" );return;}if( login_pwd == undefined || login_pwd.length < 1){common_ops.alert( "请输入正确的密码~~" );return;}btn_target.addClass("disabled");$.ajax({url:common_ops.buildUrl("/user/login"),type:'POST',data:{ 'login_name':login_name,'login_pwd':login_pwd },dataType:'json',success:function(res){btn_target.removeClass("disabled");var callback = null;if( res.code == 200 ){callback = function(){window.location.href = common_ops.buildUrl("/index");}}common_ops.alert( res.msg,callback );}});} );}
};$(document).ready( function(){user_login_ops.init();
} );

问题: 如果将服务器端的return response 改为return redirect('index.html'),则在实际网页登录框中按钮点下去后没反应,再点就会提示相应提示“正在处理!!请不要重复提交~~”

这是因为html的页面已经和js做好了功能绑定和关联,在js文件中定义了按钮的相关设置,因为在服务器端删除了要发给js的信号--response,所以js因为迟迟收不到服务器返回来的response,一致处于按钮disable停滞状态。

如此看来,html   js  以及 py 文件都是起着微妙微翘、相互关联、相互传导信息的作用的。

py 给js文件的reponse对象一般都是什么格式的?案例分析一下:

在Python中,将响应对象转换为JavaScript文件时,通常使用JSON格式。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写,并且在不同编程语言之间具有良好的兼容性。

以下是一个示例,展示了将Python中的响应对象转换为JSON格式的JavaScript文件:

import json# 假设response是一个包含数据的响应对象
response = {"status": 200,"message": "Success","data": {"name": "John","age": 25,"city": "New York"}
}# 将响应对象转换为JSON格式的字符串
json_response = json.dumps(response)# 将JSON字符串写入JavaScript文件
with open("response.js", "w") as file:file.write(f"var response = {json_response};")

在上述示例中,我们使用了Python内置的json模块将响应对象response转换为JSON格式的字符串json_response。然后,我们将该字符串写入名为response.js的JavaScript文件中,并将其赋值给JavaScript变量response

问题:json格式是什么样子的?

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于前后端数据传输和存储。它以键值对的形式组织数据,并使用大括号({})表示对象,方括号([])表示数组。

JSON对象由多个键值对组成,每个键值对之间使用逗号(,)分隔。键是一个字符串,值可以是字符串、数字、布尔值、对象、数组或null。键和值之间使用冒号(:)分隔。

以下是一个JSON对象的示例:

{"name": "John","age": 30,"isStudent": false,"address": {"street": "123 Main St","city": "New York"},"hobbies": ["reading", "traveling", "photography"]
}

在上面的示例中,有几个键值对:

  • “name”: “John” 表示名字是"John"
  • “age”: 30 表示年龄是30
  • “isStudent”: false 表示是否是学生为false
  • “address”: {…} 表示地址是一个嵌套的JSON对象
  • “hobbies”: […] 表示爱好是一个包含多个元素的数组

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

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

相关文章

C++第十弹---类与对象(七)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、再谈构造函数 1.1、构造函数体赋值 1.2、初始化列表 1.3、explicit关键字 2、static成员 2.1、概念 2.2、特性 2.3、面试题 总结 1、再…

USENIX Security 2023 Topics

32nd USENIX Security Symposium 2023: Anaheim, CA, USA 1. Breaking Wireless Protocols | 破解无线协议 2. Interpersonal Abuse | 人际滥用 3. Inferring User Details | 推断用户详情 4. Adversarial ML beyond ML | 超越机器学习的对抗性机器学习 5. Private Set Operat…

解决Linux报错JCE cannot authenticate the provider BC

JCE无法验证提供者BC 使用jdk17问题真多&#xff0c;windows和Linux是有一定的区别的&#xff0c;在windows中调第三方接口要用到AES加密&#xff0c;本地测试没报错&#xff0c;但部署到Linux后就报错了&#xff01; 解决办法看了半天都是针对jdk安装目录下的jre/lib/ext/ja…

Java中的Timer类以及自己实现一个MyTimer

Timer 类是 Java 提供的用于执行定时任务的工具类。它允许你安排任务在未来的某个时间点执行&#xff0c;也可以定期执行。下面是关于Timer类的详细介绍&#xff1a; 一、主要特点 任务调度&#xff1a;Timer 类允许你调度指定的任务在将来的某个时间执行&#xff0c;或者按照一…

制作nuget包并上传到nuget.org

下面是一个详细的步骤指南&#xff0c;用于创建一个简单的 C# NuGet 包并将其发布到 NuGet.org。我们将创建一个简单的数学库作为示例。 步骤 1: 创建一个新的类库项目 首先&#xff0c;我们需要创建一个新的类库项目。这可以通过 Visual Studio 或者 .NET CLI 完成。 使用 …

[linux][调度] 内核抢占入门 —— 线程调度次数与 CONFIG_PREEMPTION

在工作中&#xff0c;如果你正在做开发的工作&#xff0c;正在在写代码&#xff0c;这个时候测试同事在测试过程中测出了问题&#xff0c;需要你来定位解决&#xff0c;那么你就应该先暂停写代码的工作&#xff0c;转而来定位解决测试的问题&#xff1b;如果你正在定位测试的问…

mysql事务及存储引擎

目录 什么是事务 事务的ACIP特性 事务之间的影响 mysql隔离级别 事务隔离级别的作用范围 事务控制语句 mysql存储引擎 什么是事务 事务是一种机制、一个操作序列&#xff0c;包含了一组数据库操作命令&#xff0c;并且把所有的命令作为一个整体一起向系统提交或撤销操作…

AI预测福彩3D第15弹【2024年3月21日预测--第3套算法重新开始计算第4次测试】

今天咱们继续对第3套算法进行第4次测试&#xff0c;第3套算法加入了012路的权重。废话不多说了&#xff0c;直接上结果吧~ 最终&#xff0c;经过研判分析&#xff0c;2024年3月21日福彩3D的七码预测结果如下&#xff1a; 百位&#xff1a;4 5 7 1 0 6 2 十位&#xff1a;3 1 5 …

QML 布局管理器之GridLayout 项目demo

一.气体控制效果图 二.界面布局代码实现 //DottedLline.qml 虚线绘制 import QtQuick 2.12 import QtQuick.Shapes 1.12Shape {id:canvaswidth: parent.widthheight: parent.heightShapePath{strokeStyle: ShapePath.DashLinestartX: 8startY: 10dashPattern: [1, 3]PathLine{…

在Linux搭建Emlog博客结合内网穿透实现公网访问本地个人网站

文章目录 前言1. 网站搭建1.1 Emolog网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 3. 公网访问测试总结 前言 博客作为使…

Flink入门知识点汇总(二)

具体内容请看b站尚硅谷课程&#xff01; 32_Flink运行时架构_提交流程_Yarn应用模式_哔哩哔哩_bilibili 窗口 Flink的窗口并不是静态准备好的&#xff0c;而是动态创建的。数据流到达时不会准备24个或者其他完整数量的桶&#xff0c;而是当下桶接满了&#xff0c;才临时又拿新…

001-Windows下PyTorch极简开发环境配置(上)

本节介绍Windows系统下配置一套基于Pytorch框架的极简深度学习开发环境。 目录 0.1 缘起 0.1 缘起 其实大概在2016就开始接触深度学习的相关知识&#xff0c;但一直到2018年左右&#xff0c;还停留在门外汉的状态太&#xff0c;原因很简单&#xff0c;感觉学习的门槛过高。…

web前端之小功能聚集、简单交互效果

MENU 纯CSS实现可编辑文字霓虹灯闪烁效果css之实现流水文字、闪烁、荧光、炫酷web前端之文本擦除效果与下划线结合css之下划线动画 纯CSS实现可编辑文字霓虹灯闪烁效果 效果图 html <h1 contenteditable"true">Hello World</h1>style * {margin: 0;pa…

C/C++在线参考手册的使用技巧

cppreference.com是一个在线的C/C参考手册&#xff0c;是C/C学习者最常用的网站。 网址&#xff1a;cppreference.com 1&#xff0e;搜索 不知道为什么这个网站总是不能正常搜索&#xff0c;实在是太不方便了。 有两个退而求其次的方法&#xff1a; (1)通过搜索引擎指定域名…

无服务器推理在大语言模型中的未来

服务器无服务器推理的未来&#xff1a;大型语言模型 摘要 随着大型语言模型(LLM)如GPT-4和PaLM的进步&#xff0c;自然语言任务的能力得到了显著提升。LLM被广泛应用于聊天机器人、搜索引擎和编程助手等场景。然而&#xff0c;由于LLM对GPU和内存的巨大需求&#xff0c;其在规…

C++常用的区块代码

很多人在刷题时都遇到过不会的情况 这篇文章希望可以帮到你&#xff01; 1.输入n将这个数倒着输出来&#xff1a; while(n!0){tn%10;printf("%d",t);nn/10; }只要会这条代码&#xff0c;很多题目都可以直接秒杀。 如&#xff1a; 输入一个整数n,算出它各个位数的乘积…

【RPC研究】socket 函数调用

突然想深入学习一下RPC调用&#xff0c;研究一下发现这个东西相关联的东西还是比较多的&#xff0c;而且也算补齐一下别的知识。 接下来会写一下相关的知识&#xff0c;但没有什么参考资料基本都是博客看的&#xff0c;或者自己本科学的知识融合&#xff0c;并没有翻啥书&…

[Repo Git] manifests的写法

​manifests​​是个啥 在Repo​中manifests​描述了Repo客户端的结构&#xff0c;也就是可以从manifests​中知道各个模块的代码应该从代码管理仓库当中哪个位置去获取。 ​manifests​的基本结构是一个Git存储库&#xff0c;在顶层目录中持有一个default.xml​文件。 由于m…

程序员想要搞钱不迷茫,这篇文章你可得码好啦!!!

年已经过完了&#xff0c;现在大家都已经返工返校了吧&#xff01;咱又要投入到新一年的战斗了&#xff01;春色恼人不等闲&#xff0c;相信咱都有一个实实在在的愿望和期许&#xff1a;身体健康&#xff0c;财源广进&#xff01;新的一年我们还得继续努力&#xff0c;多多搞钱…

利用IP地址查防止电子招投标串标行为

随着信息技术的快速发展&#xff0c;电子招投标已成为政府和企业采购的主要方式。然而&#xff0c;电子招投标中的串标问题也愈发突出&#xff0c;给公平竞争和资源分配带来了隐患。为了防止串标行为&#xff0c;利用IP地址查已成为一种有效手段。 IP地址查询&#xff1a;IP数…