Flask Tutorial 4

wody·2019년 11월 26일
0
post-thumbnail

https://flask.palletsprojects.com/en/1.1.x/

Define and Access the Database

애플리케이션은 SQLite 데이터베이스를 사용하여 사용자 및 게시물을 저장합니다. 파이썬은 sqlite3 모듈 에서 SQLite를 기본적으로 지원 합니다.

SQLite는 별도의 데이터베이스 서버를 설정할 필요가 없으며 Python에 내장되어있어 편리합니다. 그러나 동시 요청이 동시에 데이터베이스에 쓰려고하면 각 쓰기가 순차적으로 수행 될 때 속도가 느려집니다. 작은 응용 프로그램에서는이를 알 수 없습니다. 커지면 다른 데이터베이스로 전환 할 수 있습니다.

Connect to the Database

SQLite 데이터베이스 (및 대부분의 다른 Python 데이터베이스 라이브러리)로 작업 할 때 가장 먼저해야 할 일은 데이터베이스에 대한 연결을 만드는 것입니다. 모든 쿼리 및 작업은 연결을 사용하여 수행되며 작업이 완료된 후 닫힙니다.
웹 애플리케이션에서이 연결은 일반적으로 요청에 연결됩니다. 요청을 처리 할 때 생성되며 응답이 전송되기 전에 닫힙니다.
flaskr/db.py

import sqlite3

import click
from flask import current_app, g
from flask.cli import with_appcontext


def get_db():
    if 'db' not in g:
        g.db = sqlite3.connect(
            current_app.config['DATABASE'],
            detect_types=sqlite3.PARSE_DECLTYPES
        )
        g.db.row_factory = sqlite3.Row

    return g.db


def close_db(e=None):
    db = g.pop('db', None)

    if db is not None:
        db.close()
  • g : 각 요청마다 고유 한 특수 객체입니다. 요청하는 동안 여러 기능으로 액세스 할 수있는 데이터를 저장하는 데 사용됩니다. get_db동일한 요청에서 두 번째로 호출되는 경우 새 연결을 작성하는 대신 연결이 저장되고 재사용됩니다.
  • current_app : 요청을 처리하는 Flask 응용 프로그램을 가리키는 또 다른 특수 객체입니다. 응용 프로그램 팩토리를 사용 했으므로 나머지 코드를 작성할 때 응용 프로그램 객체가 없습니다. get_db응용 프로그램이 만들어지고 요청을 처리 할 때 호출되므로 current_app사용할 수 있습니다.
  • sqlite3.connect() : DATABASE구성 키가 가리키는 파일에 대한 연결을 설정합니다. 이 파일은 아직 존재하지 않아도되며 나중에 데이터베이스를 초기화 할 때까지는 없습니다.
  • sqlite3.Rowdicts : dict처럼 동작하는 행을 반환하도록 연결에 지시합니다. 이름으로 열에 액세스 할 수 있습니다.

Create the Tables

SQLite에서 데이터는 테이블 과 열에 저장됩니다. 데이터를 저장하고 검색하려면 먼저 테이블을 작성해야합니다. Flaskr은 user테이블에 사용자를 저장하고 테이블에 게시물을 게시 post합니다. 빈 테이블을 작성하는 데 필요한 SQL 명령으로 파일을 작성하십시오.

flaskr/schema.sql

DROP TABLE IF EXISTS user;
DROP TABLE IF EXISTS post;

CREATE TABLE user (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  username TEXT UNIQUE NOT NULL,
  password TEXT NOT NULL
);

CREATE TABLE post (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  author_id INTEGER NOT NULL,
  created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  title TEXT NOT NULL,
  body TEXT NOT NULL,
  FOREIGN KEY (author_id) REFERENCES user (id)
);

이 SQL 명령을 실행할 Python 함수를 db.py파일에 추가하십시오.
flaskr/db.py

def init_db():
    db = get_db()

    with current_app.open_resource('schema.sql') as f:
        db.executescript(f.read().decode('utf8'))


@click.command('init-db')
@with_appcontext
def init_db_command():
    """Clear the existing data and create new tables."""
    init_db()
    click.echo('Initialized the database.')
  • open_resource() : flaskr패키지와 관련된 파일을 엽니다. 이는 나중에 응용 프로그램을 배포 할 때 해당 위치가 어디에 있는지 알 필요가 없기 때문에 유용합니다. get_db 파일에서 읽은 명령을 실행하는 데 사용되는 데이터베이스 연결을 반환합니다.
  • click.command() : 함수 init-db 를 호출 init_db하고 사용자에게 성공 메시지를 표시 하는 명령 줄 명령을 정의합니다 . 명령 행 인터페이스 를 읽고 명령 작성에 대해 자세히 알아볼 수 있습니다.

Register with the Application

close_dbinit_db_command기능은 응용 프로그램 인스턴스에 등록해야합니다. 그렇지 않으면 응용 프로그램에서 사용되지 않습니다. 그러나 팩토리 함수(flaskr/__init__.py)를 사용하고 있으므로 함수를 작성할 때 해당 인스턴스를 사용할 수 없습니다. 대신 응용 프로그램을 작성하고 등록을 수행하는 함수를 작성하십시오.

flaskr/db.py

def init_app(app):
    app.teardown_appcontext(close_db)
    app.cli.add_command(init_db_command)
  • app.teardown_appcontext() : 응답을 반환 한 후 정리할 때 Flask에 해당 함수를 호출하도록 지시합니다.
  • app.cli.add_command() : 명령으로 호출 할 수있는 새 명령을 추가합니다 flask.

flaskr/__init__.py

def create_app():
    app = ...
    # existing code omitted

    from . import db
    db.init_app(app)

    return app

Initialize the Database File

이제 init-db앱에 등록되었으므로 이전 페이지 flask의 run명령 과 비슷한 명령을 사용하여 호출 할 수 있습니다.

$ flask init-db
Initialized the database.

0개의 댓글