我有几个测试用例来测试基于 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) 有没有一种方法可以将属性表示为只读,但允许在 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) 我像这样运行 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) 我知道如何保护 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) 我们有一个基于 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 程序,它封装了应用程序的业务逻辑。一个例子:
$ 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。
我们得到:
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不是一个选项。
我使用 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)
我正在使用 Connexion 构建 API,所以我使用的app = connexion.FlaskApp(__name__)是代替而不是Flask(__name__).
我想补充before_request和after_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 方法?
我们有一个现有的烧瓶应用程序,我们想将其转移到连接。该应用程序是否仍然可以使用烧瓶运行,例如“烧瓶运行”。我们在希望继续使用的 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 没有运行。
这甚至可能吗?