Adding sessions

This commit is contained in:
evilchili 2025-10-04 10:48:18 -07:00
parent 3854a877bf
commit 36006ceeea
5 changed files with 39 additions and 4 deletions

View File

@ -19,6 +19,7 @@ pyyaml = "^6.0.2"
nanoid = "^2.0.0" nanoid = "^2.0.0"
# grung-db = {git = "https://git.evilchi.li/evilchili/grung-db.git"} # grung-db = {git = "https://git.evilchi.li/evilchili/grung-db.git"}
grung-db = {git = "file:///home/greg/dev/grung-db/"} grung-db = {git = "file:///home/greg/dev/grung-db/"}
flask-session = "^0.8.0"
[tool.poetry.group.dev.dependencies] [tool.poetry.group.dev.dependencies]
pytest = "*" pytest = "*"

View File

@ -4,9 +4,9 @@ from pathlib import Path
from types import SimpleNamespace from types import SimpleNamespace
from dotenv import dotenv_values from dotenv import dotenv_values
from flask import Flask from flask import Flask, session
from flask_session import Session
from grung.db import GrungDB from grung.db import GrungDB
from grung.exceptions import UniqueConstraintError
from tinydb.storages import MemoryStorage from tinydb.storages import MemoryStorage
from ttfrog import schema from ttfrog import schema
@ -78,6 +78,7 @@ VIEW_URI=/
config=config_file, config=config_file,
data_root=data_root, data_root=data_root,
database=data_root / f"{self.config.NAME}.json", database=data_root / f"{self.config.NAME}.json",
sessions=data_root / "session_cache"
) )
def initialize(self, db: GrungDB = None, force: bool = False) -> None: def initialize(self, db: GrungDB = None, force: bool = False) -> None:
@ -99,6 +100,11 @@ VIEW_URI=/
self.web.config["SEND_FILE_MAX_AGE_DEFAULT"] = 0 self.web.config["SEND_FILE_MAX_AGE_DEFAULT"] = 0
self.web.config["DEBUG"] = True self.web.config["DEBUG"] = True
self.web.config["SESSION_TYPE"] = "filesystem"
self.web.config["SESSION_REFRESH_EACH_REQUEST"] = True
self.web.config["SESSION_FILE_DIR"] = self.path.sessions
Session(self.web)
self._initialized = True self._initialized = True
def check_state(self) -> None: def check_state(self) -> None:

View File

@ -5,6 +5,8 @@ from grung.types import BackReference, Collection, Pointer, Record
from ttfrog import schema from ttfrog import schema
from flask import g
READ_ONLY_FIELD_TYPES = [Collection, Pointer, BackReference] READ_ONLY_FIELD_TYPES = [Collection, Pointer, BackReference]
@ -30,6 +32,7 @@ class Form:
continue continue
self.record[key] = value self.record[key] = value
self.record.author = g.user
return self.record return self.record

View File

@ -22,6 +22,8 @@
{% block menu %}{% endblock %} {% block menu %}{% endblock %}
</ul> </ul>
</nav> </nav>
Last Edited By: {{ page.author.name }}
<br>
<main> <main>
{% for message in get_flashed_messages() %} {% for message in get_flashed_messages() %}

View File

@ -1,4 +1,4 @@
from flask import Response, render_template, request from flask import Response, render_template, request, redirect, url_for, session, g
from tinydb import where from tinydb import where
from ttfrog import app, schema, forms from ttfrog import app, schema, forms
@ -81,11 +81,26 @@ def index():
return rendered(get_page(create_okay=False)) return rendered(get_page(create_okay=False))
@app.web.route("/login")
def login():
app.web.session_interface.regenerate(session)
g.user = app.db.User.search(where("name") == "admin")[0]
session['user_id'] = g.user.doc_id
return redirect(url_for("index"))
@app.web.route("/logout")
def logout():
if 'user_id' in session:
del session['user_id']
del g.user
@app.web.route(f"{app.config.VIEW_URI}/<path:table>/<path:path>", methods=["GET"]) @app.web.route(f"{app.config.VIEW_URI}/<path:table>/<path:path>", methods=["GET"])
@app.web.route(f"{app.config.VIEW_URI}/<path:path>", methods=["GET"], defaults={'table': 'Page'}) @app.web.route(f"{app.config.VIEW_URI}/<path:path>", methods=["GET"], defaults={'table': 'Page'})
def view(table, path): def view(table, path):
parent = get_parent(table, relative_uri()) parent = get_parent(table, relative_uri())
return rendered(get_page(request.path, table=table, create_okay=parent.doc_id is not None)) return rendered(get_page(request.path, table=table, create_okay=parent and parent.doc_id is not None))
@app.web.route(f"{app.config.VIEW_URI}/<path:table>/<path:path>", methods=["POST"]) @app.web.route(f"{app.config.VIEW_URI}/<path:table>/<path:path>", methods=["POST"])
@ -110,6 +125,14 @@ def edit(table, path):
return rendered(app.add_member(parent, save_data)) return rendered(app.add_member(parent, save_data))
@app.web.before_request
def before_request():
if 'user_id' in session:
g.user = app.db.User.get(doc_id=session['user_id'])
elif request.endpoint != 'login':
return redirect(url_for('login'))
@app.web.after_request @app.web.after_request
def add_header(r): def add_header(r):
r.headers["Cache-Control"] = "no-cache, no-store, must-revalidate, public, max-age=0" r.headers["Cache-Control"] = "no-cache, no-store, must-revalidate, public, max-age=0"