From 2d79a45b6d5673adfc6e5911b4fff47c6288e013 Mon Sep 17 00:00:00 2001 From: Pierre Hennequart Date: Tue, 29 Jul 2025 22:39:35 +0200 Subject: [PATCH] replace waitress by unicorn This fixes #21 --- .github/workflows/dts-validator.yml | 2 +- Dockerfile | 2 +- Makefile | 18 ++++++++++------- README.md | 2 +- dapytains/app/app.py | 31 +---------------------------- dapytains/app/wsgi.py | 21 +++++++++++++++++++ requirements.txt | 2 +- 7 files changed, 37 insertions(+), 41 deletions(-) create mode 100644 dapytains/app/wsgi.py diff --git a/.github/workflows/dts-validator.yml b/.github/workflows/dts-validator.yml index 87b23ac..b0eef8d 100644 --- a/.github/workflows/dts-validator.yml +++ b/.github/workflows/dts-validator.yml @@ -34,7 +34,7 @@ jobs: # Flask Server - name: Start Flask server run: | - python -m dapytains.app.app & + python -m dapytains.app.wsgi & - name: Wait for Flask server to start run: sleep 5 # Adjust as needed diff --git a/Dockerfile b/Dockerfile index b84da7b..9077531 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,4 +20,4 @@ WORKDIR /app RUN make install -ENTRYPOINT exec python -m dapytains.app.app +ENTRYPOINT exec make start diff --git a/Makefile b/Makefile index 432c7f6..06ce344 100644 --- a/Makefile +++ b/Makefile @@ -4,10 +4,13 @@ include .env.local COMPOSE_FILE ?= compose.yaml DOCKER_COMPOSE ?= docker compose -f $(COMPOSE_FILE) +GUNICORN ?= gunicorn PIP ?= pip PYTEST ?= pytest PYTHON ?= python SERVER_ENV ?= prod +SERVER_HOST ?= 0.0.0.0 +SERVER_PORT ?= 5000 VERBOSE ?= 0 COLOR_SUPPORT ?= $(shell [ "$$(tput colors 2>/dev/null)" -ge 8 ] && echo 1 || echo 0) @@ -40,7 +43,7 @@ help: install: $(PIP) install -r requirements.txt -ifneq ($(SERVER_ENV),"prod") +ifneq ("$(SERVER_ENV)","prod") $(PIP) install -r requirements-dev.txt endif @@ -50,16 +53,17 @@ ifeq ($(VERBOSE),1) else @$(MAKE) install > /dev/null endif - $(PYTHON) -m dapytains.app.app +ifeq ("$(SERVER_ENV)","prod") + $(GUNICORN) -b $(SERVER_HOST):$(SERVER_PORT) dapytains.app.wsgi:app +else + $(PYTHON) -m dapytains.app.wsgi +endif test: -ifeq ($(SERVER_ENV),"prod") - $(error "Tests cannot run in 'prod' environment") -endif ifeq ($(VERBOSE),1) - $(MAKE) install + $(MAKE) SERVER_ENV=test install else - @$(MAKE) install > /dev/null + @$(MAKE) SERVER_ENV=test install > /dev/null endif $(PYTEST) --doctest-modules --cov=dapytains --verbose diff --git a/README.md b/README.md index e214383..70ad475 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ This library will: ## WebApp -You can try the webapp using `python -m dapitains.app.app`. It uses test files at the moment. +You can try the webapp using `python -m dapytains.app.wsgi`. It uses test files at the moment. ## Guidelines diff --git a/dapytains/app/app.py b/dapytains/app/app.py index c03b4d8..8e522cd 100644 --- a/dapytains/app/app.py +++ b/dapytains/app/app.py @@ -11,16 +11,11 @@ import json import lxml.etree as ET -import os from dapytains.tei.document import Document from dapytains.errors import InvalidRangeOrder from dapytains.app.database import db, Collection, Navigation from dapytains.app.navigation import get_nav, get_member_by_path from dapytains.app.transformer import Transformer, GeneralisticXSLTransformer -from dotenv_flow import dotenv_flow - -dotenv_flow(os.getenv("SERVER_ENV", "prod")) - def inject_json(collection: Collection, templates) -> Dict: if collection.resource: @@ -271,28 +266,4 @@ def document_route(): return app, db - -if __name__ == "__main__": - import os - from dapytains.app.ingest import store_catalog - from dapytains.metadata.xml_parser import parse - - app = Flask(__name__) - _, db = create_app(app) - - app.config['SQLALCHEMY_DATABASE_URI'] = os.getenv("DATABASE_URI", "sqlite:///../app.db") - app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False - - db.init_app(app) - with app.app_context(): - db.drop_all() - db.create_all() - - catalog, _ = parse(os.getenv("DTSCATALOG", "tests/catalog/example-collection.xml")) - store_catalog(catalog) - - if "prod" != os.getenv("SERVER_ENV", "prod"): - app.run(debug=True, host=os.getenv("SERVER_HOST", "0.0.0.0"), port=os.getenv("SERVER_PORT", 5000)) - else: - from waitress import serve - serve(app, host=os.getenv("SERVER_HOST", "0.0.0.0"), port=os.getenv("SERVER_PORT", 5000)) +app, db = create_app(Flask(__name__)) \ No newline at end of file diff --git a/dapytains/app/wsgi.py b/dapytains/app/wsgi.py new file mode 100644 index 0000000..2d55fe8 --- /dev/null +++ b/dapytains/app/wsgi.py @@ -0,0 +1,21 @@ +import os +from dapytains.app.app import app, db +from dapytains.app.ingest import store_catalog +from dapytains.metadata.xml_parser import parse +from dotenv_flow import dotenv_flow + +dotenv_flow(os.getenv("SERVER_ENV", "prod")) + +if __name__ == "__main__": + app.config['SQLALCHEMY_DATABASE_URI'] = os.getenv("DATABASE_URI", "sqlite:///../app.db") + app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False + + db.init_app(app) + with app.app_context(): + db.drop_all() + db.create_all() + + catalog, _ = parse(os.getenv("DTSCATALOG", "tests/catalog/example-collection.xml")) + store_catalog(catalog) + + app.run(debug=("prod" != os.getenv("SERVER_ENV", "prod")), host=os.getenv("SERVER_HOST", "0.0.0.0"), port=os.getenv("SERVER_PORT", 5000)) diff --git a/requirements.txt b/requirements.txt index 5876111..ac326c5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,4 +6,4 @@ click uritemplate tqdm dotenv_flow -waitress +gunicorn