Flask教程:KeyError:' DATABASE'

时间:2015-12-23 21:00:08

标签: python flask keyerror

我已经搜索过并尝试了解决这个问题的每个解决方案,我发现我仍然遇到了在烧瓶教程中创建数据库的问题:

http://flask.pocoo.org/docs/0.10/tutorial/dbinit/#tutorial-dbinit

之前的stackoverflow回答了这个问题,主要围绕更改DATABASE中的路径= ...或者将实际的flaskr.db文件添加到项目文件中(尽管我认为sqlite3应该自动生成它)

我使用的是Cloud9 - 它运行在ubuntu上 - 所以原来的/tmp/flaskr.db路径应该可行,但事实并非如此。

我的项目内容是:

/Flaskr
  /static
  /templates
  flaskr.db 
  flaskr.py
  schema.sql

flaskr.py的内容:

# all the imports
import sqlite3
from contextlib import closing
from flask import Flask, request, session, g, redirect, url_for, \
 abort, render_template, flash

app = Flask(__name__)
app.config.from_envvar('FLASKR_SETTINGS', silent=True)

DATABASE = '/tmp/flaskr.db'
DEBUG = True
SECRET_KEY = 'development key'
USERNAME = 'admin'
PASSWORD = 'default'

def connect_db():
    return sqlite3.connect(app.config['DATABASE'])

def init_db():
    with closing(connect_db()) as db:
        with app.open_resource('schema.sql', mode='r') as f:
            db.cursor().executescript(f.read())
        db.commit()



if __name__ == '__main__':
    app.run()

对于DATABASE ='' ,我也试过进入直接路径:

DATABASE = '/home/ubuntu/workspace/flaskr/flaskr.db'

和(是的,我意识到这些是相同的事情)

DATABASE = '/flaskr/flaskr.db'

我还要注意,flaskr项目下的flaskr.db文件最初并不存在 - 但我在进行故障排除时添加了,看看我是否可以提供它的直接路径。

我得到的错误是:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "flaskr.py", line 28, in init_db
    with closing(connect_db()) as db:
  File "flaskr.py", line 25, in connect_db
    return sqlite3.connect(app.config['DATABASE'])
KeyError: 'DATABASE'

同样,我在Unix操作系统上运行Cloud9

2 个答案:

答案 0 :(得分:2)

问题是Flask.config.from_envvar找不到您的设置,因为您在flaskr.py中有这些设置。

您可以使用Flask教程中给出的from_object配置方法,如下所示:

app.config.from_object(__name__)

会找到给定的大写变量名。或者,如果您想继续使用from_envvar配置,这是可取的,因为它使您的数据库凭据不受版本控制,Foreach Loop

制作一个名为settings.cfg的新文件:

DATABASE = '/tmp/flaskr.db'
DEBUG = True
SECRET_KEY = 'development key'
USERNAME = 'admin'
PASSWORD = 'default'

flaskr.py中移除这些行。然后开始你的应用程序:

$ export FLASKR_SETTINGS=/path/to/settings.cfg
$ python flaskr.py
 * Running on http://127.0.0.1:5000/
 * Restarting with reloader...

答案 1 :(得分:0)

您在此处设置变量:

DATABASE = '/tmp/flaskr.db'

...然后你试图从不同的地方阅读它:

sqlite3.connect(app.config['DATABASE'])

你可以简单地说:

sqlite3.connect(DATABASE)

或:

sqlite3.connect('/tmp/flaskr.db')