Flask Blueprint возвращает NameError при попытке зарегистрировать план приложения в файле __init__ - PullRequest
0 голосов
/ 08 марта 2019

Я получаю NameError: name 'i_statement_bp' is not defined при попытке зарегистрировать проект с именем i_statement_bp в приложении в ABC / app / __init__.py. У меня есть Flask app с Blueprints со следующей структурой:

ABC/
 |- run.py
 |- app/
     |--__init__.py
     |
     |--i_statement/
     |        |--__init__.py
     |        |
     |        |--templates/
     |        |        |--i_statement.html
     |        |
     |        |--i_statement.py
     |       
     |--blog/
     |
     |--static/
            |
            |--images/
            |--css/
            |--js/
            |--fonts/

Мой ABC/app/__init__.py выглядит следующим образом:

import flask from Flask, Blueprint

class MyApp(Flask):
 def __init__(self):
    Flask.__init__(self, __name__)  
    self.jinja_loader=jinja2.ChoiceLoader([self.jinja_loader,
    jinja2.PrefixLoader({}, delimiter = ".")])

    def create_global_jinja_loader(self):
        return self.jinja_loader

    def register_blueprint(self, bp):
        Flask.register_blueprint(self, bp)
        self.jinja_loader.loaders[1].mapping[bp.name] = bp.jinja_loader

app=MyApp()

app.register_blueprint(i_statement_bp) **<== this line of code is causing error per debugger** 

from app.i_statement import i_statement_bp

__init__.py файл в папке `i_statement 'пуст, просто чтобы указать, что это пакет для Python.

Файл с именем i_statement.py выглядит следующим образом:

from flask import Blueprint, request, jsonify, session

i_statement_bp=Blueprint('i_statement_bp',__name__,
url_prefix='/i_statement',template_folder="templates")

@i_statement_bp.route('/i_statement',methods=['GET','POST'])
  def i_statement():
     some logic here
     return render_template('i_statement.html',variable=variable)

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

Файл ABC/run.py выглядит следующим образом:

from app import app

app.secret_key=flask_secret_key

app.run(debug=debug)

Обновление: В соответствии с предложением в комментариях я изменил строки в ABC/app/__init__.py следующим образом:

from app.i_statement import i_statement_bp
app.register_blueprint(i_statement_bp) 

Эта схема выдает новый тип ошибки:

from app import app
File "C:\ABC\app\__init__.py", line 55, in <module>
from app.i_statement import i_statement_bp
ImportError: cannot import name 'i_statement_bp' from 'app.i_statement'

Ответы [ 2 ]

1 голос
/ 08 марта 2019

Похоже, from app.i_statement import i_statement_bp импортируется после app.register_blueprint(i_statement_bp). Попробуйте изменить порядок этих утверждений.

Обновление:

Попробуйте вместо from app.i_statement.i_statement import i_statement_bp указать вторую ошибку. Обратите внимание, что у вас есть папка i_statement, а затем файл i_statement.py, поэтому вам нужно две из них.

0 голосов
/ 08 марта 2019

Вы неправильно импортируете переменную экземпляра bluprint.

Должно быть:

from app.i_statement.i_statement import i_statement_bp

Вы также можете импортировать относительный путь к вашему подпакету, так как он является подпакетом вас app.

from .i_statement.i_statement import i_statement_bp

затем зарегистрируйте импортированный bluprint в экземпляре вашего приложения.

Помните: Python - интерпретируемый язык, так как он работает вниз, переменная, используемая до назначения, никогда не будет известна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...