Skip to content

Commit

Permalink
refactor: move flask and sentry setup in dedicated files
Browse files Browse the repository at this point in the history
  • Loading branch information
azmeuk committed Feb 2, 2025
1 parent 1446485 commit 9293b71
Show file tree
Hide file tree
Showing 5 changed files with 84 additions and 82 deletions.
85 changes: 5 additions & 80 deletions canaille/__init__.py
Original file line number Diff line number Diff line change
@@ -1,85 +1,6 @@
import datetime
import sys

from flask import Flask
from flask import session
from flask_wtf.csrf import CSRFProtect

csrf = CSRFProtect()


def setup_sentry(app): # pragma: no cover
if not app.config["CANAILLE"]["SENTRY_DSN"]:
return None

try:
import sentry_sdk
from sentry_sdk.integrations.flask import FlaskIntegration

except Exception:
return None

sentry_sdk.init(
dsn=app.config["CANAILLE"]["SENTRY_DSN"], integrations=[FlaskIntegration()]
)
return sentry_sdk


def setup_blueprints(app):
import canaille.core.endpoints

app.url_map.strict_slashes = False

app.register_blueprint(canaille.core.endpoints.bp)

if app.features.has_oidc:
import canaille.oidc.endpoints

app.register_blueprint(canaille.oidc.endpoints.bp)

if app.features.has_scim_server:
import canaille.scim.endpoints

app.register_blueprint(canaille.scim.endpoints.bp)


def setup_flask(app):
from canaille.app.templating import render_template

csrf.init_app(app)

@app.before_request
def make_session_permanent():
session.permanent = True
app.permanent_session_lifetime = datetime.timedelta(days=365)

@app.errorhandler(400)
def bad_request(error):
return render_template("error.html", description=error, error_code=400), 400

@app.errorhandler(403)
def unauthorized(error):
return render_template("error.html", description=error, error_code=403), 403

@app.errorhandler(404)
def page_not_found(error):
from canaille.app.flask import redirect_to_bp_handlers

return redirect_to_bp_handlers(app, error) or render_template(
"error.html", description=error, error_code=404
), 404

@app.errorhandler(500)
def server_error(error): # pragma: no cover
return render_template("error.html", description=error, error_code=500), 500


def setup_flask_converters(app):
from canaille.app import models
from canaille.app.flask import model_converter

for model_name, model_class in models.MODELS.items():
app.url_map.converters[model_name.lower()] = model_converter(model_class)


def create_app(
Expand All @@ -98,8 +19,12 @@ def create_app(
"""
from .app.configuration import setup_config
from .app.features import setup_features
from .app.flask import setup_flask
from .app.flask import setup_flask_blueprints
from .app.flask import setup_flask_converters
from .app.i18n import setup_i18n
from .app.logging import setup_logging
from .app.sentry import setup_sentry
from .app.templating import setup_jinja
from .app.templating import setup_themer
from .backends import setup_backend
Expand All @@ -120,7 +45,7 @@ def create_app(
backend = setup_backend(app, backend, init_backend)
setup_features(app)
setup_flask_converters(app)
setup_blueprints(app)
setup_flask_blueprints(app)
setup_jinja(app)
setup_i18n(app)
setup_themer(app)
Expand Down
62 changes: 62 additions & 0 deletions canaille/app/flask.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import datetime
import logging
from functools import wraps
from urllib.parse import urlsplit
Expand All @@ -9,14 +10,18 @@
from flask import make_response
from flask import redirect
from flask import request
from flask import session
from flask import url_for
from flask_wtf.csrf import CSRFProtect
from werkzeug.exceptions import HTTPException
from werkzeug.routing import BaseConverter

from canaille.app.i18n import gettext as _
from canaille.app.session import current_user
from canaille.app.templating import render_template

csrf = CSRFProtect()


def user_needed(*args):
permissions = set(args)
Expand Down Expand Up @@ -140,3 +145,60 @@ def redirect_to_bp_handlers(app, error):
if type_ in (error.code, HTTPException): # pragma: no branch
return make_response(handler(error))
return None


def setup_flask_blueprints(app):
import canaille.core.endpoints

app.url_map.strict_slashes = False

app.register_blueprint(canaille.core.endpoints.bp)

if app.features.has_oidc:
import canaille.oidc.endpoints

app.register_blueprint(canaille.oidc.endpoints.bp)

if app.features.has_scim_server:
import canaille.scim.endpoints

app.register_blueprint(canaille.scim.endpoints.bp)


def setup_flask(app):
from canaille.app.templating import render_template

csrf.init_app(app)

@app.before_request
def make_session_permanent():
session.permanent = True
app.permanent_session_lifetime = datetime.timedelta(days=365)

@app.errorhandler(400)
def bad_request(error):
return render_template("error.html", description=error, error_code=400), 400

@app.errorhandler(403)
def unauthorized(error):
return render_template("error.html", description=error, error_code=403), 403

@app.errorhandler(404)
def page_not_found(error):
from canaille.app.flask import redirect_to_bp_handlers

return redirect_to_bp_handlers(app, error) or render_template(
"error.html", description=error, error_code=404
), 404

@app.errorhandler(500)
def server_error(error): # pragma: no cover
return render_template("error.html", description=error, error_code=500), 500


def setup_flask_converters(app):
from canaille.app import models
from canaille.app.flask import model_converter

for model_name, model_class in models.MODELS.items():
app.url_map.converters[model_name.lower()] = model_converter(model_class)
15 changes: 15 additions & 0 deletions canaille/app/sentry.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
def setup_sentry(app): # pragma: no cover
if not app.config["CANAILLE"]["SENTRY_DSN"]:
return None

try:
import sentry_sdk
from sentry_sdk.integrations.flask import FlaskIntegration

except Exception:
return None

sentry_sdk.init(
dsn=app.config["CANAILLE"]["SENTRY_DSN"], integrations=[FlaskIntegration()]
)
return sentry_sdk
2 changes: 1 addition & 1 deletion canaille/oidc/endpoints/oauth.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@
from werkzeug.datastructures import CombinedMultiDict
from werkzeug.exceptions import HTTPException

from canaille import csrf
from canaille.app import models
from canaille.app.flask import csrf
from canaille.app.flask import set_parameter_in_url_query
from canaille.app.i18n import gettext as _
from canaille.app.session import current_user
Expand Down
2 changes: 1 addition & 1 deletion canaille/scim/endpoints.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@
from scim2_models import SearchRequest
from werkzeug.exceptions import HTTPException

from canaille import csrf
from canaille.app import models
from canaille.app.flask import csrf
from canaille.backends import Backend

from .models import Group
Expand Down

0 comments on commit 9293b71

Please sign in to comment.