mik*_*ike 16 python rest flask swagger swagger-codegen
我有:
我的意图是烧瓶应用程序(所有生成的代码)应该只处理实际REST api和参数解析的映射,以匹配swagger中编码的API规范.在任何参数解析(再次生成代码)之后,它应该直接调用我的(非生成的)后端.
我的问题是,如何通过手工编辑生成的python/flask代码来解决这些问题?(对我的设计的反馈,或实现这一点的正式设计模式的细节也会很棒;我是这个领域的新手).
从发生器新鲜,我最终得到python函数,如:
def create_task(myTaskDefinition):
"""
comment as specified in swagger.json
:param myTaskDefinition: json blah blah blah
:type myTaskDefinition: dict | bytes
:rtype: ApiResponse
"""
if connexion.request.is_json:
myTaskDefinition = MyTaskTypeFromSwagger.from_dict(connexion.request.get_json())
return 'do some magic!' # swagger codegen inserts this string :)
Run Code Online (Sandbox Code Playgroud)
在后端我有我的实际逻辑:
def create_task_backend(myTaskDefinition):
# hand-coded, checked into git: do all the things
return APIResponse(...)
Run Code Online (Sandbox Code Playgroud)
什么是正确的create_task()打电话方式create_task_backend()?
当然,如果我对我的swagger规范进行重大更改,我将不得不手动更新未生成的代码; 但是,我可能想要重新生成我的API有很多原因(比如,添加/优化MyTaskTypeFromSwagger类,或者完全跳过检查git生成的代码),如果我必须手工编辑生成的API代码,那么所有这些每次重新生成时,编辑都会被吹走.
当然,我可以用例如一个简单的语法编写脚本.pyparsing; 虽然这是我第一次遇到这个问题,但它似乎已经被广泛解决了!
以下方法对我有用:
创建了三个目录:
src -对于我的代码, src-gen 大张旗鼓生成的代码,codegen 在其中放置了一个脚本,该脚本可以生成服务器以及一些技巧。我将所有模板(可在swagger构建中使用)复制到codegen/templates并对其进行编辑controller.mustache以引用src/server_impl,因此它可以使用我自己的代码。编辑使用模板语言,因此它是通用的。它仍然不是完美的(我会更改一些命名约定),但是确实可以。因此,首先添加到controller.mustache:
from {{packageName}}.server_impl.controllers_impl import {{classname}}_impl
Run Code Online (Sandbox Code Playgroud)
然后添加而不是return 'do some magic!'以下内容:
return {{classname}}_impl.{{operationId}}({{#allParams}}{{paramName}}{{^required}}=None{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}})
Run Code Online (Sandbox Code Playgroud)
src有一个server_impl目录。server_impl可以作为python模块导入cd ../src-gen/swagger_server/
ln -s ../../src/server_impl/
cd ../../codegen
java -jar swagger-codegen-cli.jar generate \
-i /path_to_your_swagger definition.yaml \
-l python-flask \
-o ../src-gen \
-t ./templates
cd ../src-gen/
python3 -m swagger_server
Run Code Online (Sandbox Code Playgroud)
我以前很想用swagger-codegen,然后遇到了同样的难题。一切正常,直到您更新规格。尽管您可以使用自定义模板,但是当我想要的只是设计优先的API时,这似乎需要大量的开销和维护。
我最终使用了connexion,它使用了swagger规范来自动处理路由,封送处理,验证等。Connexion构建在flask上,因此您不必担心切换框架或其他任何事情,您将获得部分收益可以自动处理所有应用程序,而不必维护自动生成的代码。
| 归档时间: |
|
| 查看次数: |
4175 次 |
| 最近记录: |