You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Flask-RESTful资源类生成CRUD方法

通用Flask-RESTful资源类优化方案

1. 创建通用基础资源类

将重复的CRUD逻辑抽象为继承自Resource的通用类,具体业务资源只需传入对应模型与必要配置即可复用逻辑:

from flask import request, jsonify, make_response
from flask_restful import Resource
from your_db_module import db  # 替换为你的数据库实例

class GenericListResource(Resource):
    def __init__(self, model, create_fields, to_dict_rules=None):
        self.model = model
        self.create_fields = create_fields
        self.to_dict_rules = to_dict_rules or ()

    def get(self):
        items = self.model.query.all()
        serialized_items = [
            item.to_dict(rules=self.to_dict_rules) for item in items
        ]
        return make_response(jsonify(serialized_items), 200)

    def post(self):
        data = request.get_json()
        try:
            item_data = {field: data[field] for field in self.create_fields}
            new_item = self.model(**item_data)
        except (KeyError, TypeError):
            error = {"errors": ["validation errors"]}
            return make_response(jsonify(error), 400)
        
        db.session.add(new_item)
        db.session.commit()
        return make_response(new_item.to_dict(), 201)

class GenericDetailResource(Resource):
    def __init__(self, model):
        self.model = model

    def get(self, id):
        item = self.model.query.filter_by(id=id).first()
        if not item:
            error = {"error": f"{self.model.__name__} not found"}
            return make_response(jsonify(error), 404)
        return make_response(jsonify(item.to_dict()), 200)

    def patch(self, id):
        item = self.model.query.filter_by(id=id).first()
        if not item:
            error = {"error": f"{self.model.__name__} not found"}
            return make_response(jsonify(error), 404)
        
        for attr in request.json:
            if hasattr(item, attr):  # 可选:过滤非法字段
                setattr(item, attr, request.json[attr])
        
        db.session.add(item)
        db.session.commit()
        return make_response(item.to_dict(), 202)

2. 快速实现业务资源类

基于通用类构建具体资源,仅需指定模型、创建字段等差异化配置:

# 用户资源
class Users(GenericListResource):
    def __init__(self):
        super().__init__(
            model=User,
            create_fields=['name', 'password'],
            to_dict_rules=("-password",)  # 序列化时排除密码字段
        )

class UserByID(GenericDetailResource):
    def __init__(self):
        super().__init__(model=User)

# 提示词资源
class Prompts(GenericListResource):
    def __init__(self):
        super().__init__(
            model=Prompt,
            create_fields=['title', 'content', 'user_id']
        )

class PromptByID(GenericDetailResource):
    def __init__(self):
        super().__init__(model=Prompt)

# 注册路由
api.add_resource(Users, '/users')
api.add_resource(UserByID, '/users/<int:id>')
api.add_resource(Prompts, '/prompts')
api.add_resource(PromptByID, '/prompts/<int:id>')

3. 扩展说明

  • 字段校验增强:若需更严谨的验证逻辑,可集成marshmallow库实现序列化与校验分离;
  • 自定义逻辑覆盖:如果某资源需要特殊处理(如额外字段计算),可在具体类中重写对应方法;
  • 错误信息定制:通用类已处理400、404等常见错误,可根据业务需求调整提示内容。

内容的提问来源于stack exchange,提问作者Radagast

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 16:12:50