Flask中的引用和URL规则

时间:2015-03-30 19:03:15

标签: python flask flask-sqlalchemy

我的Flask中的简单应用程序出了问题。我想编写一个注册页面,通过SQLAlchemy与datebase连接。我有 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规则,现在我想在注册视图中使用 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'))

在这种情况下,我收到错误,因为我有“绑定”引用,在 app 文件中是:

from register import Register

注册文件

from app import db

所以,显然无法正常工作,我的解决方案是在注册文件中添加网址规则。但我不知道怎么做。你能帮助我吗?

对不起我令人困惑的头衔,但我刚刚开始使用Flask,我不知道如何命名。

1 个答案:

答案 0 :(得分:1)

您需要在期望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创建模块,与主脚本分开。

使用单独的服务脚本,例如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']
#              ^                                 ^