2016-12-26 4 views
0

Я следую учебнику Flask, найденному здесь: http://flask.pocoo.org/docs/0.12/tutorial/. Я выполнил шаги 0-4, но не могу понять Шаг 5 (Создание базы данных); Я прочитал и добавил Релевент функции моего flaskr.py сценария, так что она в настоящее время выглядит следующим образом:Python Flask: невозможно инициализировать базу данных 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'? Сделайте это в своем виртуальном (конечно). – skytreader

+0

@skytreader: 'пип дает шоу Flask':' Имя: Колба Версия: 0,12 Резюме: микрокаркас на основе Werkzeug, Jinja2 и добрые намерения Home-страница: http://github.com/pallets/flask/ Автор: Armin Ronacher Автор-email: [email protected] Лицензия: 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(): 
    ... 

Обратите внимание, что нет никаких аргументов декоратор и что функция была переименована, чтобы соответствовать которую вы вызываете в командной строке.

Беглый взгляд на флягу и щелчок в документах не показывают, что вы можете передать строку декоратору и вызывать ее как помеченную.

+0

Я попытался ваши предложения, но та же ошибка возникает при запуске приложения с 'flask initdb':' Usage: flask [OPTIONS] COMMAND [ARGS] ... Ошибка: нет такой команды «initdb». 'У вас есть другие предложения? –

+0

Больше догадок. Сохраняя изменения, внесенные моим ответом, вы экспортируете переменные среды 'FLASK_APP' и' FLASK_DEBUG' перед запуском 'flask initdb'? [См. Здесь] (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 
Смежные вопросы