You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向Hasura上的Flask RESTful API发POST请求被识别为GET的问题求助

看起来你遇到的问题主要来自几个关键细节,我帮你逐一排查并修正:

1. 最核心的原因:HTTP请求被重定向为GET(Hasura强制HTTPS)

Hasura集群默认启用HTTPS,当你用http://app.catercorner16.hasura-app.io/create-row-in-gs发送POST请求时,服务器会返回301重定向到HTTPS版本。而requests库在处理POST重定向时,会自动将请求方法改为GET,这就导致你的请求最终以GET方式到达server.py,触发了return make_response('failure')分支。

解决办法:把test.py里的api_url改成HTTPS:

api_url = 'https://app.catercorner16.hasura-app.io/create-row-in-gs'

2. 请求数据格式不匹配

你的test.py用data=create_row_data发送数据,这会生成application/x-www-form-urlencoded类型的表单请求,但server.py里用request.json来获取数据——这个属性只有当请求的Content-Type是application/json时才会解析JSON数据,否则request.json会是None,访问request.json['id']会直接抛出KeyError,导致500错误。

解决办法:在test.py里改用json=create_row_data参数发送请求,这样requests会自动设置Content-Type: application/json:

r = requests.post(url=api_url, json=create_row_data)

3. 键名不匹配导致取值失败

test.py里的字段是created-on和modified-on(横杠分隔),但server.py里尝试获取request.json['created_on']和request.json['modified_on'](下划线分隔),就算请求格式正确,这里也会抛出KeyError。

解决办法:统一键名,修改server.py的取值代码:

created_on = request.json['created-on']
modified_on = request.json['modified-on']

4. server.py的requests导入错误

你写了from requests import post,但后面调用的是requests.post(...),这会触发NameError: name 'requests' is not defined,导致Flask返回500错误。

解决办法:改成完整导入requests:

import requests  # 替换原来的 from requests import post

5. Flask返回值错误

server.py最后返回的是requests库的Response对象,Flask无法直接处理这个对象,应该返回响应内容和状态码:

return response.text, response.status_code

修正后的完整代码

test.py

import json
import requests
api_url = 'https://app.catercorner16.hasura-app.io/create-row-in-gs'
create_row_data = {'id': '1235','name':'Joel','created-on':'27/01/2018','modified-on':'27/01/2018','desc':'This is Joel!!'}
r = requests.post(url=api_url, json=create_row_data)
print(r.status_code, r.reason, r.text)

server.py

from src import app
from flask import jsonify,requestrequest,make_response,url_for,redirect
from json import dumps
import requests
url = 'https://hooks.zapier.com/hooks/catch/xxxxx/yyyyy/'

@app.route('/create-row-in-gs', methods=['GET','POST'])
def create_row_in_gs():
    if request.method == 'GET':
        return make_response('failure')
    if request.method == 'POST':
        try:
            t_id = request.json['id']
            t_name = request.json['name']
            created_on = request.json['created-on']
            modified_on = request.json['modified-on']
            desc = request.json['desc']
            create_row_data = {'id': str(t_id),'name':str(t_name),'created-on':str(created_on),'modified-on':str(modified_on),'desc':str(desc)}
            response = requests.post(
                url, json=create_row_data
            )
            return response.text, response.status_code
        except Exception as e:
            return make_response(f'Error: {str(e)}'), 400

内容的提问来源于stack exchange,提问作者Joel Kingsley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:31:49