Python Flask POST 400错误请求错误

时间:2016-10-22 23:59:41

标签: python linux http post flask

我尝试使用flask将数据发布到网站,当我尝试返回数据时,我收到400 Bad Request错误。

这是我发送POST请求的python代码:

import httplib
import urllib
import base64
import json
import pandas as pd
import numpy as np
import requests

_url = 'https://api.projectoxford.ai/emotion/v1.0/recognizeInVideo'
_key = '<my key>'
_maxNumRetries = 10

paramsPost = urllib.urlencode({'outputStyle' : 'perFrame', \
                               'file':'my_file.mp4'})
headersPost = dict()
headersPost['Ocp-Apim-Subscription-Key'] = _key
headersPost['content-type'] = 'application/octet-stream'
jsonGet = {}
headersGet = dict()
headersGet['Ocp-Apim-Subscription-Key'] = _key
paramsGet = urllib.urlencode({})

responsePost = requests.request('post', _url + "?" + paramsPost, \
                                data =open('my_file.mp4','rb').read(), \
                                headers = headersPost)

print responsePost.status_code

这是服务器代码:

import requests
from random import randint

def Temp():
return randint(0,20)


data = {'windspeed':WindSpeed(), 'Temp': Temp(), 'WindDir':WindDir()}
r = requests.post('http://10.0.0.119', data = data)
print (r.text)

在浏览器中运行时会返回400错误,但客户端脚本会获得正确的响应:

from flask import Flask, request, render_template


app = Flask(__name__)

@app.route("/", methods=['GET','POST'])
def result():
    data = request.get_json(force=True)
    Temp = data['Temp']
    return render_template('main.html', name=Temp)

if __name__ == "__main__":
app.run()

其中15是数据[&#39; Temp&#39;]变量。

3 个答案:

答案 0 :(得分:4)

如果您只是导航到http://10.0.0.119,那么您就会向def result()发送GET请求,这会导致错误的请求,因为没有data['Temp'] < / p>

为了在浏览器中完成此工作,您需要从应用程序本身发送POST请求,然后才能查看它。

您的应用可能是:

import requests
from random import randint

from flask import Flask, request, render_template


app = Flask(__name__)

def Temp():
  return randint(0,20)

@app.route("/", methods=['GET','POST'])
def result():
    if request.method == 'POST':
        data = request.form.get('data')
        Temp = data['Temp']
        return render_template('dispaly_data.html', name=Temp)
    else:
        data = {'Temp': Temp()}
        return render_template('post_data.html', data=data)


if __name__ == "__main__":
  app.run()

post_data.html中的表单可能类似于:

<form action="/" method='post'>
    <input type="hidden" name="data" value="{{ data }}"/>
    <input type='submit' value='Send Post'>
</form>

答案 1 :(得分:2)

您发送了错误的请求。您必须使用json=data将其作为JSON发送

r = requests.post('http://10.0.0.119', json=data)

答案 2 :(得分:0)

您不是在您的客户端发布JSON,也不是您的浏览器,因此不要尝试在服务器中将其作为JSON进行处理。只需使用request.form为POST请求访问值,或使用request.args访问GET请求:

@app.route("/", methods=['GET','POST'])
def result():
    if request.method == 'POST':
        data = request.form
    else:
        data = request.args

    temp = data.get('Temp')
    return render_template('main.html', name=temp)
相关问题