Skip to content

Commit 23b6e99

Browse files
authored
Merge pull request #191 from Geode-solutions/feat/refacto_web_server
Feat/refacto web server
2 parents b1748d2 + 39e2bb5 commit 23b6e99

File tree

12 files changed

+217
-142
lines changed

12 files changed

+217
-142
lines changed

app.py

Lines changed: 0 additions & 63 deletions
This file was deleted.

pyproject.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
requires = ["setuptools"]
33
build-backend = "setuptools.build_meta"
44

5-
65
[project]
76
name = "OpenGeodeWeb-Back"
87
version = "0.0.0"
@@ -21,6 +20,9 @@ classifiers = [
2120
"Homepage" = "https://github.com/Geode-solutions/OpenGeodeWeb-Back"
2221
"Bug Tracker" = "https://github.com/Geode-solutions/OpenGeodeWeb-Back/issues"
2322

23+
[project.scripts]
24+
opengeodeweb-back = "opengeodeweb_back.app:run_server"
25+
2426
[tool.setuptools.dynamic]
2527
dependencies = { file = ["requirements.txt"] }
2628

requirements.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ geode-common==33.11.0
77
geode-viewables==3.3.0
88
flask[async]==3.1.2
99
flask-cors==6.0.1
10+
werkzeug==3.1.2
1011
flask-sqlalchemy==3.1.1

requirements.txt

Lines changed: 12 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,55 +2,39 @@
22
# This file is autogenerated by pip-compile with Python 3.12
33
# by the following command:
44
#
5-
# pip-compile --output-file=./requirements.txt ./requirements-internal.in ./requirements.in
5+
# pip-compile --output-file=./requirements.txt --pre ./requirements.in
66
#
7-
asgiref~=3.9
7+
asgiref~=3.10
88
# via flask
99
blinker~=1.9
10-
# via
11-
# flask
12-
# opengeodeweb-microservice
10+
# via flask
1311
click~=8.3
14-
# via
15-
# flask
16-
# opengeodeweb-microservice
17-
fastjsonschema~=2.21
18-
# via opengeodeweb-microservice
12+
# via flask
1913
flask[async]~=3.1
2014
# via
2115
# -r requirements.in
2216
# flask-cors
2317
# flask-sqlalchemy
24-
# opengeodeweb-microservice
2518
flask-cors==6.0.1
2619
# via -r requirements.in
2720
flask-sqlalchemy==3.1.1
28-
# via
29-
# -r requirements.in
30-
# opengeodeweb-microservice
21+
# via -r requirements.in
3122
geode-common==33.11.0
3223
# via
3324
# -r requirements.in
3425
# geode-viewables
3526
geode-viewables==3.3.0
3627
# via -r requirements.in
3728
greenlet~=3.2
38-
# via
39-
# opengeodeweb-microservice
40-
# sqlalchemy
29+
# via sqlalchemy
4130
itsdangerous~=2.2
42-
# via
43-
# flask
44-
# opengeodeweb-microservice
31+
# via flask
4532
jinja2~=3.1
46-
# via
47-
# flask
48-
# opengeodeweb-microservice
33+
# via flask
4934
markupsafe~=3.0
5035
# via
5136
# flask
5237
# jinja2
53-
# opengeodeweb-microservice
5438
# werkzeug
5539
opengeode-core==15.27.4
5640
# via
@@ -75,18 +59,12 @@ opengeode-io==7.4.0
7559
# -r requirements.in
7660
# geode-viewables
7761
# opengeode-geosciencesio
78-
opengeodeweb-microservice~=1.0,>=1.0.3
79-
# via -r requirements-internal.in
8062
sqlalchemy~=2.0
81-
# via
82-
# flask-sqlalchemy
83-
# opengeodeweb-microservice
63+
# via flask-sqlalchemy
8464
typing-extensions~=4.15
65+
# via sqlalchemy
66+
werkzeug==3.1.2
8567
# via
86-
# opengeodeweb-microservice
87-
# sqlalchemy
88-
werkzeug~=3.1
89-
# via
68+
# -r requirements.in
9069
# flask
9170
# flask-cors
92-
# opengeodeweb-microservice

src/opengeodeweb_back/app.py

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
"""Packages"""
2+
3+
import argparse
4+
import os
5+
import time
6+
from typing import Any
7+
8+
import flask
9+
import flask_cors # type: ignore
10+
from flask import Flask, Response
11+
from flask_cors import cross_origin
12+
from werkzeug.exceptions import HTTPException
13+
14+
from opengeodeweb_back import utils_functions, app_config
15+
from opengeodeweb_back.routes import blueprint_routes
16+
from opengeodeweb_back.routes.models import blueprint_models
17+
from opengeodeweb_microservice.database.connection import init_database
18+
19+
20+
""" Global config """
21+
app: Flask = flask.Flask(__name__)
22+
23+
""" Config variables """
24+
FLASK_DEBUG = True if os.environ.get("FLASK_DEBUG", default=None) == "True" else False
25+
26+
if FLASK_DEBUG == False:
27+
app.config.from_object(app_config.ProdConfig)
28+
else:
29+
app.config.from_object(app_config.DevConfig)
30+
31+
DEFAULT_HOST: str = app.config.get("DEFAULT_HOST") or "localhost"
32+
DEFAULT_PORT: int = int(app.config.get("DEFAULT_PORT") or 5000)
33+
DEFAULT_DATA_FOLDER_PATH: str = app.config.get("DEFAULT_DATA_FOLDER_PATH") or "./data"
34+
ORIGINS: Any = app.config.get("ORIGINS")
35+
TIMEOUT: int = int(app.config.get("MINUTES_BEFORE_TIMEOUT") or 30)
36+
SSL: Any = app.config.get("SSL")
37+
SECONDS_BETWEEN_SHUTDOWNS: float = float(
38+
app.config.get("SECONDS_BETWEEN_SHUTDOWNS") or 60.0
39+
)
40+
41+
42+
app.register_blueprint(
43+
blueprint_routes.routes,
44+
url_prefix="/opengeodeweb_back",
45+
name="opengeodeweb_back",
46+
)
47+
48+
app.register_blueprint(
49+
blueprint_models.routes,
50+
url_prefix="/opengeodeweb_back/models",
51+
name="opengeodeweb_models",
52+
)
53+
54+
if FLASK_DEBUG == False:
55+
utils_functions.set_interval(
56+
utils_functions.kill_task, SECONDS_BETWEEN_SHUTDOWNS, app
57+
)
58+
59+
60+
@app.errorhandler(HTTPException)
61+
def errorhandler(e: HTTPException) -> tuple[dict[str, Any], int] | Response:
62+
return utils_functions.handle_exception(e)
63+
64+
65+
@app.route(
66+
"/error",
67+
methods=["POST"],
68+
)
69+
def return_error() -> Response:
70+
flask.abort(500, f"Test")
71+
return flask.make_response({}, 500)
72+
73+
74+
@app.route("/", methods=["POST"])
75+
@cross_origin()
76+
def root() -> Response:
77+
return flask.make_response({}, 200)
78+
79+
80+
@app.route("/kill", methods=["POST"])
81+
@cross_origin()
82+
def kill() -> None:
83+
print("Manual server kill, shutting down...", flush=True)
84+
os._exit(0)
85+
86+
87+
def run_server() -> None:
88+
parser = argparse.ArgumentParser(
89+
prog="OpenGeodeWeb-Back", description="Backend server for OpenGeodeWeb"
90+
)
91+
parser.add_argument("--host", type=str, default=DEFAULT_HOST, help="Host to run on")
92+
parser.add_argument(
93+
"-p", "--port", type=int, default=DEFAULT_PORT, help="Port to listen on"
94+
)
95+
parser.add_argument(
96+
"-d",
97+
"--debug",
98+
default=FLASK_DEBUG,
99+
help="Whether to run in debug mode",
100+
action="store_true",
101+
)
102+
parser.add_argument(
103+
"-dfp",
104+
"--data_folder_path",
105+
type=str,
106+
default=DEFAULT_DATA_FOLDER_PATH,
107+
help="Path to the folder where data is stored",
108+
)
109+
parser.add_argument(
110+
"-ufp",
111+
"--upload_folder_path",
112+
type=str,
113+
default=DEFAULT_DATA_FOLDER_PATH,
114+
help="Path to the folder where uploads are stored",
115+
)
116+
parser.add_argument(
117+
"-origins",
118+
"--allowed_origins",
119+
default=ORIGINS,
120+
help="Origins that are allowed to connect to the server",
121+
)
122+
parser.add_argument(
123+
"-t",
124+
"--timeout",
125+
default=TIMEOUT,
126+
help="Number of minutes before the server times out",
127+
)
128+
args = parser.parse_args()
129+
130+
app.config.update(DATA_FOLDER_PATH=args.data_folder_path)
131+
app.config.update(UPLOAD_FOLDER=args.upload_folder_path)
132+
app.config.update(MINUTES_BEFORE_TIMEOUT=args.timeout)
133+
134+
flask_cors.CORS(app, origins=args.allowed_origins)
135+
136+
print(
137+
f"Host: {args.host}, Port: {args.port}, Debug: {args.debug}, "
138+
f"Data folder path: {args.data_folder_path}, Timeout: {args.timeout}, "
139+
f"Origins: {args.allowed_origins}",
140+
flush=True,
141+
)
142+
143+
db_filename: str = app.config.get("DATABASE_FILENAME") or "database.db"
144+
db_path = os.path.join(args.data_folder_path, db_filename)
145+
os.makedirs(os.path.dirname(db_path), exist_ok=True)
146+
app.config["SQLALCHEMY_DATABASE_URI"] = f"sqlite:///{db_path}"
147+
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
148+
init_database(app, db_filename)
149+
print(f"Database initialized at: {db_path}", flush=True)
150+
151+
app.run(debug=args.debug, host=args.host, port=args.port, ssl_context=SSL)
152+
153+
154+
# ''' Main '''
155+
if __name__ == "__main__":
156+
run_server()

src/opengeodeweb_back/app_config.py

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,6 @@
44

55
# Third party imports
66
# Local application imports
7-
from opengeodeweb_microservice.database.connection import get_database
8-
9-
DATABASE_FILENAME = "project.db"
107

118

129
class Config(object):
@@ -18,7 +15,7 @@ class Config(object):
1815
REQUEST_COUNTER = 0
1916
LAST_REQUEST_TIME = time.time()
2017
LAST_PING_TIME = time.time()
21-
SQLALCHEMY_TRACK_MODIFICATIONS = False
18+
DATABASE_FILENAME = "project.db"
2219

2320

2421
class ProdConfig(Config):
@@ -27,9 +24,6 @@ class ProdConfig(Config):
2724
MINUTES_BEFORE_TIMEOUT = "1"
2825
SECONDS_BETWEEN_SHUTDOWNS = "10"
2926
DATA_FOLDER_PATH = "/data"
30-
SQLALCHEMY_DATABASE_URI = f"sqlite:///{os.path.abspath(
31-
os.path.join(DATA_FOLDER_PATH, DATABASE_FILENAME)
32-
)}"
3327

3428

3529
class DevConfig(Config):
@@ -39,6 +33,3 @@ class DevConfig(Config):
3933
SECONDS_BETWEEN_SHUTDOWNS = "10"
4034
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
4135
DATA_FOLDER_PATH = os.path.join(BASE_DIR, "data")
42-
SQLALCHEMY_DATABASE_URI = f"sqlite:///{os.path.join(
43-
BASE_DIR, DATA_FOLDER_PATH, DATABASE_FILENAME
44-
)}"

src/opengeodeweb_back/utils_functions.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,6 @@ def validate_request(request: flask.Request, schema: dict[str, str]) -> None:
8888

8989
if json_data is None:
9090
json_data = {}
91-
9291
try:
9392
validate = fastjsonschema.compile(schema)
9493
validate(json_data)
@@ -259,10 +258,6 @@ def generate_native_viewable_and_light_viewable_from_file(
259258

260259
data = geode_functions.load(geode_object, copied_full_path)
261260

262-
# Remplacer :
263-
# database.session.delete(temp_data_entry)
264-
# database.session.flush()
265-
# Par :
266261
session = get_session()
267262
if session:
268263
session.delete(temp_data_entry)

0 commit comments

Comments
 (0)