API设计使用Flask,结合SQL炼金术和棉花糖

2024-09-27 23:15:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个简单的CRUD应用程序。我正在使用Flask,我决定使用SQLAlchemy作为ORM,使用棉花糖作为有效负载的验证

我目前的问题是尽量减少需要写入的复制量

在这种情况下,我们只是处理帖子

创造

型号.py

class Post(Base):
    __tablename__ = 'posts'

    id = Column(UUID(as_uuid=True), primary_key=True)
    user_id = Column(UUID(as_uuid=True), ForeignKey('users.id'))
    title = Column(String(length=50)) 

schemas.py

class CreatePostSchema(Schema):
    title = fields.Str(required=True)

我不需要iduser_id,因为它们将由后端创建/找到,但所有其他字段都是必需的

我正在使用蓝图,与后期创建相关联的一个路由/端点将具有post()方法

我可以创建装饰器,首先确保模式正确,获取用户并将其传递到post方法:

@auth_required()
@validate_schema(CreatePostSchema)
def post(request, user_id, cleaned_schema):
    create_post(cleaned_schema)
    return 200

现在,我可以编写create_post()函数,而无需硬编码键,如:

def create_post(user_id, **clean_data)
    post = models.Post(**clean_data)
    post.user_id = user_id

但这是一种良好的做法吗?或者我应该明确地声明密钥,如:

def create_post(user_id, title)
    post = models.Post(title=title)
    post.user_id = user_id
    post.id = uuid4()
    return post

然后我还有一个问题,在哪个阶段进行验证。验证应该在post()方法之前进行,还是在创建post期间进行?例如,我可以这样做:

def create_post(user_id, **data):
    clean_data = CreatePostSchema.load(**data)
    post = models.Post(**clean_data)
    session.add(post)
    session.commit()
    return

这样我就可以删除额外的@has_schema()装饰器

更新

更新是另一种不用重复键就可以编写的beast。让我们假设只有1个字段和EditPostSchema = CreatePostSchema。事实上,我会有更多,例如创建日期、更新日期、描述等

clean_data = EditPostSchema.load(**data)
id = clean_data.pop('id')
update_post(id, clean_data)

def update_post(id, **clean_data):
    session.query(Post).get(id).update(**clean_data, synchronize_session=False)
    return

所以本质上,我认为Schemas应该已经解释了我需要的CRUD字段,所以我没有必要重复它们。我说得对吗


Tags: cleanidtruedatareturntitlesessionschema
1条回答
网友
1楼 · 发布于 2024-09-27 23:15:45

可以使用webargs使用棉花糖模式验证输入数据

如果希望避免代码重复,还可以尝试marshmallow-sqlalchemy从模型生成API模式

如果API与模型足够接近,您可以通过在POST中传递输入数据来创建对象:

post = models.Post(**data)

更新确实不同。有些人只是用传入的数据更新对象,但这可能并不适用于所有情况,因为数据中的空字段会导致对象中的字段被删除

您可以对要更新的字段进行harcode

在我的一个应用程序中,我创建了一个函数,该函数将模式作为参数,并使用它来知道需要哪些字段,并使用传入数据更新对象,包括删除该数据中缺少的字段

相关问题 更多 >

    热门问题