Cours Python pour débutant
(orientée web |
èque de la Faculté de Médecine / Université de Genève | |
1 |
Introduction à Python
)
Jan Krause / Biblioth
Qu'es-ce que Python?
Efficient + Rapide + Universel = Python
Quelles plate-formes?
UNIX (en général), Linux, Mac, Windows, Playstation (2 et PSP), QNX, Cray supercomputers, IBM mainframes, PDAs (PalmOS, iPods, iPhone, Windows Mobile), BeOS (Haiku), OS/2, etc.
Qui utilise python?
Google, YouTube, BitTorrent, Intel, HP, Cisco, IBM, UBS, NASA, Los Alamos, FemiLab, CERN, NSA (cryptanalyse), Industrial Light and Magic (StarWars, Forest Gump ), Canonical (Ubuntu), etc.
Python Software Licence (PSL), une licence open source, calquée | |
2 |
Licence ?
sur la licence Apache et compatible GNU GPL
700 |
3 |
Apprendre: un livre
Learning Python
Par Mark Lutz
Edition: 3, revised
Publié par O'Reilly, 2007
ISBN 9780596513986
pages
UNIGE, Bibliothèque d'Anthropologie
[lien sur le catalogue]
Cette pré ? Incontournable: ? Le module index (bibliothè ? Le tutorial ? Les howtos |
Apprendre: ressources web
sentation en ligne et les scripts donnés en exemple:
que standard)
4 |
? Dé:
les opérateurs: + nombres (entiers, flottants complexes) ex: n = 24 r = 3.1415 c = 1.5 + 2j ? ? listes: = [1, 'abc', 3.14] emboitées: ? = {'jan |
Types de données et opérateurs
- * / ** % and or not += -= *= /= **= ( )
chaînes de caractères ( 'abc' ou ''abc'' ou ''''''multi-lignes'''''' )
s = 'une chaîne\t' + ''une autre chaîne'' + '\nune autre linge'
L = [ [1, 2], 3 ]
dictionnaires (dont les entrées sont repérées par des clés)
': 74, 'aline':23, 'christian':None, 'z':[1, 2, 3]}
D['jan'] 74130?
A = True B= False fonctrions arithmétiques -> voir le module math: import math | |
5 |
? booléens
?
Types de données: plus sur les strings
Rechercher, remplacer splitter et joindre: le module string de la librairie standard import string s = "La connaissance s'acquiert par
l'expérience, tout le reste n'est que de l'information. Albert Einstein."
6 |
s.find('reste') s2 = s.replace('connaissance', 'savoir') liste_mots =s.split(' ')
' '.join(liste_mots)
Le module re expressions rationnelles >>> import re >>> u = "saf, sdf, sgf, fsdlkjlkdf, str" >>> r = re.compile(r's.f') >>> re.findall(r, u) |
Types de données: plus sur les strings expressions rationnelles (RegEx)
– regular expressions – de la
bibliothèque standard permet d'utiliser les
['saf', 'sdf', 'sgf']
Exemple: | |
7 |
Doc:
Types de données
Indexes des types de données composés (listes, chaines de caractères, ) : maîtriser le slicing.
Liste = [ 'zero' , 'un' , 'deux' , 'trois' , 'quatre' ]
Indices 0 1 2 3 4
Liste[0] 'zero'?
Liste[0:2] ['zero', 'un']?
Liste[1:2] 'un'?
Liste[-1] 'quatre'?
Liste[:2] ['zero', 'un']?
Liste[-2:] ['trois', 'quatre']? Liste[2:2] = 'un bis' insère en position 2? | |
8 |
Liste[2:2] = []
Méthodes et fonctions utiles: liste = [1, 2, 3, 4, 5, 6, 7, 'livre', 'livre'] Ajouter un élément à la fin: Extraire un élément: Compter le nombre d'occurrences: Trier les éléments: () |
Types de données: listes
Longueur de la liste (string, dictionnaire, ): l = len(liste)
list.append('nouvel élément')
element = (indice) n = list.count('livre')
list.reverse() | |
9 |
Renverser la liste:
Etc. ->
>>> import time >>> import datetime >>> now = >>> now.strftime("%Y-%m-%d %H:%M:%S" '2009-02-13 13:03:38' >>> now + datetime.timedelta(weeks=1) >>> >>> age_jan = now - naissance_jan >>> print(age_jan) |
Types de données: dates
()
) # datetime -> string
# ajouter une semaine
datetime.datetime(2009, 2, 20, 13, 3, 38, 412821)
naissance_jan = datetime.datetime(1978, 10, 19, 19, 15, 00)
17:48:38.412821 | |
10 |
11074 days,
>>> list = ['a', 'a', 'a', 'b', 'c', 'd'] >>> s = set(list) >>> s set(['a', 'c', 'b', 'd']) >>> t = set(['c', 'd', 'e']) >>> t.add(123) >>> t.remove(123) >>> s | t # UNION / OR set(['a', 'c', 'b', 'e', 'd']) >>> s ^ t set(['a', 'b', 'e']) |
Types de données: ensembles
# enlève les doublons -> chaque élément est unique
#XOR / dans l'un ou l'autre mais pas dans les 2 à la fois
# INTERSECT / AND | |
11 |
>>> s & t
set(['c', 'd'])
Lire un fichier: s = open( "", "r" ).read() Ou Ecrire dans un fichier |
Lecture / écriture de fichiers
# renvoie un string
lignes = open( "", "r" ).readlines() # liste de lignes
# si il existait déjà | |
12 |
f= open( "", "w" ).write( s ) # le fichier est écrasé
( Lire de l'UTF-8 import codecs Ecrire de l'UTF-8 import codecs |
Lecture / écriture: UTF-8 et autres encodages)
# module de la bibliothèque standard
s = ( "", "r", "utf-8" ).read()
# module de la bibliothèque standard
open( "", "w" ).write( s.encode( "utf-8" ) )
Conditions x = 24if x > 0: y = 1 / xprint( y ) x = 3232 Boucles For (sur tout type de séquences) |
Syntaxe: boucles et conditions
Les blocs de code sont définis par leur indentation (espaces depuis la marges). Les « : » introduisent un nouveau bloc.
Conditions if a==0: print('non')
elif a>0: print('oui')
else:
print('autre')
Boucles While
list = [0,1,2,3] for i in list: print(i) | j = 1 while j < 100: j += 1 print(j) | |
print(i) | 14 |
Les opérateurs booléens: < L'opérateur « in » ? 'a' in 'abc' > True ? 12 in [1, 12, 23] > True ? Remarque: |
Conditions
> <= >= == not and or
'jan' in {'jan':30, 'aline':30} > True
? Les chaines vides sont False, sinon True
? Nombres: 0 et 0.0 sont false, sinon True
? Listes et dictionnaires: si vides sont False, sinon True
de la mémoire, exemple: ? Variables n = 128 del(n) ? Entrées de dictionnaires d = {'a':1, 'b':2} del( d['a'] ) |
Gestion de la mémoire: del fait le ménage
« del » permet de libérer des variables modules et objets
? Eléments de listes
l = ['a', 'b', 'c']
del( l[0] )
del ( l )
( ? – Ne pas utiliser de 'tabs' ! ? – ? ? Début d'un script (*.py): |
Ecrire un script: coding style cf .PEP8)
Indentation par groupes de 4 espaces
Eviter les lignes qui « dépassent de l'écran »
On peut continuer un ligne logique sur la ligne suivante du script au moyen d'un « \ » Utiliser utf-8 pour l'encodage (pas de BOM)
#!/usr/bin/python Chemin de l'interpréteur
python
# -*- coding: utf-8 -*- Déclaration d'encodage, La ligne estpour python et l'éditeur commentée
Ecrire un script: éditeur
Choisir un environnement de développement approprié:
? Eclipse / PyDev ? Emacs
– Multi-platteformes
– Hautement configurable
– python_mode (ex: touche tab -> 4 espaces )
– PyMacs (macros d'emacs en python) ? Komodo (notamment windows) etc.
? | |
Votre éditeur préféré ..
? ? ? augmenter la lisibilité ? ? |
Fonctions, modules, packages
Ces structures permettent de structurer le code: éviter la duplication de code (redondance) simplifier la maintenance, le développement
décomposer une tâche complexe répartir le travail entre programmeurs
19 |
? cacher les détails de l'implémentation aux utilisateurs
def nom_fonction ( pa1, pa2, ) : """ Documentation """ corps de la fonction return variable |
Fonctions
Les blocs de codes sont définis par l'indentation du code.
def fib(n):
"""
Calcule la suite de Fibonacci jusqu'à n.
1, 1, 2, 3, 5 ,8 ,13, 21, 34
"""
a, b = 0, 1
output = []
while b <= n:
output.append(b)
return output fib(100) help(fib) | |
20 |
a, b = b, a+b
Modules
Permettent de regrouper les fonctions par thème dans des fichiers, les rendant ainsi réutilisables dans plusieurs programmes.
Un module, c'est simplement un fichier .py qui contient plusieurs fonctions, générateurs et/ ou classes!
Modules
Exemple d'architecture d'un programme en python:
Packages
Le packages sont des ensembles de modules.
Package sound
Concrètement, il s'agit simplement de répertoires
contenant plusieus sound/ Toplevel package
modules.
formats/ Subpackage 1
Pour consulter la structure d'un package, d'un module, ou d'un objet:
import os
effects/ Subpackage 2
dir( os )
help(os.chdir) Fichier vide qui indique à python que ce répertoire
est un package Module reverse
Comment importer un module? import os os.chdir('/home/jan') Une fonction dans un module? from os import chdir chdir('/home/jan/') Un packgage? import sound |
Fonctions, modules, packages
# NB: on laisse tomber le .py de
import sound.effects #importer le sous paquet | |
24 |
Programmation orientée objet
On peut tout à fait s'en passer en python!
Mais on a beaucoup à y gagner!
? Permet de minimiser la redondance;
? Permet d'écrire de nouveaux programmes en jouant sur l'héritage du code existant et sa personnalisation plutôt qu'en le réécrivant;
? Profiter des web-frameworks OO du type (voir ci-après: tutorial Django). Ruby on Rails fonctionne aussi sur ce principe.
? Faire abstraction du SQL (voir ci-après ORM: object relaitonal mapping).
? monde physique – article ? un objet est définit par un méthodes des attributs ? |
Programmation orientée objet: terminologie
un objet représente un concept ou toute entité du
Exemple: une voiture, une pensée, une personne, une fleur, une encyclopédie, un codex, un
identifiant unique, des
(fonctions s'appliquant à lui-même), et (variables propres à lui-même);
classe peut hériter des propriétés (méthodes, d'une ou de plusieurs autres classes. | |
26 |
un objet est dérivé d'une classe: on dit qu'un objet est une instance d'une classe;
? une
attributs)
class Plante: stockEnergie = 1
class Orobanche(Plante):
plante0 = Pulmonaire()
des classes. try: try: a = 1 / 0 except: print('Une erreur!') |
Gestion des exceptions
Lors qu'une erreur survient, python permet d'exécuter des instructions spécifiques. Les exceptions sont
a = 1 / 0
except ZeroDivisionError:
print('Division par zéro!')
except:
print('Problème indéterminé!')
De l'aide? Liste des exceptions.
) | |
28 |
import exceptions help(exceptions
Ou trouver des modules?
Python vient avec de nombreux modules, c'està-dire la bibliothèque standard.
De plus, de très nombreux modules sont disponibles via plusieurs sources, voir par exemple le Python Package Index (PyPI)
Et encore de nombreux modules disséminés sur le web (sourceforge, google code, )
Utilisez Ubuntu (ou Debian)! – Riche sélection: 1325 paquets liés à python – Les paquets en C sont précompilés – Installation ? en un clic avec synaptic ? – Mise-à-jour automatique (gestionnaire de paquets python |
Acquérir des modules
Acquérir des modules python en toute simplicité?
en une commande: apt-get install <paquet>
Alternativement, utiliser easy_install / setuptools
).
– Multi-platte-forme: Windows, MacOSX, Linux (aussi sous Ubuntu)
Gestion des dépendances Distibs Python: PythonXY (win, libre) ; Enthought (win/mac, commercial) | |
30 |
–
–
? Opérations de haut-niveau ? ? Exemples: (src, dst) shutil.copytree(src, dst) |
Opérations sur le système de fichiers
Module shutils (bibliothèque standard)
# copie de src vers dst # copie récursive
shutil.copytree(src, dst, shutil.ignore_patterns('*.pyc', \
'tmp*') )
# déplacement récursif | |
31 |
shutil.rmtree(path) # effacement récursif (src, dst)
? Multiprotocole (ftp, http, file, ) ? Envoi de formulaires par POST et GET ? ? ? HOWTO: ? Exemple simple: |
Accéder à internet : urllib2
Le plus simple: urllib2 (Bibliothèque Standard)
Supporte authentification, user-agent, etc.
Mais relativement de bas niveau => beaucoup de code
html = urllib2.urlopen('').read() | |
32 |
import urllib2
Un navigateur programmable: ? Module: mechanize ? Package Ubuntu: python-mechanize ? URL: Fonctionnalités: ? Remplissage de formulaire simplifiée. ? Système de parsing et de suivi des liens ? Historique (méthodes .back() et .reload() ). ? Prise en compte automatique de |
Accéder à internet : mechanize
?
Gestion automatique de HTTP-Equiv et Refresh | |
33 |
Exemple:
Beautifulsoup règle ces soucis ? module: beautifulsoup ? Package ubuntu: python-beautifulsoup ? URL: |
Parser du HTML
HTMLparser (Bibliothèque Standard)
Permet de parser du HTML mais n'est pas tolère mal les horreurs que l'on trouve sur le web (les navigateurs sont tolérants): balises non fermés, overlappées, etc.
?
Fonctionne aussi pour le XML mal formatté! | |
34 |
? Exemple:
Recherche via des API: ex Yahoo
? Module: pysearch
? URL: ? Exemples:
–
–
35 |
Module: feedparser Package Ubuntu: python-feedparser URL: d = feedparser.parse(' for entry in d['entries']: |
RSS : feedparser & pyrss2gen
')
print( entry['title'] + ' -> ' + entry['link'] )
NB: Pour générer des fils RSS: python-pyrss2gen | |
36 |
Exemple:
Module: smtplib (biblio std.) Exemple Basiquement: s = () s.connect() s.close() NB: |
Envoyer des Emails
s.sendmail( '', [''], ' le message ' )
Sendmail doit être configuré Penser aux headers (cf. exemple) Relever une boite POP ou IMAP : imaplib (bib. Std.) | |
37 |
?
?
?
Traiter des méta-donées: XML
Python vient avec des parseurs DOM et SAX.
Exemple d'utilisation de DOM (lecture/écriture) ?
Mais également:
? XSLT : python-libxslt1 (package Ubuntu)
– Utile pour réutiliser stylesheets standards:
–
? SQLite (stockage dans des fichiers) – Module: sqlite3 – biblio. std. ? PostgresSQL, – Module: pygresql – URL: – Package Ubuntu: python-pygresql ? MySQL, – Module: MySQLdb – Package Ubuntu: python-mysqldb |
Bases de données
Python supporte les principaux SGBDR:
– Et encore
? Oracle,
? Sybase,
? DB2
Exemple avec MySQLdb: | |
39 |
– URL:
Générer des documents: reportlab
Module: reportlab
Package Ubuntu: python-reportlab
URL:
? Solution très complète de génération de PDF
? « Bas niveau » et templating de texte et tables avec « platypus »
? Il s'agit d'un module compilé en C++
? Exemples ./documents/reportlab*
40
URL: ? ? ? |
Générer des documents: pod (appy)
Module: pod (Python Open Document)
Pod permet de générer des documents ODF (odt, ods, )
Il se base sur des templates dans les même formats, édités à l'aide d'OpenOffice. C'est très confortable!
Les variables python sont entrées en mode « change » activable depuis le menu « Edit / Changes / Records>
Pod permet aussi de créer des tables et de faire des boucles en mettant du code python dans des notes Exemple: ./documents/pod* | |
41 |
?
?
Module: uno Package Ubuntu: python-uno URL: ? Uno permet de – – ? – – |
Générer des documents: uno-bridge
Piloter Open Office (tâche de fond par exemple)
D'utiliser des macros python dans OOo
Il permet d'exploiter les nombreuses fonctionnalités d'OOo
Génération de documents bureautiques textes, tableur,
Conversion de formats: word, excel, odt, ods,
– Production de PDF
Diffs, extraction de texte (pour indexer p.ex.) Exemples: ./documents/uno* || utilisé pour OOo Zotero Plugin NB: python-ooolib permet créer des docs ODF sans open office | |
42 |
? | |
–
?
Python Image Library (PIL)
Package: PIL
Package Ubuntu: python-imaging Manipulaiton d'images.
Exemples: ./imaging/*
NB:
Alternative à PIL: contrôler ImageMagick: python- | |
43 |
? Les « nouveaux » plugins de The Gimp (le PhotoShop libre) sont en python!
?
pythonmagick
Matlab-like: matplotlib
Module: matplotlib
Package Ubuntu: python-matplotlib
URL:
Calcul scientifique, production de graphiques, et manipulaiton d'images.
44 |
Matplotlib est très puissant et rapide (compilé en C). Il reprend de nombreux concepts, fonctionnalité, mots réservés et syntaxe de matlab!
Exemples: ./matplotlib/*
? Gaming ! ? SSH: Paramiko ? Son: sunau, pyao, etc. ? Hashs: Sha, md5 ? Bluetooth: lightblue, PyBluez ? Interfaces: Curses, WX, Gtk ? ? Bioinformatique: Biopython ? |
Autres modules intéressants
Compression: Gzip, zlib, zipfile, tarfile
Statistique: Rpy (pilotage de GNU R-project)
Calculs symboliques: Sympy (primitive, résolutions d'équations, simplifications, ) Graphes (réseaux): neworkX | ||
45 |
?
?
Inkscape : The Gimp : Blender : animations en 3D : plugins en python NodeBox (Mac/Carbon) : OpenOffice : permet d'écrire des macros en python Bibus : logiciel de gestion de références bibliographiques Zotero: ref. biblio., Open Office Plugin PyBliographer: PyBibTex: Calibre: |
Applications utilisant python
logiciel de dessin vectoriel, retouche de PDF, SVG, etc. Extensions en python! manipulation d'images, plugins en python
animation en 3D basé sur python
ref. biblio., nombreuses formats, conversio
Amélioratoin de BibTex en python (plus de formats, etc.)
managment d'ebooks Bazaar :
versionning décentralisé, simple à utiliser! Par Canonical (Ubuntu 9.04) search your personnal web visualisation de molécules en 3D. | |
46 |
MindRetrieve :
PyMol :
python. Il existe plusieurs stratégies: ? CGI (common gateway intreface) – – – ? Apache: mod_python, FastCGI, etc. – – |
Python et le web / bas niveau
La plupart des serveurs HTTP, comme Apache, sont écrits en C++, et nécessitent donc un pont pour exécuter du
OBSOLETE !
Lent: un interpréteur exécuté par requête
Pas pratique: peu (ou pas!) d'aide au développement
Rapide: différentes stratégies pour contourner le problème de CGI (NB: aussi plus rapide que PHP!) Mais peu d'outils d'aide au développement
? WSGI (Web Server Gateway Interface) – LA BONNE SOLUTION !
– Standardisation des ponts de bas niveau
(authentification/session, upload fichiers, connexion BD ) – Nombreux serveurs compatible en python et Apache
– Les frameworks web sont tous compatibles WSGI
? | – Django : simple à apprendre ? ? ? ? ? GoogleAppEngine: – Pylons : le plus flexible ? |
Python et le web / haut-niveau
Il existe de nombreux frameworks web python déployables par WSGI. Il s'agit d'environnements de développements complets.
Constitué d'éléments fortement couplés (écrits exprès)
ORM (object relational mapping) puissant et simple à utiliser Interface d'administration online (y.c. édition de données) Le templating nécessite peu de conaissances en python.
Zope (Commence à se faire vieux et pas d'ORM) -> cf. Plone | |
48 |
On peut choisir chaque composant (nombreuses possibilités) ? Et donc, très puissant mais complexe à maîtriser!
– CherryPy -> cf. Skeletonz
–
? Module: django
? Paquet Ubuntu: python-django
? URL:
? Tutorial:
? Ci-après: ce tutorial en condensé, adapté sur
Ubuntu
? Lié à l'exemple ./django/*
De l'intérêt d'utiliser Django:
? Applications portables (grâce au WSGI)
? Développement plus rapide, car aide intégrée:
– Authentification, internationalisation, file upload, gestion/validation de formulaires, templating des pages, ORM, RSS, envoi emails
? Nombreux outils additionnels disponibles pour enrichir vos applications:
Ex: wikis, blogging, micorblogging, registration, notification, avatars, smileys, visitor tracking, watermarking, version control, email-to-a-friend, | |
50 |
– ;term=django&submit=search
–
Dans un répertoire:
django-admin startproject monsite
Que ce passe-il? Django crée le projet:
monsite/ Signale un package python (est vide!)
Outil linge de commande pour interagir avec Django
Fichier de configuration de Django
On lance le serveur: python runserver 8080 Configuration : éditer DATABASE_NAME = './sqlite3/db.sqllite' ( |
Python et le web / Django
DATABASE_ENGINE = 'sqlite3' # MySQL, Oracle, Postgres optionnel cf. aussi: TEMPLATE_DIRS et INSTALLED_APPS)
52 |
Initialiser les BD et password admin python syncdb
Pas besoin de relancer le serveur :-)
Python et le web / Django
Créer une application ( plusieurs applis par projet possibles ): python startapp polls
Que ce passe-il? Django crée une application:
polls/ Signale un package python (est vide!)
Strucure des données (modèle orienté objet)
~ Contenu des « pages ». Une fonction par « page »
Django respecte le principe MVC (séparation de MVC )
Vue: interface utilisateur = présenter les données, etc. Contrôleur: gestion des évènements + màj vue et modèle | ||
53 | ||
? Modèle: traitement des données, etc.
?
?
? ? Création de classes de données ? Object relationnal mapping: ? ? Activation des modèles python sql polls |
Python et le web / Django - Modèles
Créer la structure de données:
Voir fichier modèle simplifié
Les classes correspondent aux tables SQL
Leurs attributs correspondent aux colonnes
54 |
-> détermine et affiche le SQL adéquat python syncdb -> remet les tables à jour
python shell >>> from monsite.polls.models import Poll, Choice >>> from datetime import datetime >>> >>> p.save() >>> p.id 1 >>> p.question 'Quoi de neuf ?' |
Python et le web / Django: API
# un shell pyhton normal, mais avec les bon paths
p = Poll(question="Quoi de neuf ?", ()) # revient à faire un INSERT en SQL ici on a instancié un objet
# contrairement à SQL, avec ORM il faut sauver
# La clé primaire? A été attribuée (genre AUTOINCREMENT)
p.question = 'Quoi de neuf ????????' # revient à faire un UPDATE # mais c'est plus court :-) () | |
>] | 55 |
[< |
>>>
>>> p.save()
>>>
Poll: Quoi de neuf ????????
>>> p = (pk=1) >>> p.was_published_today() False >>> p.choice_set <Choice: Pas grand chose> >>> >>> c.poll # <Poll: Quoi de neuf ????????> >>> () |
Python et le web / Django: API
# on fait un 'SELECT' sur la pk (primary key)
# on appelle notre méthode de
.create(choice='Pas grand chose', votes=0) # on fait INSERT
c = p.choice_set.create(choice='Il se fait tard', votes=0) # on fait INSERT
# API d'accès au poll associé depuis un choix (fait une jointure), ex:
SELECT Poll.question FROM Choice, Poll WHERE =
# et vice-versa_ access aux choices assoiciés a un poll
Choice: Pas grand chose>, <Choice: Le ciel>, <Choice: Il se fait tard>] # finalement, on supprime le choix qu'on vient de créer! Choice.objects.filter(poll__pub_date__year=2009) # SELECT WHERE .. | . |
Choice: Pas grand chose>, <Choice: Le ciel>, <Choice: Il se fait tard>] | 56 |
[< |
[<
>>> c.delete()
>>>
Cf. ( |
Python web / Django: URLs mapping
Le principe: renvoyer vers la bonne « page » fonction) selon l'URL. Pour ce faire des
expressions rationnelles sont utilisées.
On précise une liste d'expression rationnelles correspondant chacune à une fonction. Django les parcourt dans l'ordre et, c'est le premier match qui détermine la fonction choisie.
(r'RegExp', 'fonction.a.appeler') , ) | |
58 |
Syntaxe :
patterns ( '',
- Cf. - - from import HttpResponse def index(request): return HttpResponse("Hello World!" |
Python web / Django: les vues
Chaque fonction correspond à une « page ».
Exemple le plus simple possible de :
)
59 |
? def login_view(request): return render_to_response(' ? ( ? |
Python / Django: vues et templating
Les vues peuvent appeler des templates:
Un template Un dico de variables
', { vars })
Les templates servent à présenter, pas à programmer: ce n'est pas la même chose que l'on rencontre souvent en PHP mélange de logique et présentation, sauf )!
Ils sont basés sur le HTML, et permettent:
– De définir une hiérarchie de templates (par héritage)
D'y intégrer des variables, et de les reformater avec filtres De faire des boucles (for), des tests (if/else) | |
60 |
–
–
Python / Django: vues et templating
? Exemple de template:
Une variable
<html>
<head><title>{{story.headline}}</title></head>
<h1> {{story.headline|upper}} </h1> {% for paragraph in story.pagagraphs %} Un filtre, autre ex:
| striptags
<p>{{paragraph}}</p>
| lower
{% endfor %}
</html>
NB: if à le même genre de sytaxe | |
61 |
Une boucle for
{% block content %} {% for entry in blog_entries %} <h2>{{ entry.title }}</h2> <p>{{ }}</p> {% endfor %} {% endblock %} | ||
62 |
Master template ()
<head>
<link rel="stylesheet" href="" />
</head>
<body>
<div id="sidebar">
{% block sidebar %}
<li><a href="/">Home</a></li>
</ul>
{% endblock %}
<div id="content">
</div>
</body>
</html>
Créer un user: >>> >>> >>> () Mettre à jour un user: >>> >>> u.set_password('new password' |
Python web / Django: autentification
from .models import User user = User.objects.create_user('jan', \
'', 'cccccc') # cccccc = pwd
u = (username__exact='jan')
)
>>> u.save()
u.delete() | |
63 |
Pour supprimer un user:
Login = 'jan' Pwd = 'cccccc' Pour tester cela: ? |
Python web / Django: autentification
Voir les vues correspondantes dans l'exemple (). http://127.0.0.1:8080/polls/restricted
http://127.0.0.1:8080/polls/logout | |
64 |
?
L'intérêt d'un framework est de se simplifier le travail. Exemple avec les formulaires.
Définir un formulaire est plus simple et plus clair qu'en HTML ou qu'en PHP A mettre dans :
NB: Permet une
from django import forms
vérification
class ContactForm(): auto de la
validité!
def contact(request): if request.method == 'POST': form = ContactForm() if form.is_valid(): # |
Intégration du formulaire dans une vue ()
# si qqn à cliqué sur envoyer
# on traite les données du FORM
# toutes les règles de validité sont testées!
# utiliser les données nettoyées: form.cleaned_data subject = form.cleaned_data['subject']
return HttpResponseRedirect('/thanks/') # redirection else: # sinon on affiche un formulaire vide | ||
form = ContactForm() | ||
66 | ||
return render_to_response('', { 'form': form,}) |
Templating d'un formulaire) ajouter les balises <form>: <form action="/contact/" method="POST" {{ form.as_p }} <input type="submit" value="Submit" / </form> |
Django s'occupe de créer les champs il nous reste à
>
>
67 |
d'upload qui ressemble à cela: < <input type="submit" value="Upload" /> </form> def directupload(request): if request['method'] == 'POST': if 'file' in request.FILES: file = request.FILES['file'] |
Python web / upload de fichiers
Créer une vue et un template pour produire un formulaire
form action="URL_de_la_vue" method="post" enctype="multipart/form-data">
Les fichiers uploadés sont stockés dans 'request', donc créer un vue du style (attention à la sécurité!!):
filename = file['filename'] open('/chemin/stockage/' + filename, 'w').write(file['content']) return http.HttpResponseRedirect('une_URL_quelconque') | |
68 |
from reportlab.pdfgen import canvas from import HttpResponse def une_vue(request): p = canvas.Canvas(response) p.drawString(100, 100, "Hello world!") |
Python web / Django: création de PDF
Via une vue et n'importe quel outil python (p.ex. reportlab):
response = HttpResponse(mimetype='application/pdf') response['Content-Disposition'] = 'attachment; ' +\ 'filename = '
69 |
#objet HttpReponse comme fichier p.showPage()
Exemple: Les composants impliqués: ? adapté au JavaScript ? La vue ajax_exemple (cf. ) ? Le toolkit AJAX Yahoo: ? |
p.save() return response Python web / Django: AJAX
Cela fonctionne avec AJAX (Asynchronus Javascript and XML), et en pur Django si JavaScript est désactivé.
Côté python, on utilise simplejson. JSON est un format d'échange,
La partie JavaScript:
Une façon plus simple de faire de l'AJAX avec Django? | |
70 |
? Attention: le service statique ne fonctionne qu'en mode dvpt.
Utiliser la bibliothèque jQuery p.ex.:
Wiki: moin-moin , , , Divers: ajaxterm, GNU mailman |
Exemples d'applications web
,
CMS: Skeletonz, Plone (sous Zope)
Bibliothèques: CDS Invenio , Organisation: Indico
(Swisslib, Unilist)
http://localhost:8022 (pur AJAX, semblable au Google Web Toolkit) || || | |
71 |
sudo apt-get install ajaxterm || sudo /etc/init.d/ajaxterm start
Pyjama