Connexion & Flask: доступ к БД в обработчике запросов - PullRequest
0 голосов
/ 02 мая 2019

Я хочу получить доступ к db объекту в обработчике конечной точки в connexion приложении.

В настоящее время я присоединяю его к current_app в app.py:

.
import connexion
from flask import current_app
from flask_sqlalchemy import SQLAlchemy


connexion_app = connexion.App(__name__, specification_dir="./")
connexion_app.add_api("swagger.yaml")
db = SQLAlchemy(connexion_app.app)

with connexion_app.app.app_context():
    current_app.db = db


if __name__ == "__main__":
    connexion_app.run(host="0.0.0.0", port=5000, debug=True)

, а затем получить доступ к нему в handlers.py

from flask import current_app


def cars():
    data = current_app.db.query(...)
    return data

Это правильный подход или я должен предпочесть контекстную переменную Flask g над current_app? Они обе являются контекстными переменными, но когда их использовать, это немного сбивает с толку.

Невозможно сделать from app import db в handlers.py из-за

  ...
    connexion_app.add_api("swagger.yaml")
  File "/home/user/.virtualenvs/my_venv/lib/python3.6/site-packages/connexion/apps/flask_app.py", line 54, in add_api
    api = super(FlaskApp, self).add_api(specification, **kwargs)
  File "/home/user/.virtualenvs/my_venv/lib/python3.6/site-packages/connexion/apps/abstract.py", line 155, in add_api
    options=api_options.as_dict())
  File "/home/user/.virtualenvs/my_venv/lib/python3.6/site-packages/connexion/apis/abstract.py", line 108, in __init__
    self.add_paths()
  File "/home/user/.virtualenvs/my_venv/lib/python3.6/site-packages/connexion/apis/abstract.py", line 213, in add_paths
    self._handle_add_operation_error(path, method, err.exc_info)
  File "/home/user/.virtualenvs/my_venv/lib/python3.6/site-packages/connexion/apis/abstract.py", line 227, in _handle_add_operation_error
    six.reraise(*exc_info)
  File "/home/user/.virtualenvs/my_venv/lib/python3.6/site-packages/six.py", line 693, in reraise
    raise value
  File "/home/user/.virtualenvs/my_venv/lib/python3.6/site-packages/connexion/resolver.py", line 61, in resolve_function_from_operation_id
    return self.function_resolver(operation_id)
  File "/home/user/.virtualenvs/my_venv/lib/python3.6/site-packages/connexion/utils.py", line 96, in get_function_from_name
    function = deep_getattr(module, attr_path)
  File "/home/user/.virtualenvs/my_venv/lib/python3.6/site-packages/connexion/utils.py", line 55, in deep_getattr
    return functools.reduce(getattr, attr.split('.'), obj)
AttributeError: module 'api.handlers' has no attribute 'cars'

, что, вероятно, вызвано круговой зависимостью или чем-то в этом роде, вызванным connexion_app.add_api("swagger.yaml") и связанным с ним механизмом.


Вот мой swagger.yml просто для справки.

swagger: "2.0"

info:
  description: my API
  version: "1.0.0"
  title: my API

consumes:
  - application/json
produces:
  - application/json

basePath: /api

paths:
   /cars/:
      get:
        operationId: api.handlers.cars
        responses:
          200:
            description: .
            schema:
              type: object
...