Tra*_*net 2 python rest web-development-server fastapi
我是 webdev 的新手,我有这样的用例:用户向 API 发送一个大文件(例如视频文件),然后该文件需要可供其他 API 访问(可能位于不同的服务器上) )进行进一步处理。
我使用 FastAPI 作为后端,定义一个类型为 的文件参数UploadFile来接收和存储文件。但是,让其他 API 可以访问此文件的最佳方法是什么?有没有办法可以URL从保存的文件中获取公开访问权限,其他 API 可以使用哪些文件来下载该文件?
首先,要返回file从 FastAPI 后端保存在磁盘上的文件,您可以使用FileResponse(如果文件已完全加载到内存中,请参阅此处)。例如:
from fastapi import FastAPI\nfrom fastapi.responses import FileResponse\n\nsome_file_path = "large-video-file.mp4"\napp = FastAPI()\n\n@app.get("/")\ndef main():\n return FileResponse(some_file_path)\nRun Code Online (Sandbox Code Playgroud)\n如果file太大而无法放入内存\xe2\x80\x94,因为您可能没有足够的内存来处理文件数据,例如,如果您有16GB RAM,则\xe2\x80\x99t加载100GB文件\ xe2\x80\x94你可以使用StreamingResponse. 这样,您不必先将其全部读取到内存中,而是将其分块加载到内存中,从而一次处理一个块的数据。下面给出示例。如果您发现yield from f使用时相当慢StreamingResponse,您可以创建一个自定义生成器,如本答案中所述。
from fastapi import FastAPI\nfrom fastapi.responses import StreamingResponse\n\nsome_file_path = "large-video-file.mp4"\napp = FastAPI()\n\n@app.get("/")\ndef main():\n def iterfile():\n with open(some_file_path, mode="rb") as f:\n yield from f\n\n return StreamingResponse(iterfile(), media_type="video/mp4")\nRun Code Online (Sandbox Code Playgroud)\n至于将您的API公开给公众\xe2\x80\x94,即外部API、用户、开发人员等\xe2\x80\x94,您可以使用ngrok(或公开,如本答案中建议的那样)。
\nNgrok 是一个跨平台应用程序,使开发人员能够以最小的努力将本地开发服务器公开到 Internet。要将ngrok代理嵌入到 FastAPI 应用程序中,您可以按照此处的pyngrok建议使用 \xe2\x80\x94 (有关 FastAPI 集成示例,请参阅此处)。如果您想通过Google Colab(使用)而不是本地计算机来运行和公开您的 FastAPI 应用程序,请查看此答案(也可以在网络上找到大量教程/示例)。ngrok
如果您正在寻找更永久的解决方案,您可能需要看看云平台\xe2\x80\x94,更具体地说,是平台即服务(PaaS)。我强烈建议您仔细阅读FastAPI 的部署文档。仔细查看关于 HTTPS和部署概念。
\n通过将您的 API 暴露给外界,您也将其暴露于各种形式的攻击之下。在将您的 API 公开\xe2\x80\x94 之前,即使它\xe2\x80\x99 是免费的\xe2\x80\x94,您需要确保提供安全访问(使用HTTPS),以及authentication(验证用户)并authorisation(验证他们的访问权限;换句话说,验证用户有权访问哪些特定路由、文件和数据)\xe2\x80\x94看看 1. OAuth2 和 JWT 令牌, 2. OAuth2 范围, 3 .基于角色的访问控制 (RBAC) , 4.获取当前用户以及如何使用 FastAPI 实现基于角色的访问控制.
此外,如果您将 API 公开供公众使用,您可能希望限制 API 的使用,因为计算成本高昂、资源有限、DDoS 攻击、暴力攻击、Web 抓取,或者仅仅是因为每月的费用固定数量的请求。您可以在应用程序级别使用Slowapi(相关帖子参见此处)等在应用程序级别执行此操作,或者通过托管服务设置速率限制(如果允许)在平台级别执行此操作。此外,您需要确保用户上传的文件具有允许的文件扩展名,例如 ,.mp4并且不是具有例如.exe可能对您的系统有害的扩展名的文件。最后,您还需要确保上传的文件不超过预定义的MAX_FILE_SIZE限制(基于您的需求和系统资源),以便防止经过身份验证的用户或攻击者上传极大的文件导致消耗服务器资源,导致应用程序最终崩溃。但是,您不应该依赖于Content-Length存在的标头来执行request此操作,因为客户端可能会轻松更改甚至删除该标头。您应该使用类似于此答案的方法(查看“更新”部分),该方法用于在request.stream()传入数据到达时分块处理它们,而不是首先将整个文件加载到内存中。通过使用简单的计数器,例如,,total_len += len(chunk)您可以检查文件大小是否超过了MAX_FILE_SIZE,如果是,则引发HTTPException带有HTTP_413_REQUEST_ENTITY_TOO_LARGE状态代码的一个(另请参阅此答案,了解更多详细信息和代码示例)。
阅读有关 FastAPI安全文档和Cloudflare 上的API 安全性的更多信息。
\n| 归档时间: |
|
| 查看次数: |
1365 次 |
| 最近记录: |