Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
Bonnegent Sebastien
cours_django
Commits
3ad5a327
Commit
3ad5a327
authored
Oct 25, 2018
by
Bonnegent Sebastien
Browse files
Merge branch 'master' of gitlab.insa-rouen.fr:bonnegent/cours_django
parents
5be88646
1eb312ab
Changes
5
Hide whitespace changes
Inline
Side-by-side
README.md
View file @
3ad5a327
...
...
@@ -7,10 +7,11 @@ par séance.
Installation sur une fedora 27
==============================
dnf install pandoc pandoc-pdf texlive-latex-bin-bin texlive-beamer
~~~
$ dnf install pandoc pandoc-pdf texlive-latex-bin-bin texlive-beamer \
texlive-wasysym texlive-collection-langfrench impressive texlive-wasy
git clone git@gitlab.insa-rouen.fr:bonnegent/cours_django.git
$ git clone git@gitlab.insa-rouen.fr:bonnegent/cours_django.git
~~~
Le répertoire pdf/ contient les présentations et les répertoires cours_XX
...
...
cours_01.md
View file @
3ad5a327
...
...
@@ -310,10 +310,11 @@ class Garage(models.Model):
~~~
{.py .numberLines}
>>> grg, flag = Garage.objects\
.get_or_create(nom="L'autre fils")
>>> Garage.objects.filter(nom__contains="Autre")
>>> Garage.objects.filter(nom__icontains="Autre")
>>> Garage.objects.filter(mail__endswith=".fr")\
.filter(adresse__contains="Rouen")
>>> filtre = Garage.objects.filter
>>> filtre(nom__contains="Autre")
>>> filtre(nom__icontains="Autre")
>>> filtre(mail__endswith=".fr")\
.filtre(adresse__contains="Rouen")
~~~
. . .
...
...
cours_02.md
View file @
3ad5a327
...
...
@@ -22,7 +22,6 @@ System check identified no issues (0 silenced).
September 28, 2017 - 13:29:48
Django version 1.11, using settings 'monsite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
~~~
## Consultation
...
...
@@ -40,7 +39,8 @@ $ pipenv run ./manage.py createsuperuser
### garage/admin.py
~~~
python
from
.models
import
Garage
,
Vehicule
,
AFaire
,
Entretien
from
.models
import
Garage
,
Vehicule
,
AFaire
,
\
Entretien
admin
.
site
.
register
(
Garage
)
admin
.
site
.
register
(
Vehicule
)
...
...
@@ -67,270 +67,84 @@ admin.site.register(Entretien, EntretienAdmin)
# MVC
## Rappel de l'arborescence
\c
enter
\i
ncludegraphics[height=3.5cm]{images/tree-webui.png}
## Modèle Vue Contrôleur
### Modèle
-
webui
/models.py
-
garage
/models.py
-
logique métier
-
intelligence
. . .
### Vue
-
webui/views.py
-
templates
-
conf/urls.py
-
webui/urls.py
-
garage/templates
. . .
### Contrôleur
-
Django
-
garage/views.py
# Factorisation
## Constat
### Plusieurs classes avec un attribut nom
-
Adresse
-
Groupe
-
Service
-
Modele
-
Parefeu
## Création d'une classe abstraite
### webui/models.py
~~~
{.py .numberLines}
class AvecNom(models.Model):
"""Classe abstraite pour les objets ayant un nom"""
nom = models.CharField(default="", max_length=25)
class Meta(object):
abstract = True
ordering = ("nom", )
## Définition
def __str__(self):
return "%s" % self.nom
class Service(AvecNom):
### Wikipedia
~~~
# Interface d'admin
## Version simple
### webui/admin.py
~~~
{.py .numberLines}
from django.contrib import admin
from .models import Port
admin.site.register(Port)
https://fr.wikipedia.org/wiki/Modèle-vue-contrôleur
~~~
. . .
### Pour y accéder
~~~
$ ./manage.py runserver
$ # ouvrir la page http://localhost:8000/admin
~~~
\c
enter
\i
ncludegraphics[height=2.5cm]{images/admin-port-default.png}
## Version personnalisée
### webui/admin.py
~~~
{.py .numberLines}
class PortAdmin(admin.ModelAdmin):
list_display = ('debut', 'fin',
'protocole')
## Routage d'URLs
### conf/urls.py
~~~
python
from
django.contrib
import
admin
from
django.urls
import
path
admin.site.register(Port, PortAdmin)
urlpatterns
=
[
path
(
'admin/'
,
admin
.
site
.
urls
),
~~~
\c
enter
\i
ncludegraphics[height=2.5cm]{images/admin-port.png}
## Service #1
### Service
-
nom: chaine de caractères (25)
-
ports: une liste de ports
. . .
### webui/models.py
~~~
{.py .numberLines}
class Service(AvecNom):
ports = models.ManyToManyField(Port)
~~~
## Ajouter des données
### /admin/
-
ajouter les ports suivants:
-
22/tcp
-
25/tcp
-
80/tcp
-
123/tcp
-
123/udp
-
389/tcp
-
443/tcp
-
ajouter les services:
-
ssh: 22/tcp
-
ldap: 389/tcp
-
web: 80/tcp, 443/tcp
-
ntp: 123/udp, 123/tcp
## Service #2
### Pour la suite
~~~
{.py .numberLines}
>>> web = Service.objects.get(nom="web")
>>> p22 = Port.objects.get(debut=22)
>>> p80 = Port.objects.get(debut=80)
>>> p443 = Port.objects.get(debut=443)
~~~
## Service #3
### Utilisation 1/2
~~~
{.py .numberLines}
>>> web.ports.add(p80, p443)
>>> web.ports.all()
<QuerySet [<Port: 80(tcp)>, <Port: 443(tcp)>]>
>>> # pas d'élèments en double
>>> web.ports.add(p22)
>>> web.ports.all()
<QuerySet [<Port: 22(tcp)>, <Port: 80(tcp)>,
<Port: 443(tcp)>]>
>>> web.ports.remove(p22)
>>> web.ports.all()
<QuerySet [<Port: 80(tcp)>, <Port: 443(tcp)>]>
~~~
## Service #4
### Filtrage
~~~
{.py .numberLines}
>>> filtre = Service.objects.filter
>>> # recherche dans les élèments M2M
>>> filtre(ports__debut__gt=80)
<QuerySet [<Service: web>]>
>>> filtre(ports__debut__gt=22)
<QuerySet [<Service: web>, <Service: web>]>
>>> filtre(ports__debut__gt=22).distinct()
<QuerySet [<Service: web>]>
~~~
## Ajouter des informations
### webui/admin.py
~~~
{.py .numberLines}
from .models import Service
class ServiceAdmin(admin.ModelAdmin):
list_display = ('nom', 'liste_des_ports')
admin.site.register(Service, ServiceAdmin)
~~~
python
path
(
''
,
include
(
'garage.urls'
)),
]
~~~
. . .
## Routage d'URLs #2
### garage/urls.py
~~~
python
from
django.urls
import
path
from
.
import
views
### webui/models.py
~~~
{.py .numberLines}
def liste_des_ports(self):
return ", ".join([str(p)
for p in self.ports.all()])
urlpatterns
=
[
path
(
''
,
views
.
home
,
name
=
'home'
),
]
~~~
# Règles
## La classe Règle
-
priorite: un entier positif
-
groupe: un groupe d'adresse
-
services: une liste de Service
-
interface: une chaine de caractères (25)
-
actif: un booléen
-
sens: un élément de la liste Input, Forward, Output
## Contrôle
### garage/views.py
~~~
python
from
django.http
import
HttpResponse
. . .
### webui/models.py
~~~
{.py .numberLines}
SENS = (('i', 'Input'),
('f', 'Forward'),
('o', 'Output'))
def
home
(
request
):
"""Page d'accueil"""
return
HttpResponse
(
'ça marche !'
)
~~~
## Implémentation
### webui/models.py
~~~
{.py .numberLines}
class Regle(models.Model):
priorite = models.PositiveIntegerField(default=0)
groupe = models.ForeignKey(Groupe,
blank=True,
null=True)
services = models.ManyToManyField(Service)
interface = models.CharField(default="",
max_length=25,
blank=True)
actif = models.BooleanField(default=True)
sens = models.CharField(max_length=1,
choices=SENS,
default="i")
~~~
## Vue
## Factorisation
### TODO
-
bootstrap
-
template par défaut
Les classes Modele et Parefeu partagent:
-
nom: une chaine de caractères (25)
-
regles: une liste de règles
-
modification: DateTime de la dernière modification
## Classe abstraite
~~~
python
from
django.shortcuts
import
render
### webui/models.py
~~~
{.py .numberLines}
class AvecRegles(AvecNom):
modification = models.DateTimeField(auto_now=True)
regles = models.ManyToManyField(Regle, blank=True)
from
.models
import
Question
class Meta(object):
abstract = True
def nombre_de_regles(self):
return self.regles.count()
def
index
(
request
):
latest_question_list
=
Question
.
objects
.
order_by
(
'-pub_date'
)[:
5
]
context
=
{
'latest_question_list'
:
latest_question_list
}
return
render
(
request
,
'polls/index.html'
,
context
)
~~~
## À faire
### https://docs.djangoproject.com/fr/
-
Parefeu
-
nom
-
regles
-
modification
-
modele: un Modele
-
admin: un User
-
Modele
-
nom
-
regles
-
modification
-
description: chaine de caractères (125)
-
compléter webui/admin.py
pdf/02.pdf
View file @
3ad5a327
No preview for this file type
plan.md
View file @
3ad5a327
...
...
@@ -15,6 +15,8 @@
*
outils et frontend
-
administration, runserver, urls, logs et messages / templates ?
> urls comment est fait la résolution ?
## En attente
*
premières vues
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment