如何使用 web2py 和 python-requests 响应 GET 请求的全范围数据

How to response with full range of data to GET request using web2py and python-requests

我对 web2py 和网络请求还很陌生,所以请保持冷静。我尝试使用允许我执行以下操作的 web2py 框架来制作应用程序: 我向远程服务器发送 POST 请求(例如服务器的 url 是 https://100.100.10.100

headers = {'Content-type': 'application/json'}
payload = {"uuid": some_file.json,
        "level": "public",
        "Url": " http://localhost:8000/myApp/default/file_to_process}
requests.post('https://100.100.10.100', data=json.dumps(payload), headers=headers)

服务器收到请求并通过计数器 GET 请求尝试从 some_file.json 获取数据,这些数据位于 /home/user/Desktop/some_files 我的硬盘驱动器上并链接到 web2py 应用程序的页面 http://localhost:8000/myApp/default/file_to_process使用以下代码

Controller:
def file_to_process():
    return dict(files=Expose('/home/user/Desktop/some_files'))
View:
{{=files}}

问题是服务器只能从文件中接收第一个字符串,而不是整个数据范围...我不明白应该在哪里搜索错误:在 web2py 代码中或在 Python requests POST 请求。 请提出您的建议或提供解决方案。

Expose 功能的真正目的是在浏览器中构建一个 UI 来列出和下载给定目录中的文件,因此它缺乏一些灵活性(例如,它只是 returns 一个打开的文件 object 到服务器而不设置 Content-Length header,这可能导致文件通过分块传输编码提供,具体取决于 web2py 的服务方式)。

但是,您在这里真的不需要 Expose,因为您可以简单地使用 response.stream 来提供单独请求的文件:

import os

def file_to_process():
    path = os.path.join('home', 'user', 'Desktop', 'some_files', *request.args)
    response.headers['Content-Type'] = 'application/json'
    return response.stream(path)

注意,如果文件名有.json扩展名,则不需要设置Content-Type header,因为response.stream会自动处理。

此外,如果远程服务器允许,而不是让远程服务器从 web2py 请求文件,您可以考虑直接将文件与初始请求一起发布到远程服务器(例如,参见 https://toolbelt.readthedocs.org/en/latest/uploading-data.html).