Я изучаю Flask, следуя мега-учебному пособию Мигеля Гинсберга, глава 4. Когда я запускаю любую команду Flask из панели команд Anaconda, я получаю сообщение об ошибке, в котором указано: «Не заданы ни SQLALCHEMY_DATABASE_URI, ни SQLALCHEMY_BINDS». и в результате база данных SQLite создается в памяти.
Но я создал объект Config, который устанавливает SQLALCHEMY_DATABASE_URI, SECRET_KEY и SQLALCHEMY_TRACK_MODIFICATIONS, и протестировал питон отдельно, и все это работает.
Я перепробовал все, что мог придумать, включая отдельное тестирование фрагментов кода, не менее 8 часов поиска в Интернете и просмотр сообщений Гинзберга - ничего не работает. Один человек, Грэм (пост № 29), похоже, имел ту же проблему, но Гинзберг не дает полезного ответа.
Вот код инициализации моего приложения
__init__
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from config import Config
app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)
migrate = Migrate(app, db)
from app import routes, models
Вот мой конфиг, он работает при отдельном запуске.
import os
basedir = os.path.abspath(os.path.dirname(__file__))
class Config(object):
SECRET_KEY = os.environ.get('SECRET_KEY') or 'you-will-never-guess'
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
'sqlite:///' + os.path.join(basedir, 'app.db')
SQLALCHEMY_TRACK_MODIFICATIONS = False
Для полноты вот мои маршруты и модели
from flask import render_template, flash, redirect, url_for
from app import app
from app.forms import LoginForm
@app.route('/')
@app.route('/index')
def index():
user = {'username': 'Miguel'}
posts = [
{
'author': {'username': 'John'},
'body': 'Beautiful day in Portland!'
},
{
'author': {'username': 'Susan'},
'body': 'The Avengers movie was so cool!'
}
]
return render_template('index.html', title='Home', user=user, posts=posts)
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
flash('Login requested for user {}, remember_me={}'.format(
form.username.data, form.remember_me.data))
return redirect(url_for('index'))
return render_template('login.html', title='Sign In', form=form)
и
from datetime import datetime
from app import db
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), index=True, unique=True)
email = db.Column(db.String(120), index=True, unique=True)
password_hash = db.Column(db.String(128))
posts = db.relationship('Post', backref='author', lazy='dynamic')
def __repr__(self):
return '<User {}>'.format(self.username)
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
body = db.Column(db.String(140))
timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
def __repr__(self):
return '<Post {}>'.format(self.body)
Что должно произойти, это когда я запускаю команду типа
> flask db init
или
> flask db migrate -m "users table"
команда должна успешно завершиться, потому что SQLALCHEMY_DATABASE_URI должен равняться пути приложения, а база данных SQLite должна быть app.db.
Вместо этого я получаю сообщения об ошибках, в которых говорится, что SQLALCHEMY_DATABASE_URI не установлен, и поэтому для SQLALCHEMY_DATABASE_URI установлено значение "sqlite: ///: memory:" *
Моему приложению нужна постоянная база данных! Почему не установлены SQLALCHEMY_DATABASE_URI и SQLALCHEMY_TRACK_MODIFICATIONS?