【问题标题】:FastAPI - how to generate random ID?FastAPI - 如何生成随机 ID?
【发布时间】:2021-04-30 13:49:39
【问题描述】:

我正在使用 FastAPI 制作简单的 CRUD API,我想做的是在创建新项目时生成唯一随机数(其他字段是地址和名称,应由用户填写)。我该怎么做?

我的代码片段带有类和 POST 函数。

app = FastAPI()

userdb = []

class User(BaseModel):
    id: int
    address: str
    name: str

@app.post("/users")
def add_user(user: User):
    userdb.append(users.dict())
    return userdb[-1]

【问题讨论】:

  • 这听起来像是完全破坏的设计。为什么api会生成item id?它应该由处理对象创建或存储的代码创建。

标签: python database api fastapi


【解决方案1】:

uuid4 通常是要走的路

在使用函数 anywhere 生成的任何 id 中,它绝对是独一无二的(参考RFC-4122 Section 4.4),而且速度非常快

from uuid import uuid4

...
    unique_id = str(uuid4())

【讨论】:

    【解决方案2】:

    另一种选择 - 通常您希望此 ID 不一定是随机的,而是作为数据库中的一些自动递增索引。 FastAPI 文档给出了一个例子:

    ...
    
    notes = sqlalchemy.Table(
        "notes",
        metadata,
        sqlalchemy.Column("id", sqlalchemy.Integer, primary_key=True),
        sqlalchemy.Column("text", sqlalchemy.String),
        sqlalchemy.Column("completed", sqlalchemy.Boolean),
    )
    
    ...
    class NoteIn(BaseModel):
        text: str
        completed: bool
    
    class Note(BaseModel):
        id: int
        text: str
        completed: bool
    
    ...
    
    @app.post("/notes/", response_model=Note)
    async def create_note(note: NoteIn):
        query = notes.insert().values(text=note.text, completed=note.completed)
        last_record_id = await database.execute(query)
        return {**note.dict(), "id": last_record_id}
    

    https://fastapi.tiangolo.com/advanced/async-sql-databases/?h=id#about-notedict-id-last_record_id

    在您的情况下,您将为UserInUser 使用单独的模型。然后在您的示例中,您会将响应模型中的 ID 分配为您的 userdb 列表中的索引(在实际应用中,它可能不仅仅是一个列表,而是一个数据库)。

    from fastapi import FastAPI
    from pydantic import BaseModel
    
    app = FastAPI()
    
    userdb = []
    
    class UserIn(BaseModel):
        address: str
        name: str
    
    class User(BaseModel):
        id: int
        address: str
        name: str
    
    @app.post("/users")
    def add_user(user_in: UserIn) -> User:
        userdb.append(user_in)
        user_out_dict = userdb[-1].dict()
        user_out_dict.update({"id": len(userdb)-1})
        return User(**user_out_dict)
    

    【讨论】:

    • 谢谢,这只是一个练习,我没有任何外部数据库
    • 我更新了一个 ID 示例,该示例指示您列表中的索引。第二个块中的代码应该按原样运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 2021-02-07
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 2019-07-04
    相关资源
    最近更新 更多