FastAPI第三天---文件请求

简介: FastAPI第三天---文件请求

FastAPI第三天


1. 表单数据


在每次我们实现登录的时候往往都是向服务器发送表单数据,但是从我们后端开发的角度来讲,表单数据确实最容易被攻击的部分。所以在设计表单的时候要设置好过滤器,处理用户发送给服务器的数据。当然,我们系统往往还涉及到数据库进行存储,这个时候SQL注入也是一件非常常见的攻击方式;还有其他类似于数据头注入、电子邮件注入等等手段,这些都是开发的时候需要考虑的。还是那句话,前端校验可以为我们避免部分攻击,但是后端的校验更为重要。


从FastAPI来说,在表单数据中需要使用Form,其中Form是继承自Body的,所以它的参数使用和之前的基本一致


image.png

下面就实现以下最基本的登录API


from fastapi import FastAPI, Form
app = FastAPI()
@app.post("/login/")
async def login(
        username: str = Form(...,description="用户名,不超过十位",max_length=10),
        password: str = Form(...,description="密码,不小于6位",min_length=6)
):
    return {"username": username, "password": password}
复制代码


image.png

2. 文件请求


当我们上传文件的时候,需要使用FileFile继承自Form,所以操作也基本一致。当然我们也可以使用UploadFile,这个对象可以处理更加大的文件,而不像bytes只能储存在内存中。


这里先看一个例子


# 请求文件
from fastapi import FastAPI, File, UploadFile
from typing import List
from fastapi.responses import HTMLResponse
app = FastAPI()
@app.post("/files/")
async def create_file(file: bytes = File(...)):
    return {"file_size": len(file)}
@app.post("/uploadfile/")
async def create_upload_file(file: UploadFile = File(...)):
    return {
        "filename": file.filename,
        "content":await file.read(),
    }
@app.post("/mulfiles/")
async def create_file(files: List[bytes] = File(...)):
    return {"file_sizes": [len(file) for file in files]}
@app.post("/muluploadfiles/")
async def create_upload_file(files: List[UploadFile] = File(...)):
    return {"filenames": [file.filename for file in files]}
@app.get("/")
async def index():
    content = """
    <body>
    <form action="/mulfiles/" enctype="multipart/form-data" method="post">
    <input name="files" type="file" multiple>
    <input type="submit">
    </form>
    <form action="/muluploadfiles/" enctype="multipart/form-data" method="post">
    <input name="files" type="file" multiple>
    <input type="submit">
    </form>
    </body>
        """
    return HTMLResponse(content=content)
复制代码


前两个Post是针对单个文件,后面的是多文件。很遗憾Swagger目前并不支持多文件上传,所以想要测试多文件上传可以使用postman或者直接访问自己写的表单页面进行测试。


注意,官网中的例子存在错误


image.png

另外,针对UploadFile还具有一些异步方法


image.png

  • write: 写入到文件
  • read:读取文件(多少个字节)
  • seek:找到文件中(字节)的位置
  • close:关闭文件


这些方法都是异步的,因此在代码中如果使用必须添加await


image.png

目录
相关文章
|
2月前
|
数据采集 前端开发 JavaScript
vue3 + fastapi 实现选择目录所有文件自定义上传到服务器
vue3 + fastapi 实现选择目录所有文件自定义上传到服务器
92 0
|
2月前
|
IDE 测试技术 开发工具
FastAPI 并发请求解析:提高性能的重要特性
在当今的数字化世界中,网络用户对于高速响应和持续连接的诉求日益显著。这促使了基于 Python 构建的 FastAPI 框架受到广泛关注,它不仅现代化且效率极高,而且简化了并行请求的处理。本篇文章旨在探讨 FastAPI 如何处理这类请求,并对应用实例进行实际编码展示。
FastAPI(54)- 详解 Request 请求对象(上)
FastAPI(54)- 详解 Request 请求对象(上)
553 0
|
JSON IDE API
FastAPI(8)- 请求体 Request Body (下)
FastAPI(8)- 请求体 Request Body (下)
261 0
FastAPI(8)- 请求体 Request Body (下)
【Fastapi】批量上传文件(文档、图片、视频等)
【Fastapi】批量上传文件(文档、图片、视频等)
|
存储 前端开发 JavaScript
聚是一团火散作满天星,前端Vue.js+elementUI结合后端FastAPI实现大文件分片上传
分片上传并不是什么新概念,尤其是大文件传输的处理中经常会被使用,在之前的一篇文章里:[python花式读取大文件(10g/50g/1t)遇到的性能问题(面试向)](https://v3u.cn/a_id_97)我们讨论了如何读写超大型文件,本次再来探讨一下如何上传超大型文件,其实原理都是大同小异,原则就是化整为零,将大文件进行分片处理,切割成若干小文件,随后为每个分片创建一个新的临时文件来保存其内容,待全部分片上传完毕后,后端再按顺序读取所有临时文件的内容,将数据写入新文件中,最后将临时文件再删掉。
聚是一团火散作满天星,前端Vue.js+elementUI结合后端FastAPI实现大文件分片上传
|
前端开发 中间件 测试技术
FastApi的请求拦截
FastApi的请求拦截
738 0
|
JSON 前端开发 测试技术
FastApi下载文件
FastApi下载文件
761 0
FastApi下载文件
|
存储 Python
FastAPI(54)- 详解 Request 请求对象(下)
FastAPI(54)- 详解 Request 请求对象(下)
491 0
FastAPI(54)- 详解 Request 请求对象(下)
FastAPI(15)- 声明请求示例数据(下)
FastAPI(15)- 声明请求示例数据(下)
196 0
FastAPI(15)- 声明请求示例数据(下)