ошибка импорта при импорте функции из другого файла - PullRequest
0 голосов
/ 06 марта 2020

У меня проблема при импорте функции из файла, и именно в этом файле я получаю ошибку, если я импортирую ту же функцию в другие файлы, она работает, потому что я уже использую ее в других файлах.

--dev_ma
  -__init__.py
  -roles.py
  -user.py
  -audit.py
  -active_directory.py

Проблема в том, что я на audit.py, если я делаю: from dev_maintenance.roles import check_if_user_has_permissions Я получаю ошибку:

Traceback (most recent call last):
  File "/Users/pjose/Project/dev_maintenance/backend/dev_maintenance/__init__.py", line 21, in <module>
    import dev_maintenance.active_directory
  File "/Users/pjose/Project/dev_maintenance/backend/dev_maintenance/active_directory.py", line 6, in <module>
    from dev_maintenance.audit import audit_action
  File "/Users/pjose/Project/dev_maintenance/backend/dev_maintenance/audit.py", line 5, in <module>
    from dev_maintenance.roles import check_if_user_has_permissions
  File "/Users/pjose/Project/dev_maintenance/backend/dev_maintenance/roles.py", line 6, in <module>
    from dev_maintenance.audit import audit_action
ImportError: cannot import name 'audit_action' from 'dev_maintenance.audit' (/Users/pjose/Project/dev_maintenance/backend/dev_maintenance/audit.py)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/pjose/Project/venv/lib/python3.7/site-packages/flask/cli.py", line 325, in __call__
    self._flush_bg_loading_exception()
  File "/Users/pjose/Project/venv/lib/python3.7/site-packages/flask/cli.py", line 313, in _flush_bg_loading_exception
    reraise(*exc_info)
  File "/Users/pjose/Project/venv/lib/python3.7/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/Users/pjose/Project/venv/lib/python3.7/site-packages/flask/cli.py", line 302, in _load_app
    self._load_unlocked()
  File "/Users/pjose/Project/venv/lib/python3.7/site-packages/flask/cli.py", line 317, in _load_unlocked
    self._app = rv = self.loader()
  File "/Users/pjose/Project/venv/lib/python3.7/site-packages/flask/cli.py", line 372, in load_app
    app = locate_app(self, import_name, name)
  File "/Users/pjose/Project/venv/lib/python3.7/site-packages/flask/cli.py", line 242, in locate_app
    '\n\n{tb}'.format(name=module_name, tb=traceback.format_exc())
flask.cli.NoAppException: While importing "dev_maintenance", an ImportError was raised:

Traceback (most recent call last):
  File "/Users/pjose/Project/venv/lib/python3.7/site-packages/flask/cli.py", line 235, in locate_app
    __import__(module_name)
  File "/Users/pjose/Project/dev_maintenance/backend/dev_maintenance/__init__.py", line 21, in <module>
    import dev_maintenance.active_directory
  File "/Users/pjose/Project/dev_maintenance/backend/dev_maintenance/active_directory.py", line 6, in <module>
    from dev_maintenance.audit import audit_action
  File "/Users/pjose/Project/dev_maintenance/backend/dev_maintenance/audit.py", line 5, in <module>
    from dev_maintenance.roles import check_if_user_has_permissions
  File "/Users/pjose/Project/dev_maintenance/backend/dev_maintenance/roles.py", line 6, in <module>
    from dev_maintenance.audit import audit_action
ImportError: cannot import name 'audit_action' from 'dev_maintenance.audit' (/Users/pjose/Project/dev_maintenance/backend/dev_maintenance/audit.py)

Это мой файл инициализации:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_cors import CORS
from flasgger import Swagger
from flask_caching import Cache




app = Flask(__name__)
app.debug = True
app.config.from_object('dev_maintenance.yaml_config_loader')
cache = Cache(app)
db = SQLAlchemy(app)
cors = CORS(app, resources={r"/*": {"origins": "*"}})
swagger = Swagger(app)


import dev_maintenance.mesos_callback
import dev_maintenance.db_model
import dev_maintenance.active_directory
import dev_maintenance.user_list
import dev_maintenance.audit
import dev_maintenance.machines
import dev_maintenance.yaml_config_loader
import dev_maintenance.roles
import dev_maintenance.user_details





if __name__ == '__main__':
    app.run(debug=True)

Это мой файл аудита:

from dev_maintenance import app, db
import json
from flask_jwt_extended import jwt_required
from dev_maintenance.db_model import ActionLog
from dev_maintenance.roles import check_if_user_has_permissions

def audit_action(user, action_type, action_parameters):
    req = ActionLog(
        user=user,
        action_type=action_type,
        action_parameters=action_parameters
    )
    db.session.add(req)
    db.session.commit()


@app.route("/api/audit", methods=["GET"])
@jwt_required
def get_audit_log():

    data = []
    for run in db.session.query(ActionLog).order_by(ActionLog.date.desc()).limit(100):
        run_tmp = {}
        run_tmp["date"] = str(run.date)
        run_tmp["user"] = run.user
        run_tmp["action_type"] = run.action_type
        run_tmp["action_parameters"] = run.action_parameters
        data.append(run_tmp)
    response = app.response_class(
        response=json.dumps(data), status=200, mimetype="application/json"
    )
    return response

Я не могу понять, почему это происходит, и дело не только в этой функции, другие функции из других файлов также вызывают ошибку в audit.py .

1 Ответ

0 голосов
/ 10 марта 2020

Через некоторое время поиска я обнаружил проблему, она называется круговой зависимостью.

В основном мне нужно сделать импорт внутри моей функции:

@app.route("/api/audit", methods=["GET"])
@jwt_required
def get_audit_log():

    from dev_maintenance.roles import check_if_user_has_permissions

    data = []
    user = get_jwt_identity()
    permission = check_if_user_has_permissions(user=user, resource="audit", action="GET_INFO")
    for run in db.session.query(ActionLog).order_by(ActionLog.date.desc()).limit(100):
        run_tmp = {}
        run_tmp["date"] = str(run.date)
        run_tmp["user"] = run.user
        run_tmp["action_type"] = run.action_type
        run_tmp["action_parameters"] = run.action_parameters
        data.append(run_tmp)
    if permission:
        response = app.response_class(
            response=json.dumps(data), status=200, mimetype="application/json"
        )
        return response
    else:
        response = jsonify("No Permission")
        return response, 401
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...