summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--README.md16
-rw-r--r--flaskr/__init__.py38
-rw-r--r--flaskr/db.py45
-rw-r--r--flaskr/schema.sql17
4 files changed, 116 insertions, 0 deletions
diff --git a/README.md b/README.md
index bd987c7..17876c2 100644
--- a/README.md
+++ b/README.md
@@ -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'))
+
+
+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)
+);