从Flask模板到外部API的文件上载

2024-09-27 07:27:20 发布

您现在位置:Python中文网/ 问答频道 /正文

  • 我将我的flask应用程序分为两部分API(flask API)和web应用程序(flask模板)
  • 从web应用程序,我试图上传一个文件,但在API端,我无法发送
  • 文件上传是从API端工作,我已经从邮递员测试
  • 模板(带有端口3010的UI)和API(端口3009)

下面是运行在API端的端口3009

@app.route('/sources', methods=['POST', 'GET'])
def upload_file():
    if request.method == 'POST':
        try:
            print(request.form.get('file')) # Not able to print file here
            print(request.form.get('Language1'))  # I am able to print it
            if 'file' not in request.files:
                resp = jsonify({'message' : 'No file part in the request'})
                resp.status_code = 400
                return resp             
            file = request.files['file']
            if file.filename == '':
                resp = jsonify({'message' : 'No file selected for uploading'})
                resp.status_code = 400
                return resp
            if file and allowed_file(file.filename,'sources'):
                sourceFileName = secure_filename(file.filename)
                Lang1 = request.form.get('Language1')
                Lang2 = request.form.get('Language2')

        except Exception as e:
            print(e)
            resp = jsonify({'message' : 'Server Error'})
            resp.status_code = 500
            return resp

下面是在UI端运行的端口3010

@app.route('/sources', methods=['POST'])
def upload_sources():
    if request.method == "POST":
        Language1 = request.form["Language1"]
        Language2 = request.form["Language2"]
        file = request.files["file"]
        # File object is printing here like: [<FileStorage: 'source_text.docx' ('application/vnd.openxmlformats-officedocument.wordprocessingml.document')>]
        print(file) 
        params = {
                  "Language1":Language1,
                  "Language2":Language2,
                  "file":file
                 }
        headers = {'content-type': 'application/json'}
        req = requests.post('http://localhost:3009/sources', headers=headers, data=params)
        r = req.json()
        print(r['message']) # I am getting response message : ['No file part in the request']

    return redirect(url_for('fetch_sources'))

下面的工作很好,只是获取上传的文件

@app.route('/sources', methods=['GET'])
def fetch_sources():
    sources = requests.get('http://localhost:3009/sources')
    source_data = sources.json()
    if source_data:
        return render_template('sources.html', sources=source_data['sources'])

Tags: 端口formapimessagegetreturnifrequest
1条回答
网友
1楼 · 发布于 2024-09-27 07:27:20

我正在发送一个文件对象,我遵循的方式不正确

我无法从webapp将文件直接发送到API。 在这里,我已经改变了我的代码,它工作得很好

if request.method == 'POST':
    file = request.files["file"]
    sourceFileName = secure_filename(file.filename)
    cwd = os.getcwd()+'/'
    if 'temp' not in os.listdir(cwd):
        os.mkdir(cwd + 'temp')
    file.save(os.path.join(cwd + 'temp', sourceFileName))

    with open(cwd + 'temp/'+ sourceFileName, 'rb') as f:
        data_file = ImmutableMultiDict([("file", f)])
        resp = requests.post(api_base_url + "/sources",
                             files=data_file)

相关问题 更多 >

    热门问题