标签: connexion

Pytest:从父类继承固定装置

我有几个测试用例来测试基于 Flask/connexion 的 api 的端点。

现在我想将它们重新排序为类,因此有一个基类:

import pytest
from unittest import TestCase

# Get the connexion app with the database configuration
from app import app


class ConnexionTest(TestCase):
    """The base test providing auth and flask clients to other tests
    """
    @pytest.fixture(scope='session')
    def client(self):
        with app.app.test_client() as c:
            yield c
Run Code Online (Sandbox Code Playgroud)

现在我有另一个带有实际测试用例的课程:

import pytest
from ConnexionTest import ConnexionTest

class CreationTest(ConnexionTest):
    """Tests basic user creation
    """

    @pytest.mark.dependency()
    def test_createUser(self, client):
        self.generateKeys('admin')
        response = client.post('/api/v1/user/register', json={'userKey': self.cache['admin']['pubkey']})
        assert response.status_code == 200
Run Code Online (Sandbox Code Playgroud)

现在不幸的是我总是得到一个

TypeError: test_createUser() missing …
Run Code Online (Sandbox Code Playgroud)

python pytest flask connexion

9
推荐指数
1
解决办法
8285
查看次数

OpenAPI 3 - 只读属性,但允许在 POST/PUT 中写入

有没有一种方法可以将属性表示为只读,但允许在 POST 或 PUT(即创建或替换)操作期间写入该属性?

换句话说,在创建资源时,我希望该属性是可写的。但是一旦创建了资源,我想保持它不可变。属性可以是 POSTable/PUTable 但不是 PATCHable 吗?

例子:

# OK example.
/AwesomeResource POST
{"owner": "ownerID123"}

vs

# Bad Request example.
/AwesomeResource/456 PATCH
{"owner": "ownerID789"}
Run Code Online (Sandbox Code Playgroud)

rest openapi connexion

9
推荐指数
1
解决办法
3036
查看次数

如何将变量传递到 Connexion Flask 应用程序上下文中?

我像这样运行 Connexion/Flask 应用程序:

import connexion
from flask_cors import CORS
from flask import g

app = connexion.App(__name__, specification_dir='swagger_server/swagger/')
app.add_api('swagger.yaml')
CORS(app.app)
with app.app.app_context():
    g.foo = 'bar'
    q = g.get('foo') # THIS WORKS
    print('variable', q)
app.run(port=8088, use_reloader=False)
Run Code Online (Sandbox Code Playgroud)

代码中的其他地方:

from flask import abort, g, current_app

def batch(machine=None):  # noqa: E501
    try:
        app = current_app._get_current_object()
        with app.app_context:
            bq = g.get('foo', None) # DOES NOT WORK HERE
            print('variable:', bq)
        res = MYHandler(bq).batch(machine)
    except:
        abort(404)
    return res
Run Code Online (Sandbox Code Playgroud)

这不起作用 - 我无法将变量('bla')传递给第二个代码示例。

知道如何正确传递上下文变量吗?或者如何传递一个变量并在所有 Flask 处理程序中全局使用它?

我已经尝试过这个解决方案(有效):在第一个代码部分我会添加:

app.app.config['foo'] = 'bar' …
Run Code Online (Sandbox Code Playgroud)

python flask connexion

8
推荐指数
1
解决办法
1897
查看次数

在 swagger python 服务器存根处向端点添加令牌授权装饰器的任何解决方法

我知道如何保护 Flask 中的端点,并且我想对生成的 python 服务器存根做同样的事情。我想知道如何为 swagger python 服务器集成烧瓶令牌身份验证工作,以便端点得到保护。我可以轻松地将令牌认证装饰器添加到 Flask 中的端点。这就是flask-restplus中的工作方式,下面的这个完全有效:

from flask import Flask, request, jsonify
from flask_restplus import Api, Resource

app = Flask(__name__)

authorizations = {
    'apikey' : {
        'type' : 'apiKey',
        'in' : 'header',
        'name' : 'X-API-KEY'
    },
}

api = Api(app, security = 'apikey',authorizations=authorizations)

