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']
#              ^                                 ^