跳转到主要内容

适用于您的项目的RESTful API框架,无论您使用什么工具。

项目描述

Build Status codecov

Whatever REST Framework

免责声明

这是一个WIP。下一步我可以想到的是

  • 回顾我在项目中留下的TODOs
  • 记录每个组件方法的输入/输出
  • 为基本组件创建单元测试

什么?

基本上这是一个创建RESTful API的无知和薄层。

为什么?

老实说,因为我每次开发API时,总是倾向于使用Django,仅仅因为Django Rest Framework(是的,这是我的个人观点)。
我希望能有能力在我的任何框架/技术中创建RESTful API。

如何?

pip安装 whatever-rest-framework

有一系列完整工作的项目作为示例。请参阅测试文件夹

具体来说,你需要

1) 通过选择一些组件来创建一个APIOrchestrator

你可以为API编排器选择的基组件类型

类型 实现 必须设置吗? 默认值
framework_component_class ChaliceFrameworkComponent, DjangoFrameworkComponent, FalconFrameworkComponent, FlaskFrameworkComponent, PyramidFrameworkComponent
orm_component_class DjangoORMComponent, PeeweeORMComponent, SQLAlchemyORMComponent
schema_component_class MarshmallowSchemaComponent, MarshmallowSQLAlchemySchemaComponent
error_component_class DefaultErrorComponent DefaultErrorComponent
pagination_component_class NoPagePaginationComponent, PagePagePaginationComponent NoPagePaginationComponent
permission_component_class AllowAllPermissionComponent, AllowAuthenticatedPermissionComponent, ReadOnlyPermissionComponent 允许所有权限组件

2) 在这个编排器内部定义 get_current_user(self) 方法

发现请求当前用户的逻辑高度依赖于框架(以及你使用的工具),我决定不将其包含在这个项目范围内。理想情况下,这可以像 def get_current_user(self): return g.user 这样简单,或者甚至可以像 def get_current_user(self): return self.request.user if self.request.user.is_authenticated else None 这样。

3) 创建继承自 APIOrchestrator 的你的API

这些API需要设置 model_classschema_class 属性。你还需要设置 get_queryset(self) 方法。在这里,你可以完全、神奇地访问基本的API CRUD方法(列出资源、检索资源、创建资源、更新资源、删除资源)。

特别说明:@api_view() 装饰器

你还可以通过向API类添加方法来添加满足你需求的其他特定方法!只需使用 @api_view() 装饰器装饰你的自定义方法即可!这个装饰器可以接收作为参数的特定方法要使用的组件覆盖项。因此,例如,你可以有一个带有 permission=AllowAllPermissionComponent 的 APIOrchestrator,但这个特定方法具有 permission=AllowAuthenticatedPermissionComponent,如下所示

class APIOrchestrator(BaseAPI):
    permission_component_class = AllowAllPermissionComponent
    # ...

    @api_view(permission_component_class=AllowAuthenticatedPermissionComponent)
    def retrieve_more_private_stuff(self):
        return {'super-private': 'data'}

适用于Flask应用的示例

from functools import partial

from wrf.api.base import BaseAPI, api_view
from wrf.framework.flask import FlaskFrameworkComponent
from wrf.orm.sqlalchemy import SQLAlchemyORMComponent
from wrf.schema.marshmallow_sqlalchemy import MarshmallowSQLAlchemySchemaComponent

from <your_stuff> import app, db, User, UserSchema

class APIOrchestrator(BaseAPI):
    orm_component_class = partial(SQLAlchemyORMComponent, session=db.session)
    schema_component_class = MarshmallowSQLAlchemySchemaComponent
    framework_component_class = FlaskFrameworkComponent

    def get_current_user(self):
        # from flask_login import current_user; return current_user # if you're using flask-login, for example
        # return self.request.user if self.request.user.is_authenticated else None  # if you're using django, for example
        return {'name': 'Filipe'}

class UserAPI(APIOrchestrator):
    model_class = User
    schema_class = UserSchema

    def get_queryset(self):
        return User.query
    
    @api_view()
    def retrieve_something_else(self, pk):
        user = User.query.filter_by(id=pk).one()
        return {'something_else': user.something_else}

@app.route('/', methods=['GET'])
def list_():
    return UserAPI(request).list()

@app.route('/', methods=['POST'])
def create():
    return UserAPI(request).create()

@app.route('/<int:pk>/', methods=['GET'])
def retrieve(pk):
    return UserAPI(request).retrieve(pk)

@app.route('/<int:pk>/', methods=['PATCH'])
def update(pk):
    return UserAPI(request).update(pk)

@app.route('/<int:pk>/', methods=['DELETE'])
def delete(pk):
    return UserAPI(request).delete(pk)

@app.route('/<int:pk>/something_else/', methods=['GET'])
def retrieve_something_else(pk):
    return UserAPI(request).retrieve_something_else(pk)

支持的技术

框架

  • Chalice
  • Django
  • Falcon
  • Flask
  • Pyramid

ORM

  • Django
  • Peewee
  • SQLAlchemy

Schema

  • Marshmallow
  • Marshmallow-SQLAlchemy

请注意,这个项目旨在易于扩展,所以如果你需要连接其他东西,做起来很简单。例如,查看如何简单地向新框架添加支持如何简单地向新框架添加支持。 =D

贡献

如果您发现任何问题,请打开问题,或尽可能创建拉取请求
如果是拉取请求,请考虑以下事项

  • 尊重行长度(132个字符)
  • 保持这个项目的良好测试覆盖率
  • 在本地运行 tox 以查看是否一切正常(包括lint器和其他Python版本)

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

whatever-rest-framework-0.5.0.tar.gz (12.9 kB 查看哈希值)

上传时间

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面