现在市面上的开源框架, 不管是 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 吗,感觉有点繁琐,另外它不方便生成文档
|