inclusion doc Django

This commit is contained in:
Paul Marillonnet 2017-03-30 16:26:48 +02:00
parent e52939136f
commit 68f779f770
2 changed files with 95 additions and 96 deletions

96
doc.md
View File

@ -1607,102 +1607,6 @@ Seule l'écriture du fichier models.py est nécessaire. Il suffit de préciser l
# Mise au point technique
## Python
### Packing et unpacking
## Django
TODO Se documenter sur les templates (modèle MVT)
Expliquer philosophie DRY (*Don't Repeat Yourself*)
### Principes généraux
#### Vues
##### Class-Based Views (CBV)
Nouvelle façon d'écrire des vues
Repose sur la définition d'une classe contenant les attributs nécessaires à la construction de la vue et la définition de méthodes correspondant aux requêtes http vers la vue
Les *mixins* propose, par l'utilisation de l'héritage multiple, un mécanisme voué à éviter la duplication du code dans les CBV.
##### Decorators
La mise en place du POC a nécessité l'utilisation de décorateurs de vue. Ce mécanisme propre à Django permet de restreindre l'affichage d'une vue sous certaines conditions.
Des décorateurs sont proposés par défaut dans Django. Ils commencent par `@` et précédent la définition d'une vue dans les sources de l'application. Par exemple:
`@csrf_exempt`
`def index(request):`
` <view logic>`
` return wcs_submit(data)`
Le décorateur `@csrf_exempt` est de type permissif : il stipule que le client (par exemple un navigateur) n'a pas besoin de fournir un jeton CSRF (*csrf token*) pour pouvoir accéder à la vue.
Au contraire, des décorateurs tels que `@login_required` ou `@require_http_methods` peuvent être de type restrictif.
Bien que Django fournisse des décorateurs par défaut, ce framework permet aux développeurs de définir les leurs. Un décorateur est une double définition de deux fonctions imbriquées - l'un des deux fonctions devant renvoyer en argument la seconde. Par exemple, nous pouvons définir un décorateur interdisant l'affichage de la vue si le dernier utilisateur connecté possède déjà un compte renseigné dans le LDAP:
`def user_not_in_ldap(function):`
` def wrapped(request, *args, **kwargs):`
` user_data = saml_collect_data()`
` if ldap_is_in_directory(user_data):`
` raise PermissionDenied`
` else:`
` return function(request, *args, **kwargs)`
` return wrapped`
##### URIs
APPEND_SLASH ?
"Adding slash to: '/login'"
#### Modèles
Les modèles Django standardisent l'utilisation des objets dans l'application web.
Ils reprennent les mécanismes de POO proposés par Python, pour faciliter la mise en place de l'appli Web, et plus particulièrement les mécanismes ORM (*Object-Relational Mapping*).
La définition de modèles spécifiques à l'application se fait dans le fichier `models.py`. L'utilitaire Django `manage.py` permet la migration en base de données, c'est-à-dire la création des tables associées aux classes définies dans l'appli. Prenons l'exemple du modèle TODOTODOTODO
#### Templates
Langage procédural propre à django à l'intérieur des templates.
Il s'agit d'un langage à syntaxe restreintes, permettant d'effectuer des operations d'affichage et des opérations fonctionnelles et logiques simples avant génération de la page html.
Les templates Django sont un outil plus léger et plus simple d'utilisation que JSP, son équivalent J2E.
Prenons l'exemple d'un template utilisé pour l'application POC :
Fichier login.html :
`{% extends "manager_base.html" %}`
`{% load i18n %}`
`{% block content %}`
`<form method="post">`
`{% csrf_token %}`
`{{ form.as_p }}`
`<input type="submit" value="{% trans 'Log in' %}" />`
`</form>`
`{% endblock %}`
On remarque par exemple le *one-liner* `{{ form.as_p }}` permettant l'affichage d'un formulaire html à partir des différents attributs d'un objet Django de la classe `Form.forms`.
L'ajout du jeton CSRF en tant que balise cachée (*hidden tag*) du formulaire se fait par l'instruction `{% csrf_token %}`
Le template est ensuite traité par l'instruction `render` dans la vue associée, pour aboutir à la génération d'une page html présentée au client (traitement côté serveur, au même titre que les JSP).
Finalement, suivant le principe DRY propre à Django, les templates s'appeler les uns les autres à l'aide de la directive `extends`.
#### TemplateResponse
Dynamise la phase de création de la réponse HTTP après exécution de la vue associée. Fonctionnalité impossible à réaliser à l'aide de simples objets HttpResponse.
La manipulation des mixins se fait à l'aide de l'objet SingleObjectMixin et de SingleObjectTemplateResponseMixin.
TODO Si mixin associé à une ListView, alors MultipleObjectMixin.
### Remarques
L'interface Web d'administration et le compte *superuser* ne sont pas activés par défaut.
Page `/admin` pour la gestion des webapps.
Opérations CRUD : Create, Read, Update, Delete
La GUI est générée automatiquement en fonction des modèles de donnée de l'application, pourvu que ceux-ci aient été enregistrés au préalable (méthode `admin.site.register()`)
Champs `list_display`, `list_filter`, `date_hierarchy`, `ordering` et `search_fields` de la classe `admin.ModelAdmin`
Classe Q : requêtes avancées -> à lire
Appli ContentType pour les relations génériques
*template context processors*
*custom tags* utilisant la fonction *render*
django.db.models.signals
django.contrib.auth.models.User
### Coding style
* keywork `linebreaks`
* `cleaned_data` pour les formulaires

View File

@ -47,6 +47,101 @@ Paul Marillonnet
# Prise en main des technologies
## Django
TODO Se documenter sur les templates (modèle MVT)
Expliquer philosophie DRY (*Don't Repeat Yourself*)
### Principes généraux
#### Vues
##### Class-Based Views (CBV)
Nouvelle façon d'écrire des vues
Repose sur la définition d'une classe contenant les attributs nécessaires à la construction de la vue et la définition de méthodes correspondant aux requêtes http vers la vue
Les *mixins* propose, par l'utilisation de l'héritage multiple, un mécanisme voué à éviter la duplication du code dans les CBV.
##### Decorators
La mise en place du POC a nécessité l'utilisation de décorateurs de vue. Ce mécanisme propre à Django permet de restreindre l'affichage d'une vue sous certaines conditions.
Des décorateurs sont proposés par défaut dans Django. Ils commencent par `@` et précédent la définition d'une vue dans les sources de l'application. Par exemple:
`@csrf_exempt`
`def index(request):`
` <view logic>`
` return wcs_submit(data)`
Le décorateur `@csrf_exempt` est de type permissif : il stipule que le client (par exemple un navigateur) n'a pas besoin de fournir un jeton CSRF (*csrf token*) pour pouvoir accéder à la vue.
Au contraire, des décorateurs tels que `@login_required` ou `@require_http_methods` peuvent être de type restrictif.
Bien que Django fournisse des décorateurs par défaut, ce framework permet aux développeurs de définir les leurs. Un décorateur est une double définition de deux fonctions imbriquées - l'un des deux fonctions devant renvoyer en argument la seconde. Par exemple, nous pouvons définir un décorateur interdisant l'affichage de la vue si le dernier utilisateur connecté possède déjà un compte renseigné dans le LDAP:
`def user_not_in_ldap(function):`
` def wrapped(request, *args, **kwargs):`
` user_data = saml_collect_data()`
` if ldap_is_in_directory(user_data):`
` raise PermissionDenied`
` else:`
` return function(request, *args, **kwargs)`
` return wrapped`
##### URIs
APPEND_SLASH ?
"Adding slash to: '/login'"
#### Modèles
Les modèles Django standardisent l'utilisation des objets dans l'application web.
Ils reprennent les mécanismes de POO proposés par Python, pour faciliter la mise en place de l'appli Web, et plus particulièrement les mécanismes ORM (*Object-Relational Mapping*).
La définition de modèles spécifiques à l'application se fait dans le fichier `models.py`. L'utilitaire Django `manage.py` permet la migration en base de données, c'est-à-dire la création des tables associées aux classes définies dans l'appli. Prenons l'exemple du modèle TODOTODOTODO
#### Templates
Langage procédural propre à django à l'intérieur des templates.
Il s'agit d'un langage à syntaxe restreintes, permettant d'effectuer des operations d'affichage et des opérations fonctionnelles et logiques simples avant génération de la page html.
Les templates Django sont un outil plus léger et plus simple d'utilisation que JSP, son équivalent J2E.
Prenons l'exemple d'un template utilisé pour l'application POC :
Fichier login.html :
`{% extends "manager_base.html" %}`
`{% load i18n %}`
`{% block content %}`
`<form method="post">`
`{% csrf_token %}`
`{{ form.as_p }}`
`<input type="submit" value="{% trans 'Log in' %}" />`
`</form>`
`{% endblock %}`
On remarque par exemple le *one-liner* `{{ form.as_p }}` permettant l'affichage d'un formulaire html à partir des différents attributs d'un objet Django de la classe `Form.forms`.
L'ajout du jeton CSRF en tant que balise cachée (*hidden tag*) du formulaire se fait par l'instruction `{% csrf_token %}`
Le template est ensuite traité par l'instruction `render` dans la vue associée, pour aboutir à la génération d'une page html présentée au client (traitement côté serveur, au même titre que les JSP).
Finalement, suivant le principe DRY propre à Django, les templates s'appeler les uns les autres à l'aide de la directive `extends`.
#### TemplateResponse
Dynamise la phase de création de la réponse HTTP après exécution de la vue associée. Fonctionnalité impossible à réaliser à l'aide de simples objets HttpResponse.
La manipulation des mixins se fait à l'aide de l'objet SingleObjectMixin et de SingleObjectTemplateResponseMixin.
TODO Si mixin associé à une ListView, alors MultipleObjectMixin.
### Remarques
L'interface Web d'administration et le compte *superuser* ne sont pas activés par défaut.
Page `/admin` pour la gestion des webapps.
Opérations CRUD : Create, Read, Update, Delete
La GUI est générée automatiquement en fonction des modèles de donnée de l'application, pourvu que ceux-ci aient été enregistrés au préalable (méthode `admin.site.register()`)
Champs `list_display`, `list_filter`, `date_hierarchy`, `ordering` et `search_fields` de la classe `admin.ModelAdmin`
Classe Q : requêtes avancées -> à lire
Appli ContentType pour les relations génériques
*template context processors*
*custom tags* utilisant la fonction *render*
django.db.models.signals
django.contrib.auth.models.User
## w.c.s / Passerelle