- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在开发一个 Flask 服务器,以便通过网络在某些后端 Python 功能和 Javascript 客户端之间进行通信。我正在尝试利用 Flask 的 session
变量在用户与应用程序交互的过程中存储用户特定的数据。我已经删除了下面大部分特定于应用程序的代码,但我遇到的核心问题仍然存在。
这是我的(简化的)Flask 应用程序的代码:
import json
import os
from flask import Flask, jsonify, request, session
app = Flask(__name__)
app.secret_key = 'my_secret_key'
@app.route('/', methods=['GET'])
def run():
session['hello'] = 'world'
return jsonify(session['hello'])
@app.route('/update', methods=['POST'])
def update():
return jsonify(session['hello'])
if __name__ == '__main__':
app.run(host='0.0.0.0')
利用 Postman,我可以向我的服务器发出 GET 请求并接收 “world”
的预期输出。然后我可以使用任意主体发出 POST 请求并接收相同的 "world"
预期输出(再次使用 Postman)。
当使用 Chrome 时,我可以访问我的服务器 IP 并在页面上看到预期的输出 "world"
。我还可以使用 Javascript(在 Chrome 的控制台中)手动发出 GET 请求,并收到与预期相同的响应。但是,当我尝试使用 Javascript 向服务器发送 POST 请求时出现了问题;服务器在尝试发出此请求时显示 KeyError: 'hello'
。
这是我用来发出 POST 请求的 Javascript:
var url = 'http://my_server_ip/update';
fetch(url, {
method: 'POST',
body: JSON.stringify('arbitrary_string'),
headers: new Headers({
'Content-Type': 'application/json'
})
})
.then(response => response.json())
.then((data) => {
console.log(data);
})
这里出了什么问题?为什么我可以使用 Postman 发出 GET/POST 请求,但使用 Javascript 发出相同的请求时会出错?
最佳答案
caveats fetch
文档部分说:
By default, fetch won't send or receive any cookies from the server, resulting in unauthenticated requests if the site relies on maintaining a user session.
推荐使用AJAX与 Flask View 交换信息。
同时,在 Flask 应用程序的代码中,session
对象是一个字典。现在,如果您使用键 session['hello']
访问字典,并且如果该键不存在,则会引发 Keyerror
。要解决此错误,您可以对字典使用 get()
方法。
发生的事情是:fetch
请求在 Flask session 中找不到 hello
键(或从 Flask View 中获取 session 值)。
user = session.get('hello')
return jsonify(session_info=user)
但这仍然会为 session { session_info: null }
提供一个 null
值。为什么?
当您向 Flask 服务器发送 GET/POST 请求时, session 会在 Flask 中初始化和查询。但是,当您发送 Javascript fetch
POST 请求时,您必须首先从 Flask 获取 session 值,然后将其作为 POST 请求发送到您的 Flask View ,该 View 返回
session 信息。
在您的代码中,当从 fetch
触发 POST 请求时,当我将有效负载数据发送到 Flask 时,它被正确接收并且您使用 request.get_json()< 进行检查
在 Flask View 中:
@app.route('/update', methods=['POST'])
def update():
user = session.get('hello')
payload = request.get_json()
return jsonify(session_info=user, payload=payload)
这将返回 { payload: 'arbitrary_string', session_info: null }
。这也说明fetch
没有收到session信息,因为我们没有先调用GET从Flask获取session信息。
记住:Flask session 存在于 Flask 服务器上。要通过 Javascript 发送/接收信息,您必须单独调用,除非有存储 session cookie 的规定。
const fetch = require('node-fetch');
var url_get = 'http://my_server_ip';
var url_post = 'http://my_server_ip/update';
fetch(url_get, {
method:'GET'
}).then((response)=>response.json()).then((data) =>fetch(url_post, {
method: 'POST',
body: JSON.stringify(data),
dataType:'json',
headers: {
'Content-Type': 'application/json'
}
})
.then(response => response.json())
.then((postdata) => {
console.log(postdata);
}));
Flask View 会略有变化:
@app.route('/', methods=['GET'])
def set_session():
session['hello'] = 'world'
return jsonify(session['hello'])
@app.route('/update', methods=['POST'])
def update():
payload = request.get_json()
return jsonify(session_info=payload)
当您现在触发 Javacript 请求时,输出将是:{ session_info: 'world' }
关于javascript - Flask session 不持久( postman 工作,Javascript 不),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49712385/
我是Hibernate的新手。当我保存特定实体时,它将从现有实体中重写数据。 我将ID用作自动生成,如下所示: @Id @GeneratedValue(strategy=GenerationType.
我正在尝试以连续模式使用CouchDB更改通知API,所以我想发送此消息 _changes?feed = continuous?include_docs = true作为GET请求到达我的CouchD
我有 XMPP 服务器(openfire)和一堆客户端(spark),分为几个组(部门)。我正在寻找能够将它们留在 session 室中的能力。我的意思是 Skype 具有的类似功能;当用户关闭带有群
我发布这个问题是为了看看我是否正确理解 Azure Functions 中的并行性,特别是 Durable Functions。 最近使用 az cli 在 Azure Functions 中添加了设
我在 Dev Env 上有一个 AKS 集群,上面运行着一些容器。我还启用了 Azure Log Analytics。但我可以看到正在运行的当前容器的日志,而不是已被终止或停止的旧容器的日志。 我想知
在 Akka 中,当一个 actor 在处理消息时死亡(在 onReceive(...) { ... } 内),该消息就会丢失。有没有办法保证无损?有一种配置 Akka 在将消息发送到 onRecei
我试图让 selectOneMany 取得有限的成功。 我有以下数据库模型 User email Text verkey Text Maybe verified Bool password T
我需要使用持久性(Yesod)从键列表中获取实体列表 假设我有一个 Model 及其相应的 ModelId。我身边有: keys :: [ModelId] 我需要得到 models :: [Model
我有一个使用 GWT、请求工厂和地点/Activity 构建的网络应用程序。我很好奇我使用的历史 token 是否持久。该任务基本上就是让 URL 定义我的网络应用程序的确切位置(读作“文件/文件夹结
我正在寻找一种 jQuery 方法来在刷新页面时使页面元素持久保留在用户屏幕上。当我刷新页面并且丢失 jQuery 页面中的内容时,它会发生变化。 我需要页面持久。如何刷新页面并保持元素不刷新(持久)
当我尝试使用 gcc 编译带有 -fopenmp 标志的 C 代码时,我已经持续收到此错误超过 6 小时了。 错误:控制谓词无效 for ( int i = 0; i #include #ifde
我有带有验证注释的实体,例如@NotNull。我不知道如何防止容器管理的事务在批量持久操作中出现 ConstraintViolationException 的情况下回滚,例如: public void
这是我的代码: http://jsfiddle.net/KCb5z/8/embedded/result/ http://jsfiddle.net/KCb5z/8/ $(function () {
我正在与服务器通信,理想情况下,我希望输入流和输出流始终处于运行状态。我收到未经请求的响应,因此我必须始终准备好接收输入流上的数据。 在我进一步深入之前,我应该说我建立的任何连接都必须能够支持 SSL
我正在寻找一种正确扩展 Azure Functions 的方法,但遇到了问题。 我有一组 IoT 设备,通过 HTTP 向 Azure 发送数据(为此,有一组自动扩展的 Azure Functions
1.临时态(瞬时态) 不存在于session中,也不存在于数据库中的数据,被称为临时态。 比如:刚刚使用new关键字创建出的对象。 2.持久态 存在于session中,事务还未提交,提交之后
我在 Kohana v2 中使用数据库 session 驱动程序。为了使 session 持久化,Kohana 创建了一个 token cookie。这个 cookie 使用了我想的 cookie 配
有谁知道是否有办法使用 PyWinrm 打开一个持久的 PowerShell session ,该 session 保持状态并且可以多次调用?我正在尝试执行以下操作: #!/bin/python im
在运行的Elasticsearch集群中,配置文件中的index.number_of_replicas设置为1。 我可以通过运行以下命令在运行的集群上将其更新为2 # curl -XPUT "http
我在“这么长的帖子必须意味着大量的代码和配置”部分下一对一地使用指南代码。 http://blog.springsource.com/2006/08/07/using-jpa-in-spring-wi
我是一名优秀的程序员,十分优秀!