现在市面上的开源框架, 不管是 tornado, django 或者 flask. 写起 API 总感觉没有 Nodejs 中的 hapijs 框架爽, 根据 hapijs 的设计原理, 我设想了下面的写法. 大家一起来讨论. 基于配置的方法去写接口感觉真的很舒适. 部分代码如下. (框架还没有, 只是设想. )
app.js
from api import * from .apis.post import post from .apis.user import user from .plugins.my_plugin import MyPlugin app = App() app.plugin(MyPlugin) app.plugin(AuthorizationPlugin('jwt')) app.publish(user) app.publish(post) app.start(port=3000)
user.js
from api import * from .services.user import UserService user = BluePrint() user.role('admin') @user.cache({ 'expires_in': 30 * 1000, 'privacy': 'private' }) @user.query({ 'name': Field().string() }) @user.role('all') @user.get('/') def list(self, request): users = UserService.list(**request.query) return Response(users) @user.cache({ 'expires_in': 30 * 1000, 'privacy': 'private' }) @user.params({ 'id': Field().string() }) @user.role('login_user') @user.get('/{id}') def retrieve(self, request): user = UserService.retrieve(id=request.params[id]) return Response(user) @user.payload({ 'name': Field().string() }) @user.role('admin') @user.post('/') def create(self, request): user = UserService.create(request.payload) return Response(user) @user.payload({ 'name': Field().string() }) @user.params({ 'id': Field().string() }) @user.role('admin') @user.patch('/{id}') def update(self, request): user = UserService.update(id=request.params[id], payload=request.payload) return Response(user) @user.payload({ 'name': Field().string() }) @user.params({ 'id': Field().string() }) @user.role('admin') @user.put('/{id}/name') def replace_name(self, request): user = UserService.update(id=request.params[id], payload=request.payload) return Response(user)
![]() | 1 guyskk 2017-06-19 20:13:46 +08:00 via Android Flask 稍微封装一下也可以写出这种效果,待我回去截个图 |
2 zjq426 2017-06-20 09:31:25 +08:00 |
![]() | 3 araraloren 2017-06-20 09:32:26 +08:00 ~~ 看不懂,也没个注释 讲解,进来一脸懵逼 |
![]() | 4 guyskk 2017-06-20 11:13:29 +08:00 API 写法 ![]() Flask 封装 ![]() ![]() ![]() ![]() 这样写还是比较方便的,不过不建议造新框架,生态很重要 |
![]() | 5 guyskk 2017-06-20 11:22:03 +08:00 doc_view 里面我用模板生成了 .apib (API Blueprint https://apiblueprint.org/) 格式的文档。 这些代码没从项目里抽取出来,要做成通用的框架或插件要考虑很多使用场景的问题。我这里约定 全部 POST,全部 JSON,所以省了很多事。 |
![]() | 6 guyskk 2017-06-20 11:29:00 +08:00 文档效果 ![]() |
7 RaymondLiu 2017-06-30 21:19:46 +08:00 via iPhone @guyskk flask-restful 自带函数验证 |
![]() | 8 guyskk 2017-06-30 21:35:43 +08:00 via Android @RaymondLiu 你指的是 RequestParser 吗,感觉有点繁琐,另外它不方便生成文档 |