Flask 中的引用和 URL 规则
References and URL rules in Flask
我在 Flask 中的简单应用程序出现问题。我想写一个注册页面,通过 SQLAlchemy 连接到数据库。我有 app.py 文件,如下所示:
import flask
import settings
import os
from flask_sqlalchemy import SQLAlchemy
# Views
from main import Main
from login import Login
from remote import Remote
from register import Register
#from models import User
#from models import Task
app = flask.Flask(__name__)
app.config['SESSION_TYPE'] = 'filesystem'
app.secret_key = os.urandom(24)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////database.db'
db = SQLAlchemy(app)
# Routes
app.add_url_rule('/',
view_func=Main.as_view('main'),
methods=["GET"])
app.add_url_rule('/<page>/',
view_func=Main.as_view('page'),
methods=["GET"])
app.add_url_rule('/login/',
view_func=Login.as_view('login'),
methods=["GET", "POST"])
app.add_url_rule('/remote/',
view_func=Remote.as_view('remote'),
methods=['GET', 'POST'])
app.add_url_rule('/register/',
view_func=Register.as_view('register'),
methods=['GET', 'POST'])
@app.errorhandler(404)
def page_not_found(error):
return flask.render_template('404.html'), 404
app.debug = True
app.run()
因此,如您所见,我在此文件中有 URL 规则,现在我想在 Register[=33] 中使用 db 变量=] 查看,所以我需要在那里导入它,我的这个文件的代码如下所示:
import flask, flask.views
from app import db
class Register(flask.views.MethodView):
def get(self):
return flask.render_template('register.html')
def post(self):
new_user = User(username = request.form['username'],
password = request.form['passwd']
db.session.add(new_user)
db.session.commit()
return flask.redirect(flask.url_for('index'))
在那种情况下我得到错误,因为我有 "tied" 引用,在 app 文件中是:
from register import Register
但在注册文件中是
from app import db
所以它,显然是行不通的,我的解决方案是在注册文件中添加URL规则。但我不知道怎么办。有人能帮帮我吗?
对不起,我的标题令人困惑,但我刚刚开始使用 Flask,我不知道如何命名它。
您需要将 db
分配移动到 之前 期望 db
存在的导入:
import flask
import settings
import os
from flask_sqlalchemy import SQLAlchemy
app = flask.Flask(__name__)
app.config['SESSION_TYPE'] = 'filesystem'
app.secret_key = os.urandom(24)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////database.db'
db = SQLAlchemy(app)
# Views
# These can now use
# from app import db
# because that line has executed above
from main import Main
from login import Login
from remote import Remote
from register import Register
#from models import User
#from models import Task
现在,当您导入 register
模块并运行 from app import db
行时,db
变量实际上存在于 app
模块中。
请注意,您现在不能使用 app.py
作为 主脚本;如果你使用 python app.py
那么它将被导入为 __main__
模块而不是 app
模块,并且使用 from app import db
将创建一个 new 模块,与主脚本分开。
要么使用单独的服务脚本,例如 serve.py
,然后将您的 app.run()
调用移动到该文件中:
from app import app
app.debug = True
app.run()
或使用from __main__ import db
.
您的 register
模块中还缺少结尾 )
:
new_user = User(username = request.form['username'],
password = request.form['passwd']
# ^ ^
我在 Flask 中的简单应用程序出现问题。我想写一个注册页面,通过 SQLAlchemy 连接到数据库。我有 app.py 文件,如下所示:
import flask
import settings
import os
from flask_sqlalchemy import SQLAlchemy
# Views
from main import Main
from login import Login
from remote import Remote
from register import Register
#from models import User
#from models import Task
app = flask.Flask(__name__)
app.config['SESSION_TYPE'] = 'filesystem'
app.secret_key = os.urandom(24)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////database.db'
db = SQLAlchemy(app)
# Routes
app.add_url_rule('/',
view_func=Main.as_view('main'),
methods=["GET"])
app.add_url_rule('/<page>/',
view_func=Main.as_view('page'),
methods=["GET"])
app.add_url_rule('/login/',
view_func=Login.as_view('login'),
methods=["GET", "POST"])
app.add_url_rule('/remote/',
view_func=Remote.as_view('remote'),
methods=['GET', 'POST'])
app.add_url_rule('/register/',
view_func=Register.as_view('register'),
methods=['GET', 'POST'])
@app.errorhandler(404)
def page_not_found(error):
return flask.render_template('404.html'), 404
app.debug = True
app.run()
因此,如您所见,我在此文件中有 URL 规则,现在我想在 Register[=33] 中使用 db 变量=] 查看,所以我需要在那里导入它,我的这个文件的代码如下所示:
import flask, flask.views
from app import db
class Register(flask.views.MethodView):
def get(self):
return flask.render_template('register.html')
def post(self):
new_user = User(username = request.form['username'],
password = request.form['passwd']
db.session.add(new_user)
db.session.commit()
return flask.redirect(flask.url_for('index'))
在那种情况下我得到错误,因为我有 "tied" 引用,在 app 文件中是:
from register import Register
但在注册文件中是
from app import db
所以它,显然是行不通的,我的解决方案是在注册文件中添加URL规则。但我不知道怎么办。有人能帮帮我吗?
对不起,我的标题令人困惑,但我刚刚开始使用 Flask,我不知道如何命名它。
您需要将 db
分配移动到 之前 期望 db
存在的导入:
import flask
import settings
import os
from flask_sqlalchemy import SQLAlchemy
app = flask.Flask(__name__)
app.config['SESSION_TYPE'] = 'filesystem'
app.secret_key = os.urandom(24)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////database.db'
db = SQLAlchemy(app)
# Views
# These can now use
# from app import db
# because that line has executed above
from main import Main
from login import Login
from remote import Remote
from register import Register
#from models import User
#from models import Task
现在,当您导入 register
模块并运行 from app import db
行时,db
变量实际上存在于 app
模块中。
请注意,您现在不能使用 app.py
作为 主脚本;如果你使用 python app.py
那么它将被导入为 __main__
模块而不是 app
模块,并且使用 from app import db
将创建一个 new 模块,与主脚本分开。
要么使用单独的服务脚本,例如 serve.py
,然后将您的 app.run()
调用移动到该文件中:
from app import app
app.debug = True
app.run()
或使用from __main__ import db
.
您的 register
模块中还缺少结尾 )
:
new_user = User(username = request.form['username'],
password = request.form['passwd']
# ^ ^