Как избежать циклической зависимости, используя flask чертежи для файлов с несколькими представлениями - PullRequest
0 голосов
/ 06 марта 2020

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

myapp/
    __init__.py
    admin/
        __init__.py
        views1.py
        views2.py
        views3.py
        views4.py
        static/
        templates/
    models/
        models.py

myapp / init .py

from flask import Flask
from myapp.admin import admin_bp

app = Flask(__name__)
app.register_blueprint(admin_bp)

myapp / admin / __ init__.py

from flask import Blueprint, g
from flask_login import current_user

admin_bp = Blueprint('admin', __name__, template_folder='templates')

@admin_bp.before_request
def load_logged_in_user():
    if current_user and not current_user.is_anonymous:
        user_name = current_user.user_name
        g.user = Account.get(user_name)

from . import views1, views2, views3, views4

myapp / admin / view1.py

from . import admin_bp

@admin_bp.route('/hello', methods=['GET'])
def hello():
    return 'Hello'

Это работает без каких-либо определенных c ошибок. Но эти файлы представления и файл admin / __ init__.py импортируют друг друга (круговая зависимость), чего следует избегать. Как структурировать мое приложение, используя чертежи без круговой зависимости?

1 Ответ

1 голос
/ 06 марта 2020

Я думаю, что лучше использовать отдельные чертежи для каждого представления.

В противном случае, чтобы избежать циклических зависимостей, вы можете использовать метод add_url_rule () . Таким образом, у вас будут следующие файлы:

myapp / admin / __ init __. Py

from flask import Blueprint, g, session, abort, request
from flask_login import current_user

admin_bp = Blueprint('admin', __name__, template_folder='templates')

@admin_bp.before_request
def load_logged_in_user():
    if current_user and not current_user.is_anonymous:
        user_name = current_user.user_name
        g.user = Account.get(user_name)

from . import views1, views2
bp.add_url_rule('/hello', view_func=views1.hello)
bp.add_url_rule('/hello2', view_func=views2.hello2)

myapp / admin / view1.py

def hello():
    return 'Hello'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...