Flask-sqlalchemy with Blueprints - RuntimeError: No application found. Either work inside a view function or push an application context
Flask-sqlalchemy with Blueprints - RuntimeError: No application found. Either work inside a view function or push an application context
有很多关于此的问题,但 none 其中使用的是 Flask 蓝图。
我正在尝试使用 sqlite3 查找设置 QuerySelectField。
但是我得到错误:
RuntimeError: No application found. Either work inside a view function or push an application context.
这是我的应用程序结构:
我的init.py
from flask import Flask, render_template, current_app
from flask_mail import Mail
from flask_login import LoginManager
from flask_bootstrap import Bootstrap
from flask_ckeditor import CKEditor
from instance.config import app_config
from app.views.ticket import ticket as ticket_blueprint
from app.views.users import users as user_blueprint
from app.views.main import main as main_blueprint
from app.models import User, db
login_manager = LoginManager()
def page_not_found(e):
return render_template('404.html'), 404
def register_blueprints_on_app(app):
app.register_blueprint(user_blueprint)
app.register_blueprint(ticket_blueprint)
app.register_blueprint(main_blueprint)
def login_manager_init(app):
login_manager.login_view = 'users.login'
login_manager.init_app(app)
# associate id in the cookie with the User object
@login_manager.user_loader
def load_user(user_id):
print(user_id)
return User.query.get(user_id)
# application factory
def create_app(config):
# create application instance
app = Flask(__name__, instance_relative_config=True)
app.register_error_handler(404, page_not_found)
app.config.from_object(app_config[config])
app.config.from_pyfile('config.py')
Bootstrap(app)
mail = Mail()
mail.init_app(app)
db.init_app(app)
ckeditor = CKEditor()
ckeditor.init_app(app)
login_manager_init(app)
register_blueprints_on_app(app)
return app
这是有问题的 forms.py,它位于 ticket/views/
下
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, TextAreaField, FieldList, DateTimeField, SelectField
from wtforms_sqlalchemy.fields import QuerySelectField
from wtforms.fields.html5 import EmailField, TelField
from wtforms.validators import InputRequired, Email
from flask_ckeditor import CKEditorField
from app.models import User
def user_query():
query = User.query()
return query
class TicketForm(FlaskForm):
requested_by = QuerySelectField(label='Requested by',
query_factory=user_query(),
allow_blank=False,
get_label='fullname')
department = SelectField(label='Department')
phone = TelField(label='Phone')
email = EmailField(label='Email', validators=[Email('Enter a valid email address')])
short_desc = StringField(label='Short Description', validators=[InputRequired('Must enter a short description')])
description = CKEditorField(label='Description')
classification = StringField(label='Classification')
priority = StringField(label='Priority')
sla_respond_by = DateTimeField(label='Respond by', render_kw={'readonly': True})
sla_resolve_by = DateTimeField(label='Resolve by', render_kw={'readonly': True})
sla_status = StringField(label='SLA Status', render_kw={'readonly': True})
related_tickets = FieldList(StringField(label='Ticker #'))
client_journal = TextAreaField(label='Client Area')
work_notes = TextAreaField(label='Work Notes')
closed_at = DateTimeField(label='Closed')
closed_by = StringField(label='Closed by')
followed_by = StringField(label='Followed by')
submit = SubmitField('Save')
问题部分是在运行时
def user_query():
query = User.query()
return query
我收到错误。
这里的上下文是 ticket/view
下的路由文件
from flask import render_template
from app.views.ticket.forms import TicketForm
from flask_login import login_required
from . import ticket
@ticket.get('/ticket')
@ticket.put('/ticket')
@login_required
def ticket():
form = TicketForm()
return render_template('ticket.html', form=form)
并且在ticket/view/init.py
from flask import Blueprint
ticket = Blueprint('ticket', __name__, static_folder='static', template_folder='templates')
from . import routes
我在这里阅读了文档,但没有帮助。 https://flask-sqlalchemy.palletsprojects.com/en/2.x/contexts/
我不知道如何传递应用程序上下文,所以这个函数起作用了。
我通过在 QuerySelectfield 中不使用 query_factory 来解决这个问题。
我更改了字段声明:
class TicketForm(FlaskForm):
requested_by = QuerySelectField(label='Requested by',
query_factory=user_query(),
allow_blank=False,
get_label='full_name')
为此:
class TicketForm(FlaskForm):
requested_by = QuerySelectField(label='Requested by',
allow_blank=False,
get_label='full_name')
(所以,刚刚删除了 query_factory=user_query(),)
我删除了这个:
def user_query():
query = User.query()
return query
然后将其添加到我的蓝图中的路线中:
@ticket.get('/ticket')
@ticket.put('/ticket')
@login_required
def ticket():
form = TicketForm()
form.requested_by.query = User.query.all() # Added this
print(current_app.app_context())
return render_template('ticket.html', form=form)
我希望这对我正在努力的人有所帮助。
我仍然想知道如何使用 query_factory 以另一种方式做到这一点,因为我确信有办法。所以如果有人知道请分享!
有很多关于此的问题,但 none 其中使用的是 Flask 蓝图。
我正在尝试使用 sqlite3 查找设置 QuerySelectField。 但是我得到错误:
RuntimeError: No application found. Either work inside a view function or push an application context.
这是我的应用程序结构:
我的init.py
from flask import Flask, render_template, current_app
from flask_mail import Mail
from flask_login import LoginManager
from flask_bootstrap import Bootstrap
from flask_ckeditor import CKEditor
from instance.config import app_config
from app.views.ticket import ticket as ticket_blueprint
from app.views.users import users as user_blueprint
from app.views.main import main as main_blueprint
from app.models import User, db
login_manager = LoginManager()
def page_not_found(e):
return render_template('404.html'), 404
def register_blueprints_on_app(app):
app.register_blueprint(user_blueprint)
app.register_blueprint(ticket_blueprint)
app.register_blueprint(main_blueprint)
def login_manager_init(app):
login_manager.login_view = 'users.login'
login_manager.init_app(app)
# associate id in the cookie with the User object
@login_manager.user_loader
def load_user(user_id):
print(user_id)
return User.query.get(user_id)
# application factory
def create_app(config):
# create application instance
app = Flask(__name__, instance_relative_config=True)
app.register_error_handler(404, page_not_found)
app.config.from_object(app_config[config])
app.config.from_pyfile('config.py')
Bootstrap(app)
mail = Mail()
mail.init_app(app)
db.init_app(app)
ckeditor = CKEditor()
ckeditor.init_app(app)
login_manager_init(app)
register_blueprints_on_app(app)
return app
这是有问题的 forms.py,它位于 ticket/views/
下from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, TextAreaField, FieldList, DateTimeField, SelectField
from wtforms_sqlalchemy.fields import QuerySelectField
from wtforms.fields.html5 import EmailField, TelField
from wtforms.validators import InputRequired, Email
from flask_ckeditor import CKEditorField
from app.models import User
def user_query():
query = User.query()
return query
class TicketForm(FlaskForm):
requested_by = QuerySelectField(label='Requested by',
query_factory=user_query(),
allow_blank=False,
get_label='fullname')
department = SelectField(label='Department')
phone = TelField(label='Phone')
email = EmailField(label='Email', validators=[Email('Enter a valid email address')])
short_desc = StringField(label='Short Description', validators=[InputRequired('Must enter a short description')])
description = CKEditorField(label='Description')
classification = StringField(label='Classification')
priority = StringField(label='Priority')
sla_respond_by = DateTimeField(label='Respond by', render_kw={'readonly': True})
sla_resolve_by = DateTimeField(label='Resolve by', render_kw={'readonly': True})
sla_status = StringField(label='SLA Status', render_kw={'readonly': True})
related_tickets = FieldList(StringField(label='Ticker #'))
client_journal = TextAreaField(label='Client Area')
work_notes = TextAreaField(label='Work Notes')
closed_at = DateTimeField(label='Closed')
closed_by = StringField(label='Closed by')
followed_by = StringField(label='Followed by')
submit = SubmitField('Save')
问题部分是在运行时
def user_query():
query = User.query()
return query
我收到错误。
这里的上下文是 ticket/view
下的路由文件from flask import render_template
from app.views.ticket.forms import TicketForm
from flask_login import login_required
from . import ticket
@ticket.get('/ticket')
@ticket.put('/ticket')
@login_required
def ticket():
form = TicketForm()
return render_template('ticket.html', form=form)
并且在ticket/view/init.py
from flask import Blueprint
ticket = Blueprint('ticket', __name__, static_folder='static', template_folder='templates')
from . import routes
我在这里阅读了文档,但没有帮助。 https://flask-sqlalchemy.palletsprojects.com/en/2.x/contexts/
我不知道如何传递应用程序上下文,所以这个函数起作用了。
我通过在 QuerySelectfield 中不使用 query_factory 来解决这个问题。
我更改了字段声明:
class TicketForm(FlaskForm):
requested_by = QuerySelectField(label='Requested by',
query_factory=user_query(),
allow_blank=False,
get_label='full_name')
为此:
class TicketForm(FlaskForm):
requested_by = QuerySelectField(label='Requested by',
allow_blank=False,
get_label='full_name')
(所以,刚刚删除了 query_factory=user_query(),)
我删除了这个:
def user_query():
query = User.query()
return query
然后将其添加到我的蓝图中的路线中:
@ticket.get('/ticket')
@ticket.put('/ticket')
@login_required
def ticket():
form = TicketForm()
form.requested_by.query = User.query.all() # Added this
print(current_app.app_context())
return render_template('ticket.html', form=form)
我希望这对我正在努力的人有所帮助。 我仍然想知道如何使用 query_factory 以另一种方式做到这一点,因为我确信有办法。所以如果有人知道请分享!