2016-12-26 84 views
0

我在这里找到烧瓶教程:http://flask.pocoo.org/docs/0.12/tutorial/。我已经按照步骤0-4的步骤操作,但无法理解步骤5(创建数据库);我已阅读并增加了培训相关功能,以我的flaskr.py脚本,所以它目前看起来是这样的:Python烧瓶:无法初始化SQLite数据库

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

app = Flask(__name__) # create the application instance :) 
app.config.from_object(__name__) # load config from this file , flaskr.py 

# Load default config and override config from an environment variable 
app.config.update(dict(
    DATABASE=os.path.join(app.root_path, 'flaskr.db'), 
    SECRET_KEY='development key', 
    USERNAME='admin', 
    PASSWORD='default' 
)) 
app.config.from_envvar('FLASKR_SETTINGS', silent=True) 

def connect_db(): 
    """Connects to the specific database.""" 
    rv = sqlite3.connect(app.config['DATABASE']) 
    rv.row_factory = sqlite3.Row 
    return rv 

def get_db(): 
    """Opens a new database connection if there is none yet for the 
    current application context. 
    """ 
    if not hasattr(g, 'sqlite_db'): 
     g.sqlite_db = connect_db() 
    return g.sqlite_db 

@app.teardown_appcontext 
def close_db(error): 
    """Closes the database again at the end of the request.""" 
    if hasattr(g, 'sqlite_db'): 
     g.sqlite_db.close() 

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

@app.cli.command('initdb') 
def initdb_command(): 
    """Initializes the database.""" 
    init_db() 
    print('Initialized the database.') 

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

本教程接着说,该数据库可以通过调用初始化:

flask initdb 

运行此命令产量:

Usage: flask [OPTIONS] COMMAND [ARGS]... 

Error: No such command "initdb". 

从迄今为止以下的教程中,我没有在我的应用程序目录中flask脚本。我还做了一些研究,发现这个资源:http://flask.pocoo.org/docs/0.12/cli/,其中指出这个烧瓶脚本带有虚拟环境,但是我的虚拟环境没有这个文件。我已通过导航到我的根目录并使用以下方法进行验证:

find . -name flask 
find . -name flask.py 

但是,这些命令都不会返回任何匹配。由于我对Flask比较新,所以我可能会在这里错过一些简单的东西;有人可以解释我缺少的东西并提供解决方法吗?提前致谢!

+0

只是可以肯定,你可以在你的问题包括'画中画显示Flask'输出?在你的virtualenv(当然)中做。 – skytreader

+0

@skytreader:'pip show烧瓶'产量:'名称:烧瓶 版本:0.12 摘要:基于Werkzeug,Jinja2和好心的微框架 主页:http://github.com/pallets/flask/ 作者:Armin Ronacher 作者-email:[email protected]。com 许可证:BSD 位置:/home/neil/Desktop/flaskr/lib/python2.7/site-packages 需要:itsdangerous,click,Werkzeug,Jinja2' –

回答

1

纯粹的教育猜测在这里。但在你的代码已经证明你具备以下条件:

@app.cli.command('initdb') 
def initdb_command(): 
    """Initializes the database.""" 
    init_db() 
    print('Initialized the database.') 

我认为这应该是

@app.cli.command() 
def initdb(): 
    ... 

注意,没有参数的装饰和功能更名为匹配您在命令行中调用的命令。

粗略浏览Flask并单击文档不会显示您可以将字符串传递给装饰器并将其作为标记调用。

+0

我试过你的建议,但同样的错误发生当使用'flask initdb'运行应用程序时:'用法:flask [OPTIONS] COMMAND [ARGS] ... 错误:没有这样的命令“initdb”。 '你有其他建议吗? –

+0

更多猜测。保持我的答案中引入的更改,是否在运行'flask initdb'之前导出环境变量'FLASK_APP'和'FLASK_DEBUG'? [见这里](http://flask.pocoo.org/docs/0.12/tutorial/packaging/#tutorial-packaging) – skytreader

0

试试这个:

python -m flask initdb

另一件事来检查,如果你要通过教程:你__init__.py文件在正确的位置?它应该在第二级flaskr目录中,而不是在顶层目录中。

1

我在完成本教程时遇到了同样的错误。我发现我已经打开了一个新的终端窗口来处理为什么服务器在另一台服务器上运行。我固定通过再次运行导出命令的问题:

export FLASK_APP=flaskr 

然后:

flask initdb