最简洁的方法将生成的Flask应用程序代码(Swagger-Codegen)粘贴到后端实现

mik*_*ike 16 python rest flask swagger swagger-codegen

我有:

  1. 一个做[Stuff]的库
  2. 一个昂首阔步的API定义,大致相当于#1,只是略有不同,可以干净地映射到REST服务
  3. 使用Swagger-Codegen生成#2的烧瓶应用程序 - 例如,导致python控制器函数与#1大致一对一.

我的意图是烧瓶应用程序(所有生成的代码)应该只处理实际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; 虽然这是我第一次遇到这个问题,但它似乎已经被广泛解决了!

Dud*_*udi 6

以下方法对我有用:

  • 创建了三个目录:

    • 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)

  • `hasMore` 已从 openapi-generator 中删除(请参阅 https://github.com/OpenAPITools/openapi-generator/pull/7882),因此为了使这个答案从今天起生效,您需要替换 `{{ #hasMore}}、{{/hasMore}}` 和 `{{^-last}}、{{/-last}}` (2认同)

MrN*_*ame 5

我以前很想用swagger-codegen,然后遇到了同样的难题。一切正常,直到您更新规格。尽管您可以使用自定义模板,但是当我想要的只是设计优先的API时,这似乎需要大量的开销和维护。

我最终使用了connexion,它使用了swagger规范来自动处理路由,封送处理,验证等。Connexion构建在flask上,因此您不必担心切换框架或其他任何事情,您将获得部分收益可以自动处理所有应用程序,而不必维护自动生成的代码。

  • 不用担心,它隐藏在文档中:https://connexion.readthedocs.io/en/latest/request.html#request-validation (2认同)
  • 我玩这个。它按预期工作,但是我放弃了很多,即生成所有样板控制器和响应。感谢您的想法和时间,我在这里对您的评论表示赞同,但我真的认为应该有更好的选择。Swagger Codegen看起来很流行而且很健壮。真的有零心态分享吗? (2认同)