From 4ca214c400a8e80d0cd3e4f13a705ed7b111e2d0 Mon Sep 17 00:00:00 2001 From: Serghei Mihai Date: Thu, 7 Feb 2019 12:11:30 +0100 Subject: [PATCH] add multitenant presentation --- presentation-django-multitenant-eo/pip | 3 + .../presentation.tex | 102 ++++++++++++++++++ .../settings.py | 9 ++ 3 files changed, 114 insertions(+) create mode 100644 presentation-django-multitenant-eo/pip create mode 100644 presentation-django-multitenant-eo/presentation.tex create mode 100644 presentation-django-multitenant-eo/settings.py diff --git a/presentation-django-multitenant-eo/pip b/presentation-django-multitenant-eo/pip new file mode 100644 index 0000000..5e52424 --- /dev/null +++ b/presentation-django-multitenant-eo/pip @@ -0,0 +1,3 @@ +(venv) $ django-admin startproject demo +(venv) $ pip install django_tenant_schemas +... \ No newline at end of file diff --git a/presentation-django-multitenant-eo/presentation.tex b/presentation-django-multitenant-eo/presentation.tex new file mode 100644 index 0000000..b2d3e03 --- /dev/null +++ b/presentation-django-multitenant-eo/presentation.tex @@ -0,0 +1,102 @@ +\documentclass{beamer} +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} +\usepackage[french]{babel} +\usepackage{hyperref} +\usetheme{Berlin} +\usepackage{listings} + +\title{Programmer une application Django multitenant sans y penser} +\author{S. MIHAI, T. NOËL, B. DAUVERGNE} +\institute{\href{http://entrouvert.com}{Entrouvert SCOP ARL}} + +\begin{document} +\begin{frame} + \titlepage +\end{frame} + +\begin{frame} + \frametitle{Pratiques de multitenantismationerie connues} + \begin{enumerate} + \item<1->{ajouter un "site\_id" dans tous les modèles de l'appli} + \item<2->{faire tourner autant de fois l'appli que de sites (docker, etc)} + \item<3->{isoler les données par site au niveau du serveur de base de données, via des base de données/schemas multiples dans celle-ci} + \item<4->{fichiers de conf basés sur le hostname} + \end{enumerate} +\end{frame} + +\begin{frame} + \frametitle{Pratiques de multitenantismationerie connues} + notre choixe est 3: avec schema + \begin{itemize} + \item<1-> {une seule base de code (on évite 2)} + \item<2->{du code qui n'a pas besoin de savoir qu'il va être multitenant (on évite 1)} + \item<3->{une seule connexion à la base (on peut changer de schéma dans la même connexion)} + \end{itemize} +\end{frame} + +\begin{frame} + \frametitle{django-tenant-schema} + + Et pour ça: + \begin{block}{django-tenant-schema\footnote{\url{https://django-tenant-schemas.readthedocs.io/en/latest/}}\footnote{\url{https://docs.microsoft.com/fr-fr/azure/sql-database/saas-tenancy-app-design-patterns}}} + \begin{itemize} + \item{attache un objet "tenant" à un objet "thread local"} + \item{django.db.connexion se base là dessus pour faire \\ \texttt{SET SEARCH\_PATH = '...';} \\ avant chaque requête SQL\footnote{\url{https://www.postgresql.org/docs/9.1/ddl-schemas.html}}} + \end{itemize} + \end{block} +\end{frame} + +\begin{frame} + \frametitle{Demo 1: Multitenantiser une simple appli Django} + Ex: django-tutorial\footnote{\url{https://github.com/mdamien/django-tutorial}} + \lstinputlisting{pip} +\end{frame} +\begin{frame} + \frametitle{Demo 1: Multitenantiser une simple appli Django} + \lstinputlisting[language=Python]{settings.py} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Demo 1: Multitenantiser une simple appli Django} + \lstset{language=Python} + \begin{lstlisting} + DATABASES = { + 'default': { + 'ENGINE': 'tenant_schemas.postgresql_backend', + 'NAME': 'demo' + } + } + \end{lstlisting} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Demo 1: Multitenantiser une simple appli Django} + \lstset{language=Python} + \begin{lstlisting} + DATABASE_ROUTERS = ( + 'tenant_schemas.routers.TenantSyncRouter', + ) + \end{lstlisting} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Demo 1: Multitenantiser une simple appli Django} + \lstset{language=Python} + \begin{lstlisting} + MIDDLEWARE_CLASSES = ( + 'tenant_schemas.middleware.TenantMiddleware', + ... + ) + \end{lstlisting} +\end{frame} + +\begin{frame} + \frametitle{Vers l'infini et au-délà: python-hobo\footnote{\url{http://git.entrouvert.org/hobo.git/}}} + \begin{itemize} + \item<1->{settings personnalisés par tenant: \\ \texttt{hobo.multitenant.settings\_loaders.TemplateVars \\ hobo.multitenant.settings\_loaders.SettingsPy}} + \item<2->{templates custom par tenant \\ \texttt{hobo.multitenant.template\_loaders.FilesystemLoader}} + \item<3->{shell Django dans le contexte d'un tenant\\ \texttt{hobo.multitenant.management.commands.shell}} + \end{itemize} +\end{frame} +\end{document} diff --git a/presentation-django-multitenant-eo/settings.py b/presentation-django-multitenant-eo/settings.py new file mode 100644 index 0000000..21d5da9 --- /dev/null +++ b/presentation-django-multitenant-eo/settings.py @@ -0,0 +1,9 @@ +# demo/settings.py +INSTALLED_APPS = ( + 'django.contrib.auth', + 'django.contrib.sessions', + 'django.contrib.sites', + 'django.contrib.admin', + 'schedule', + ... +)