我的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,我不知道如何命名。
答案 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']
# ^ ^