Json 在对 Python 的 PUT 请求中 Flask 应用解码失败
Json in PUT request to Python Flask app fails to decode
我正在构建一个 SQLite3 数据库来存储任何给定天文图像中恒星的孔径通量测量值。我有一个文件 (star_database.py) 包含一个 Flask 应用程序 运行 两条处理从数据库中选择和插入数据库的路由。有一个单独的脚本 (aperture_photometry.py) 将在传入图像需要光度处理时调用这些路由。我的问题的症结在于将数据插入 SQLite 数据库的函数与负责将数据传递到 Flask 应用程序的孔径测光脚本之间的交互。以下是相关函数:
# Function in aperture_photometry.py that turns Star object data into a dictionary
# and passes it to the Flask app
from astropy.io import fits
import requests
import json
def measure_photometry(image, bandpass):
df = fits.getdata(image)
hf = fits.getheader(image, ext=1)
date_obs = hf['DATE-OBS']
ra, dec = get_center_coords(hf)
response = requests.get(f'http://127.0.0.1:5000/select/{ra}/{dec}/').content
star_json = json.loads(response)
if star_json is not None:
stars = json_to_stars(star_json)
get_raw_flux(df, df*0.01, hf, stars) # Error array will be changed
star_json = []
# Critical section
for star in stars:
star_json.append({"star_id":star.star_id, "source_id":star.source_id, "flux":star.flux, "flux_err":star.flux_err})
response = requests.put('http://127.0.0.1:5000/insert/', data={'stars':star_json, 'bandpass':bandpass, 'dateobs':date_obs})
print(response.content)
else:
print("ERROR: Could not get star objects from database.")
# Function in star_database.py that handles incoming flux measurements from the
# aperture photometry script, and then inserts data into the SQLite database
from flask import Flask, request
@app.route('/insert/', methods=['PUT'])
def insert_flux_rows():
conn = create_connection(database)
if conn is not None:
c = conn.cursor()
body = request.get_json(force=True)
print(body)
# More comes after this, but it is not relevant to the question
在 运行 Flask 应用程序和调用 aperture_photometry.py 之后,PUT 请求 response.content 行打印 400 Bad Request
错误消息 Failed to decode JSON object: Expecting value: line 1 column 1 (char 0)
。我认为这个问题要么出在我尝试格式化星形对象数据的方式,因为它被传递到 measure_photometry 中的 PUT 请求,或者如果没有,那么做 body = request.get_json(force=True)
有问题。还值得一提的是 insert_flux_rows 中的语句 print(body)
不会将任何内容打印到标准输出。出于所有意图和目的,这两个脚本必须保持独立,即我不能将它们组合起来并删除请求依赖性。
非常感谢您对此提供帮助,因为我一整天都在尝试修复它。
根据 this question 的最佳答案,您在 measure_photometry
函数中的 data
变量似乎无法正确转换为 json.
您应该尝试对其进行测试(也许 运行 一个 json.dumps
就可以了)以查看是否提供了更详细的错误消息。还有 jsonschema
包。
我正在构建一个 SQLite3 数据库来存储任何给定天文图像中恒星的孔径通量测量值。我有一个文件 (star_database.py) 包含一个 Flask 应用程序 运行 两条处理从数据库中选择和插入数据库的路由。有一个单独的脚本 (aperture_photometry.py) 将在传入图像需要光度处理时调用这些路由。我的问题的症结在于将数据插入 SQLite 数据库的函数与负责将数据传递到 Flask 应用程序的孔径测光脚本之间的交互。以下是相关函数:
# Function in aperture_photometry.py that turns Star object data into a dictionary
# and passes it to the Flask app
from astropy.io import fits
import requests
import json
def measure_photometry(image, bandpass):
df = fits.getdata(image)
hf = fits.getheader(image, ext=1)
date_obs = hf['DATE-OBS']
ra, dec = get_center_coords(hf)
response = requests.get(f'http://127.0.0.1:5000/select/{ra}/{dec}/').content
star_json = json.loads(response)
if star_json is not None:
stars = json_to_stars(star_json)
get_raw_flux(df, df*0.01, hf, stars) # Error array will be changed
star_json = []
# Critical section
for star in stars:
star_json.append({"star_id":star.star_id, "source_id":star.source_id, "flux":star.flux, "flux_err":star.flux_err})
response = requests.put('http://127.0.0.1:5000/insert/', data={'stars':star_json, 'bandpass':bandpass, 'dateobs':date_obs})
print(response.content)
else:
print("ERROR: Could not get star objects from database.")
# Function in star_database.py that handles incoming flux measurements from the
# aperture photometry script, and then inserts data into the SQLite database
from flask import Flask, request
@app.route('/insert/', methods=['PUT'])
def insert_flux_rows():
conn = create_connection(database)
if conn is not None:
c = conn.cursor()
body = request.get_json(force=True)
print(body)
# More comes after this, but it is not relevant to the question
在 运行 Flask 应用程序和调用 aperture_photometry.py 之后,PUT 请求 response.content 行打印 400 Bad Request
错误消息 Failed to decode JSON object: Expecting value: line 1 column 1 (char 0)
。我认为这个问题要么出在我尝试格式化星形对象数据的方式,因为它被传递到 measure_photometry 中的 PUT 请求,或者如果没有,那么做 body = request.get_json(force=True)
有问题。还值得一提的是 insert_flux_rows 中的语句 print(body)
不会将任何内容打印到标准输出。出于所有意图和目的,这两个脚本必须保持独立,即我不能将它们组合起来并删除请求依赖性。
非常感谢您对此提供帮助,因为我一整天都在尝试修复它。
根据 this question 的最佳答案,您在 measure_photometry
函数中的 data
变量似乎无法正确转换为 json.
您应该尝试对其进行测试(也许 运行 一个 json.dumps
就可以了)以查看是否提供了更详细的错误消息。还有 jsonschema
包。