我的架构:
test_multivalues = {
'name': {'type':'string'},
'multi': {'type': 'list', 'schema': {'type': 'media'}},
'arr': {'type': 'list'},
}
我使用帖子数据如下:
内容类型:multipart / form-data
name: multivalue
multi: ....file1...
multi: ....file2....
arr: [arr_value1, arr_value2]
在Eve中,参数arr
将作为列表获取,但multi
仅获取第一个值。
我希望将multi
作为[file1,file2]等列表。
当我阅读代码时,Eve在MultiDict.to_dict()
方法中使用werkzeug的payload()
,该方法仅返回同一个键的第一个值。
如何获取具有多个值的键作为列表?
更新
Eve将使用上面的架构和发布数据引发异常:
multi:must be of list type
更新 是的,我用curl测试它。
curl -F "image=@text.txt" -F "image=@test.txt" http://localhost/eve/api
当我将payload()中的代码更改为:
时v = lambda l: l if len(l) > 1 else l[0]
return dict([(k, v(request.form.getlist(k))) for k in request.form] +
[(k, v(request.files.getlist(k))) for k in request.files])
它返回文件列表,但是Eve的post方法不支持它,并抛出异常。
答案 0 :(得分:0)
解决这个问题的丑陋方式:
def saver(filestorageobj):
app.media.put(
filestorageobj,
filename=filestorageobj.name,
content_type=filestorageobj.mimetype,
resource='test')
def pre_test_POST_callback(request):
from werkzeug.datastructures import ImmutableMultiDict
# files format: [("pics", FileStorageObject)]
pics = [saver(
upfile[1]
) for upfile in request.files.items(True) if upfile[0] == "pics"]
form = request.form.copy()
form['pics'] = pics
request.form = ImmutableMultiDict(form)
request.files = ImmutableMultiDict()
答案 1 :(得分:0)
从0.7+版本的eve开始,你只需要将AUTO_COLLAPSE_MULTI_KEYS设置为True。