【问题标题】:POST request works from POSTMAN but not in flaskPOST 请求适用于 POSTMAN,但不适用于烧瓶
【发布时间】:2020-06-17 06:58:43
【问题描述】:

假设 api url 是https://34.35.36.37:8000/api

从邮递员应用程序发送了一个成功的 POST 请求

附件(key = user_image)是.jpg文件

在服务器端(https://34.35.36.37:8000/api):

@app.route('/api', methods=['POST'])
def api():
    print("check1")
    user_image = request.files['user_image']
    print("check2")
    return "some text"

但是当我尝试使用烧瓶应用程序发布请求时,其中显示了一个表单以上传图像,然后将其发送到 api url,出现错误

api_url = "https://34.35.36.37:8000/api"
content_type = 'application/json' 
headers = {'Content-Type': content_type}

class UploadForm(FlaskForm):
    user_image = FileField('Upload an image',validators=[FileAllowed(['jpg', 'png', 'jpeg'], u'Image only!'), FileRequired(u'File was empty!')])
    submit = SubmitField('Submit')

@app.route('/', methods=['GET','POST'])
def predict():
    form = UploadForm()
    if form.validate_on_submit():
        payload = {}
        files = [
          ('user_image', form.data['user_image'])
        ]
        #response = requests.post(api_url, data={'user_image': form.data['user_image']}, headers=headers, verify=False)
        response = requests.request("POST", api_url, headers=headers, data = payload, files = files, verify=False)
        print(response.text)
        return 'some text'

     return render_template('index.html', form=form)

在服务器端检查时,print('check1') 行被执行但print('check2') 行不被执行。

我认为错误在于以下两行,其中涉及将图像发送到发布请求中的 api url

第 1 行:

files = [
              ('user_image', form.data['user_image'])
            ]

第 2 行:

response = requests.request("POST", api_url, headers=headers, data = payload, files = files, verify=False)

【问题讨论】:

  • 看起来files 参数将数据作为流发送,您需要做更多的工作来上传文件。查看@gihanchanuka 在stackoverflow.com/questions/22567306/…上的回答
  • @PGHE 问题是邮递员使用文件位置来读取文件 'files = {'user_image': open('C://file.jpg', 'rb')}' 。使用烧瓶表单时有没有办法做到这一点,或者在 POST 请求中使用图像时,我们有没有办法让它在烧瓶和邮递员中都工作?

标签: python api flask python-requests postman


【解决方案1】:
api_url = "https://34.35.36.37:8000/api"

class UploadForm(FlaskForm):
    user_image = FileField('Upload an image',validators=[FileAllowed(['jpg', 'png', 'jpeg'], u'Image only!'), FileRequired(u'File was empty!')])
    submit = SubmitField('Submit')

@app.route('/', methods=['GET','POST'])
def predict():
    form = UploadForm()
    if form.validate_on_submit():
        file_uploaded = request.files['user_image']
        files = {'user_image': (file_uploaded.filename, file_uploaded.read())}
        response = requests.post(api_url, files = files)
        return 'some text'

     return render_template('index.html', form=form)

上面的代码对我有用。这相当于在“正文”部分中选择了一个带有“user_image”键的文件后,从邮递员那里发送一个“POST”请求。请勿在 post 请求中使用任何标头response = requests.post(api_url, files = files)

在服务器端(api_url),可以用user_image = request.files['user_image']接收文件

【讨论】:

    猜你喜欢
    • 2022-01-21
    • 2017-08-06
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 2018-03-25
    • 2015-09-19
    相关资源
    最近更新 更多