当前位置: 首页 > 知识库问答 >
问题:

将生成的 Flask 应用代码 (Swagger-Codegen) 粘合到后端实现的最干净方式

蒋培
2023-03-14

我有:

  1. 提供[资料]的图书馆。
  2. 一个招摇过市的API定义,大致为#1,有细微差别,可以清晰地映射到REST服务。
  3. 使用Swagger Codegen-eg生成的flask应用程序#2导致python控制器函数与351大致一对一

我的意图是flask应用程序(所有生成的代码)应该只处理实际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 :)

在后端,我有自己的逻辑:

def create_task_backend(myTaskDefinition):
    # hand-coded, checked into git: do all the things
    return APIResponse(...)

create_task()调用create_task_backend()的正确方法是什么?

共有3个答案

凌黎明
2023-03-14
匿名用户

现在,我通过以下步骤来解决这个问题

    < li >运行codegen < Li > sed-为生成的代码编写脚本,以修复诸如名称空间之类的琐事 < li >手动编辑文件,这样它们就可以简单地调用我的“后端”中的相应函数,而不是返回< code >“变点魔法”(这是所有生成的控制器endpoint返回的字符串) < li >使用< code>git format-patch对之前的更改进行修补,以便当我重新生成代码时,构建可以自动应用这些更改。

因此,我可以添加新的endpoint,我只需要手动编码对后端的调用~一次。而不是使用补丁文件,我可以通过为生成的代码编写py-parsing语法并使用解析生成的代码来创建对后端的调用来直接执行此操作...这将需要更长的时间,所以我做了这一切作为一个快速的黑客。

这远远不是最优的,我不打算将其标记为已被接受,因为我希望有人能提供一个真正的解决方案

子车宏浚
2023-03-14

我以前曾试图使用swagger-codegen,并遇到了同样的难题。一切都很好,直到您更新规格。虽然您可以使用自定义模板,但这似乎只是大量的开销和维护,而我想要的只是一个设计优先的API。

我最终使用了connexion,它使用swagger规范来自动处理路由、封送、验证等。Connexion构建于flask之上,因此您不需要担心切换框架或任何事情,您将从swagger中自动处理部分应用程序,而不必维护自动生成的代码。

吕向荣
2023-03-14

下面的方法对我很有效:

    < li> src -对于我的代码, < li> src-gen用于swagger生成的代码, < li> codegen,其中我放了一个生成服务器的脚本以及一些技巧。

我将所有模板(在swagger版本中可用)复制到codegen/模板中,并编辑了contror.mustache以引用src / server_impl,因此它可以使用我自己的代码。编辑使用模板语言,因此它是通用的。它仍然不完美(我会改变一些命名约定),但它完成了工作。因此,首先添加到 controller.mustache

from {{packageName}}.server_impl.controllers_impl import {{classname}}_impl

然后添加,而不是返回'do some magic!' 以下内容:

return {{classname}}_impl.{{operationId}}({{#allParams}}{{paramName}}{{^required}}=None{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}})
  • 脚本:
    • src有一个server_impl
    • 它创建了一个符号链接,以便<code>server_impl</code>可以作为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
    

 类似资料:
  • 我使用swagger-codigen-2.1.6和成功生成序列化模型类通过swagger-codigen-maven-plugin使用序列化模型配置选项。但是,我没有看到序列VersionUID添加到类中,也找不到任何留档来包含它。任何帮助都将不胜感激。提前感谢。

  • 比如 其实相当于 代码不需要手动处理就可以执行。

  • 我需要在eclipse中使用with swagger codegen插件(用于maven)生成服务器存根代码。你能帮我怎么做吗?以及需要什么配置(在pom.xml中)。

  • 问题内容: 从Python 2.6的迭代器中获取最后一项的最佳方法是什么?例如说 从中获取最短代码/最干净的方法是什么? 我可以这样做,但是效率似乎不高: 问题答案:

  • 问题内容: 我已经开始使用gwt进行一些基本的Java编码,而我有点担心主类的繁重。 例如- 如何分隔密钥处理程序,因为它们触发了UI的许多更改,我如何才能将其移到单独的.class文件中,并且仍然能够访问主类中的所有各种小部件,而不必将所有内容传递给处理程序(即,我在click事件之后处理的所有小部件)。 我已经在Google上搜索过,但是没有遇到任何特别好的例子- 知道我可以阅读的任何易读的代

  • 我刚刚开始使用Swagger和NodeJS。我能够在我的NodeExpress应用程序中实现Swagger,并且还能够准确地使用Swagger-Codesen(Typecript-Angular)生成typecript-client-code。 我遇到的一个问题是,生成的代码分布在许多不同的文件中。我希望它只输出一个文件