103 lines
3.5 KiB
TeX
103 lines
3.5 KiB
TeX
\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}
|