使用 Falcon 的测试模块模拟 multipart/form-data 文件上传
Simulate multipart/form-data file upload with Falcon's Testing module
这个简单的 Falcon API 将采用 HTTP POST
和 enctype=multipart/form-data
以及 file
参数中的文件上传并在控制台上打印文件的内容:
# simple_api.py
import cgi
import falcon
class SomeTestApi(object):
def on_post(self, req, resp):
upload = cgi.FieldStorage(fp=req.stream, environ=req.env)
upload = upload['file'].file.read()
print(upload)
app = falcon.API()
app.add_route('/', SomeTestApi())
也可以使用 falcon-multipart 中间件来实现相同的目标。
要尝试一下,运行 例如gunicorn
(pip install gunicorn
),
gunicorn simple_api.py
然后使用 cUrl(或选择的任何 REST 客户端)上传文本文件:
# sample.txt
this is some sample text
curl -F "file=@sample.txt" localhost:8000
我现在想用 Falcon 的 testing helpers by simulating a file upload. However, I do not understand yet how to do this (if it is possible at all?). The simulate_request method 测试这个 API 有一个 file_wrapper
参数可能有用但是从文档中我不明白这是怎么回事已满
有什么建议吗?
这是我想出的,它试图模拟我的 Chrome 所做的事情。
请注意,这模拟了您只上传一个文件的情况,但您可以简单地修改此函数以上传多个文件,每个文件由两行分隔。
def create_multipart(data, fieldname, filename, content_type):
"""
Basic emulation of a browser's multipart file upload
"""
boundry = '----WebKitFormBoundary' + random_string(16)
buff = io.BytesIO()
buff.write(b'--')
buff.write(boundry.encode())
buff.write(b'\r\n')
buff.write(('Content-Disposition: form-data; name="%s"; filename="%s"' % \
(fieldname, filename)).encode())
buff.write(b'\r\n')
buff.write(('Content-Type: %s' % content_type).encode())
buff.write(b'\r\n')
buff.write(b'\r\n')
buff.write(data)
buff.write(b'\r\n')
buff.write(boundry.encode())
buff.write(b'--\r\n')
headers = {'Content-Type': 'multipart/form-data; boundary=%s' %boundry}
headers['Content-Length'] = str(buff.tell())
return buff.getvalue(), headers
然后您可以像下面这样使用这个函数:
with open('test/resources/foo.pdf', 'rb') as f:
foodata = f.read()
# Create the multipart data
data, headers = create_multipart(foodata, fieldname='uploadFile',
filename='foo.pdf',
content_type='application/pdf')
# Post to endpoint
client.simulate_request(method='POST', path=url,
headers=headers, body=data)
这个简单的 Falcon API 将采用 HTTP POST
和 enctype=multipart/form-data
以及 file
参数中的文件上传并在控制台上打印文件的内容:
# simple_api.py
import cgi
import falcon
class SomeTestApi(object):
def on_post(self, req, resp):
upload = cgi.FieldStorage(fp=req.stream, environ=req.env)
upload = upload['file'].file.read()
print(upload)
app = falcon.API()
app.add_route('/', SomeTestApi())
也可以使用 falcon-multipart 中间件来实现相同的目标。
要尝试一下,运行 例如gunicorn
(pip install gunicorn
),
gunicorn simple_api.py
然后使用 cUrl(或选择的任何 REST 客户端)上传文本文件:
# sample.txt
this is some sample text
curl -F "file=@sample.txt" localhost:8000
我现在想用 Falcon 的 testing helpers by simulating a file upload. However, I do not understand yet how to do this (if it is possible at all?). The simulate_request method 测试这个 API 有一个 file_wrapper
参数可能有用但是从文档中我不明白这是怎么回事已满
有什么建议吗?
这是我想出的,它试图模拟我的 Chrome 所做的事情。 请注意,这模拟了您只上传一个文件的情况,但您可以简单地修改此函数以上传多个文件,每个文件由两行分隔。
def create_multipart(data, fieldname, filename, content_type):
"""
Basic emulation of a browser's multipart file upload
"""
boundry = '----WebKitFormBoundary' + random_string(16)
buff = io.BytesIO()
buff.write(b'--')
buff.write(boundry.encode())
buff.write(b'\r\n')
buff.write(('Content-Disposition: form-data; name="%s"; filename="%s"' % \
(fieldname, filename)).encode())
buff.write(b'\r\n')
buff.write(('Content-Type: %s' % content_type).encode())
buff.write(b'\r\n')
buff.write(b'\r\n')
buff.write(data)
buff.write(b'\r\n')
buff.write(boundry.encode())
buff.write(b'--\r\n')
headers = {'Content-Type': 'multipart/form-data; boundary=%s' %boundry}
headers['Content-Length'] = str(buff.tell())
return buff.getvalue(), headers
然后您可以像下面这样使用这个函数:
with open('test/resources/foo.pdf', 'rb') as f:
foodata = f.read()
# Create the multipart data
data, headers = create_multipart(foodata, fieldname='uploadFile',
filename='foo.pdf',
content_type='application/pdf')
# Post to endpoint
client.simulate_request(method='POST', path=url,
headers=headers, body=data)