How to parse request for files and JSON in a single API in Flask (Python)

120 Views Asked by At

I am using Flask restplus to build an API where file and string are coming from the user request.

I have controller like this:

from flask import request
from flask_restplus import Resource

@api.route('/my_file_upload')
class UploadMyFile(Resource):
    @api.doc("Upload my file")
    @api.expect(file_dto, json_dto, validate=True)
    def post(self):
        user_name = request.json['username']
        my_file1 = request.files['myfile1']
        my_file2 = request.files['myfile2']
        return some_function(user_name, my_file)

And DTOs from flask_restplus import reqparse, Namespace, fields

class UserDto: api = Namespace('user', description='user perations')

class FilesUploadDto:

file_dto = reqparse.RequestParser()
file_dto = file_upload.add_argument('myfile1', location='files',type=FileStorage, required=True)
file_dto = file_upload.add_argument('myfile2', location='files',type=FileStorage, required=True)

user_dto = api.model('username', {'user name': fields.String(required=True, description='string'),})

I did

file1 = request.files['myfile1']
file1 = request.files['myfile2']
username = request.files['username']

When I debug,

request.files

I got ImmutableMultiDict([('myfile1', <FileStorage: 'file.pdf' (''application/pdf'')>), ('myfile2', <FileStorage: 'file2.pdf' ('application/pdf')>)])

But when i try -->

request.json['username']

it prints nothing.

Other attribute i tried to get username are : request.data, request.values.

Why I can see files but not string passed from the input.

I want to parse the request for the File/Files and JSON in a single API.

Any help would be highly appreciable.

Note: I am using Python 3.7 , with Swagger UI, Flask & flask resplus

0

There are 0 best solutions below