def token_required(f):
    @wraps(f)
    def decorated(*args, **kwargs):
        token = None
        if 'X-API-KEY' in request.headers:
            token = request.headers['X-API-KEY']
        if not token:
            return {'message' : 'Token is missing.'}, 401
        if token != 'mytoken':
            return {'message' : …
Run Code Online (Sandbox Code Playgroud)

python flask swagger connexion

7
推荐指数
1
解决办法
3027
查看次数

Swagger 将自定义属性添加到参数定义中

我们有一个基于 connexion 和 Flask 库的 python Web 服务器应用程序。出于审计目的,我们将每个请求(包括请求正文)打印到日志中。这些日志比 Flask 默认打印的日志要广泛得多。

但是,有些参数(例如密码或密钥)我不想将其值打印到日志中。

我想将自定义属性添加到 swagger.yml 中的多个参数定义中,以便在 Web 应用程序启动时我将从 connexion 获取参数定义并保存具有此自定义属性的所有参数,因此稍后我将隐藏这些参数的值日志。

我想要的定义:

    paths:
      /demo_add_user:
        post:
          summary: "add user"
          operationId: api.api.demo_add_user
          parameters:
            - name: "new_user"
              in: body
              required: true
              description: "Use to add"
              schema:
                $ref: "#/definitions/NewUser"
            - name: "password"
              in: body
              description: "user password"
              required: false
              type: string
              x-hidden: true
          responses:
Run Code Online (Sandbox Code Playgroud)

显然,我希望连接忽略此属性,因为这是特定于我们的实现的。有什么方法可以添加自定义属性(例如x-hidden参数定义)?

python flask swagger connexion

5
推荐指数
1
解决办法
5871
查看次数

在业务逻辑应用程序中使用 swagger 生成的数据模型的最佳方法

我有一个 Python 程序,它封装了应用程序的业务逻辑。一个例子:

$ app pets list
[{
 "name": "Hasso",
 "age": 21
},{
 "name": "Lassy",
 "age": 15
 }]
Run Code Online (Sandbox Code Playgroud)

现在我想用Swagger.io实现一个 REST API 。YAML 的摘录如下所示:

 summary: Gets all dogs 
  produces:
  - application/json
  responses:
    200:
      description: array of dogs
      schema:
        type: array
        items:
        $ref: '#/definitions/Dog'
Run Code Online (Sandbox Code Playgroud)

Swagger-codgen 使用 Flask & connexion生成 python 代码并提供以下目录结构:

??? python-flask
    ??? swagger_server
        ??? controllers
        ??? models
        ??? __pycache__
        ??? swagger
        ??? test
Run Code Online (Sandbox Code Playgroud)

-目录中有所有使用的对象类型的类models

我想将 API-App 和 BL-App(业务应用程序)分开,但为了方便起见使用相同的模型。

将这些模型定义之间的模型定义共享给应用程序的最佳方式是什么?我还将这个 BL-App 导入 API-Project 以实现controllers-part。

python flask swagger connexion

5
推荐指数
0
解决办法
445
查看次数

导入错误:无法从“werkzeug”导入名称“FileStorage”

我们得到:

File "/usr/lib/python2.7/site-packages/connexion/decorators/validation.py", line 9, in <module>
    from werkzeug import FileStorage
Run Code Online (Sandbox Code Playgroud)

因为我们正在使用 Python 2.7.x 升级connexion==2.6.0不是一个选项。

python werkzeug python-2.7 connexion

5
推荐指数
2
解决办法
5608
查看次数

(Connexion 3.0.2) ModuleNotFoundError:请使用“flask”额外安装 connexion

问题

我使用 Flask 的连接。今天我将 connexion 从 2.14.2 升级到 3.0.2 并查看ModuleNotFoundError: Please install connexion using the 'flask' extra

https://connexion.readthedocs.io/en/latest/quickstart.html

我查了官方文档,上面写着“要利用 FlaskApp,请确保使用 Flask extra 安装 connexion”。

问题

如何使用 Flask extra 安装连接?
文档说命令是pip install connexion[<extra>],但我看到一条错误消息“未找到匹配项:connexion[flask]”。

% pip install connexion[flask]
zsh: no matches found: connexion[flask]
Run Code Online (Sandbox Code Playgroud)

环境

  • Python 3.12.0
  • 烧瓶3.0.0
  • 连接3.0.2

python pip flask connexion

4
推荐指数
1
解决办法
1782
查看次数

使用 Connexion 时访问像 before_request 这样的 Flask 方法

我正在使用 Connexion 构建 API,所以我使用的app = connexion.FlaskApp(__name__)是代替而不是Flask(__name__).

我想补充before_requestafter_request处理程序来打开和关闭数据库连接。然而,由于app是一个connexion.FlaskApp对象,这些装饰器方法不存在。

@app.before_request
def before_request():
    g.db = models.db
    g.db.connection()


@app.after_request
def after_request():
    g.db.close()
Run Code Online (Sandbox Code Playgroud)

before_request当我使用 Connexion 时,如何使用和其他 Flask 方法?

python flask connexion

3
推荐指数
1
解决办法
1341
查看次数

如何使用 Flask 运行 Connextion/Flask 应用程序?

我们有一个现有的烧瓶应用程序,我们想将其转移到连接。该应用程序是否仍然可以使用烧瓶运行,例如“烧瓶运行”。我们在希望继续使用的 cli 中使用了“管理”插件。

我们尝试修改应用工厂方法以使用连接烧瓶应用。使用“运行烧瓶”我们得到一个错误,“应用程序”不是烧瓶应用程序。

    app = connexion.FlaskApp(__name__.split('.')[0])
    app.add_api('some_api.yml')
    return app
Run Code Online (Sandbox Code Playgroud)

还尝试创建这两个应用程序。

    app = Flask(__name__.split('.')[0])
    connexion_app = connexion.FlaskApp(__name__.split('.')[0])
    connexion_app.add_api('./api/resources/reload_spec.yml')
    return app
Run Code Online (Sandbox Code Playgroud)

使用第一种方法运行“flask run”会出现“app”不是有效的烧瓶应用程序的错误:RuntimeError: app is not a valid flask.app.Flask app instance

第二种方法似乎没有生成 UI,这并不奇怪,因为 connexion_app 没有运行。

这甚至可能吗?

python flask python-3.x swagger connexion

1
推荐指数
1
解决办法
1539
查看次数

标签 统计

connexion ×10

python ×9

flask ×8

swagger ×4

openapi ×1

pip ×1

pytest ×1

python-2.7 ×1

python-3.x ×1

rest ×1

werkzeug ×1