add multitenant presentation

This commit is contained in:
Serghei Mihai 2019-02-07 12:11:30 +01:00
commit 4ca214c400
3 changed files with 114 additions and 0 deletions

View File

@ -0,0 +1,3 @@
(venv) $ django-admin startproject demo
(venv) $ pip install django_tenant_schemas
...

View File

@ -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}

View File

@ -0,0 +1,9 @@
# demo/settings.py
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.admin',
'schedule',
...
)