diff options
| author | Mitsuo Tokumori <[email protected]> | 2023-10-27 18:34:05 -0500 |
|---|---|---|
| committer | Mitsuo Tokumori <[email protected]> | 2023-10-27 18:34:05 -0500 |
| commit | 3d8f5d82738f27cdde78ba4bd0b07535c234f6db (patch) | |
| tree | a6384686a0abab98480f030c063f5f60b5797618 | |
| parent | 7c0d3e015f2fc1fe0ebdfca819d98d2a5abd8223 (diff) | |
| download | ustayml-3d8f5d82738f27cdde78ba4bd0b07535c234f6db.tar.gz ustayml-3d8f5d82738f27cdde78ba4bd0b07535c234f6db.tar.bz2 ustayml-3d8f5d82738f27cdde78ba4bd0b07535c234f6db.zip | |
Add sqlite3 connection
| -rw-r--r-- | README.md | 16 | ||||
| -rw-r--r-- | flaskr/__init__.py | 38 | ||||
| -rw-r--r-- | flaskr/db.py | 45 | ||||
| -rw-r--r-- | flaskr/schema.sql | 17 |
4 files changed, 116 insertions, 0 deletions
@@ -1,5 +1,7 @@ # flask-tutorial +https://flask.palletsprojects.com/en/3.0.x/tutorial + ## Installation ```bash @@ -9,3 +11,17 @@ source .venv/bin/activate pip install -r requirements.txt flask --app flaskr run --debug ``` + +## Learning resources + +* https://flask.palletsprojects.com/en/3.0.x/#user-s-guide +* https://sqlite.org/lang.html + +Concepts: + +* flask.g: Store data. Unique for each request +* flask.current_app: Link to Flask app +* flask.open_resource: From app package path +* request: HTML request??? +* Factory function > registered functions and blueprints. +* Blueprint > views & other code
\ No newline at end of file diff --git a/flaskr/__init__.py b/flaskr/__init__.py new file mode 100644 index 0000000..19d5a1e --- /dev/null +++ b/flaskr/__init__.py @@ -0,0 +1,38 @@ +import os + +from flask import Flask + + +def create_app(test_config=None): + # Create app object. Configuration files are relative to instance folder. + app = Flask(__name__, instance_relative_config=True) + + # config + app.config.from_mapping( + SECRET_KEY='dev', + DATABASE=os.path.join(app.instance_path, 'flaskr.sqlite'), + ) + + if test_config is None: + app.config.from_pyfile('config.py', silent=True) + else: + app.config.from_mapping(test_config) + + try: + os.makedirs(app.instance_path) + except OSError: + pass + + # Routes + @app.route('/') + def hello(): + return 'Hello, World!' + + # Register functions and blueprints + from . import db + db.init_app(app) + + from . import auth + app.register_blueprint(auth.bp) + + return app
\ No newline at end of file diff --git a/flaskr/db.py b/flaskr/db.py new file mode 100644 index 0000000..7185da8 --- /dev/null +++ b/flaskr/db.py @@ -0,0 +1,45 @@ +import sqlite3 + +import click +from flask import current_app, g + + +def get_db(): + if 'db' not in g: + g.db = sqlite3.connect( + current_app.config['DATABASE'], + detect_types=sqlite3.PARSE_DECLTYPES + ) + # Return rows that behave like dicts + g.db.row_factory = sqlite3.Row + + return g.db + + +def close_db(e=None): + db = g.pop('db', None) + + if db: + db.close() + +# CLI: +# https://flask.palletsprojects.com/en/3.0.x/cli/ + +def init_db(): + db = get_db() + + with current_app.open_resource('schema.sql') as f: + db.executescript(f.read().decode('utf8')) + + [email protected]('init-db') +def init_db_command(): + """Clear the existing data and create new tables.""" + init_db() + click.echo('Initialized the database.') + +# Register function with application + +def init_app(app): + app.teardown_appcontext(close_db) # callback after returning response + app.cli.add_command(init_db_command)
\ No newline at end of file diff --git a/flaskr/schema.sql b/flaskr/schema.sql new file mode 100644 index 0000000..be76d7e --- /dev/null +++ b/flaskr/schema.sql @@ -0,0 +1,17 @@ +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) +); |
