我正在使用Flask、Flask-Restfull、Flask-Uploads和Marshmallow构建一个rest API。我正在使用Postman来测试它。当我用邮递员发送请求时,我收到了"image":“必填字段缺少数据。”问题似乎是"request.files“返回一个空的ImmutableMultiDict([])。在这里,我发送了Postman请求的代码和图像。
from flask_restful import Resource
from flask import send_file, request
from flask_jwt_extended import jwt_required, get_jwt_identity
import traceback
import os
from werkzeug.utils import secure_filename
from libs import image_helper
from libs.strings import gettext
from schemas.image import ImageSchema
import logging
image_schema = ImageSchema()
class ImageUpload(Resource):
@jwt_required()
def post(self):
"""
This endpoint is used to upload an image file. It uses the
JWT to retrieve user information and save the image in the user's folder.
If a file with the same name exists in the user's folder, name conflicts
will be automatically resolved by appending a underscore and a smallest
unused integer. (eg. filename.png to filename_1.png).
"""
print(request.files) # IT RETURNS ImmutableMultiDict([])
data = image_schema.load(request.files)
user_id = get_jwt_identity()
folder = f"user_{user_id}"
try:
# save(self, storage, folder=None, name=None)
image_path = image_helper.save_image(data["image"], folder=folder)
# here we only return the basename of the image and hide the internal folder structure from our user
basename = image_helper.get_basename(image_path)
return {"message": gettext("image_uploaded").format(basename)}, 201
except: #UploadNotAllowed: # forbidden file type
extension = image_helper.get_extension(data["image"])
return {"message": gettext("image_illegal_extension").format(extension)}, 400-架构
class FileStorageField(fields.Field):
default_error_messages = {
"invalid": "Not a valid image."
}
def _deserialize(self, value, attr, data) -> FileStorage:
if value is None:
return None
if not isinstance(value, FileStorage):
self.fail("invalid")
return value
class ImageSchema(Schema):
image = FileStorageField(required=True)-邮递员图片


发布于 2021-03-20 23:57:52
我已经通过删除unwanted code(与问题无关)来尝试您的代码。并且我能够成功地接收到请求中的文件。
下面是我使用的代码
from flask import Flask, request
from flask_restful import Api, Resource
from marshmallow import Schema, fields
from werkzeug.datastructures import FileStorage
app = Flask(__name__)
api = Api(app)
class FileStorageField(fields.Field):
default_error_messages = {
"invalid": "Not a valid image."
}
def _deserialize(self, value, attr, data, **kwargs) -> FileStorage:
if value is None:
return None
if not isinstance(value, FileStorage):
self.fail("invalid")
return value
class ImageSchema(Schema):
image = FileStorageField(required=True)
image_schema = ImageSchema()
class ImageUpload(Resource):
def post(self):
print(request.files) # IT RETURNS ImmutableMultiDict([])
data = image_schema.load(request.files)
print(data)
return {"ok": True}
api.add_resource(ImageUpload, '/upload/image')
if __name__ == "__main__":
app.run(debug=True)这是邮递员的截图


https://stackoverflow.com/questions/66678975
复制相似问题