适用于您的项目的RESTful API框架,无论您使用什么工具。
项目描述
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_class
和 schema_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 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | c34aa1a5e3f5f7b2f3119d5e8549d39f95221d1e5fd1117c8094454f2dafa45a |
|
MD5 | 8a5f001218f78b46568f82e05eea2526 |
|
BLAKE2b-256 | d6e13573298a33b99881dc9293d0f71bd008dcc3ce6dd260c91504916f232f19 |