Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Newer
Older
100644 301 lines (179 sloc) 14.991 kB
4bd0043 @five3 add new tutorial file under /doc/0.3/ folder
five3 authored
1 ---
2 layout: default
3 title: web.py 0.3 tutorial
4 ---
5
6 # web.py 0.3 tutorial
7
8 Autre langages : [english](/tutorial3.en) | [chinese](/tutorial3.zh-cn) | [japan](/tutorial2.ja) | ...
9
10 # Sommaire
11
12
13 * <a href="#introduction">Prérequis</a>
14 * <a href="#manipurl">Manipuler les URLs</a>
15 * <a href="#gereurl">Gérer les URLs</a>
16 * <a href="#getpost">GET et POST : la différence</a>
17 * <a href="#index">Page index - ma première classe</a>
18 * <a href="#lance">Lancer le serveur</a>
19 * <a href="#template">Modèles, gabarits</a>
20 * <a href="#formulaires">Formulaires</a>
21 * <a href="#bd">Base de données</a>
22 * <a href="#affbd">Afficher le contenu d'une base de données</a>
23 * <a href="#ecrbd">Ecrire dans une base de données</a>
24 * <a href="#debug">Debugger</a>
25 * <a href="#apres">Et Après ?</a>
26
27 <a name="introduction"></a>
28 # Prérequis
29
30
31
32 Vous connaissez Python et vous désirez construire un site web. Webpy vous permettra de le faire facilement.
33
34 Si vous décidez de suivre l'ensemble de ce tutorial, vous aurez besoin d'installer Python, [web.py] (/install/fr) , flup, psycopg2 et Postgres (ou une base de donnée equivalente et les pilotes python). Pour plus de détails, veuillez consulter [webpy.org](http://webpy.org/)
35
36 Si vous possédez déjà un projet web.py existant, jetez un oeil à la page de [mise à jour](http://webpy.org/docs/0.3/upgrade) pour plus d'informations sur la migration.
37
38
39 # Commençons
40
41
42 <a name="manipurl"></a>
43 ## Manipuler les URLs
44
45 La partie la plus importante de n'importe quel site web est la structure des URLs. Les URLs ne sont pas que des liens que vos visiteurs voient et envoient par mails à leurs amis, elles fournissent aussi un modèle mental sur la façon avec laquel un site web fonctionne. Sur des sites populaires tels que del.icio.us, les URLs font partie même de l'interface utilisateur. Web.py rend la création d'URLs facile.
46
47 Pour commencer avec votre application web.py, ouvrez un nouveau fichier texte (que nous appelerons "code.py") et tapez:
48
49 import web
50
51 Cela importera le module web.py.
52
53 Maintenant, Nous devons donner à web.py notre structure URL. Commençons avec quelque chose de simple:
54
55 urls = (
56 '/', 'index'
57 )
58
59 La première partie est une expression régulière que l'on applique à une chaîne de caractère (l'URL), telle que /, /help/faq, /item/(\d+), etc.. (Note: \d+ n'admettra qu'une séquence de chiffre). Les parenthèses signifient qu'il faut capturer la séquence pour s'en servir plus tard. La seconde partie est le nom d'une Classe vers laquelle la requête sera envoyée, comme 'index', 'view', 'welcome.hello' (qui recherchera la Classe hello du module welcome.), ou get_\1.
60 /1 est remplacé par la première capture de l'expression régulière; toutes les captures restantes seront passées à votre fonction. [Note traducteur : A préciser]
61
62 Cette ligne signifie que nous souhaitons l'URL / (Note: la page d'accueil) qui doit être traitée par la classe nommée 'index'.
63
64 <a name="gereurl"></a>
65 ## Gérer les URLs
66
67 Maintenant, nous avons besoin de créer une application spécifiant les URLs.
68
69 app = web.application(urls, globals())
70
71 Cela explique à web.py qu'il faut créer une application avec les URLs qui sont listées ci-dessus, en appelant les Classes dans l'espace de noms global de ce fichier.
72
73 <a name="getpost"></a>
74 ## GET et POST: la différence
75
76 Alors que la plupart des gens ne le remarquent pas en naviguant simplement, votre navigateur utilise un protocole connu appelé HTTP pour communiquer avec le World Wide Web. Les détails ne sont pas importants, mais l'idée de base est que les visiteurs de sites web demandent aux serveurs de sites web de remplir certaines fonctions (telles que GET ou POST) sur les URLs (comme / ou /foo?f=1).
77
78 GET est celle que nous connaissons tous, celle qui sert à demander le texte d'une page web. Lorsque vous tapez 'harvard.edu' dans votre navigateur, cela demande littéralement au serveur web de Harvard de fournir /. La seconde fonction très célèbre, POST, est souvent utilisée lorsque vous utilisez certains types de formulaires, comme une demande d'achat d'un produit. Vous utilisez POST chaque fois que vous soumettez une demande (comme le débit de votre carte de crédit et le traitement d'une commande). Cela est essentiel, parce que GET URLs peut être transmis et indexé par les moteurs de recherche, que vous voulez certainement pour la plupart de vos pages, mais ne désirez certainement pas pour des choses comme le traitement des ordres (imaginez si Google essaye de tout acheter sur votre site!)
79
80
81 <a name="index"></a>
82 ## Page index - ma première classe
83
84 Dans notre code web.py, nous faisons la distinction entre les deux clairement. Maintenant, il est nécessaire d'écrire la Classe 'index'.
85
86 class index:
87 def GET(self):
88 return "Hello, world!"
89
90 Cette fonction GET sera maintenant appelée par web.py chaque fois qu'il y aura une requête GET pour /.
91
92 Très bien, maintenant nous avons juste besoin d'en finir avec une ligne finale disant à web.py de commencer à fournir des pages web:
93
94 if __name__ == "__main__": app.run()
95
96 Cela explique à web.py qu'il faut lancer l'application que nous avons créé ci-dessus.
97
98 Maintenant notez que, bien que j'ai beaucoup parlé ici, nous avons seulement cinq ou six lignes de code tout au plus. C'est tout ce dont nous avons besoin pour créer une application web.py complète.
99
100 <a name="lance"></a>
101 ## Lancer le serveur
102
103 Si vous allez dans votre terminal et que vous tapez les lignes de commande suivantes :
104
105 $ python code.py
106
107 Vous verrez s'afficher : http://0.0.0.0:8080/
108
109 Vous avez maintenant votre application web.py qui tourne comme un vrai serveur web sur votre ordinateur!
110
111 En visitant cette URL, vous devriez voir "Hello, world!" dans votre navigateur. (Vous pouvez ajouter une adresse IP/Port après la partie "code.py" pour contrôler où web.py lancera le serveur. Vous pouvez aussi lui dire de faire fonctionner un serveur fastcgi ou scgi.)
112
113 [Note traducteur : A PRECISER]
114
115 Note: Vous pouvez spécifier le numéro de port à utiliser dans la ligne de commande, si vous ne souhaitez pas utiliser le port par défaut :
116
117 $ python code.py 1234
118
119
120
121 <a name="template"></a>
122 # Modèles, gabarits
123
124 Ecrire du HTML à l'intérieur de python peut être lourd et pesant. C'est bien plus amusant d'écrire du Python à l'intérieur du HTML. Par bonheur, web.py le fait très facilement.
125
126 Note: Les anciennes versions de web.py utilisent le système de gabarit de [Cheetah] (http://www.cheetahtemplate.org/). Vous êtes, evidemment, libres d'utiliser celui-ci ou n'importe quel autre logiciel de template avec web.py, mais il n'est plus officiellement supporté.
127
128 Créons un nouveau répertoire pour nos gabarits (nous l'appellerons templates). A l'intérieur, créons un nouveau fichier dont l'extension sera HTML (appelons-le index.html). Dans ce fichier, vous pouvez juste écrire du HTML classique:
129
130 <em>Hello</em>, world!
131
132 Ou utiliser le langage de template de web.py ( [Templator](http://webpy.org/docs/0.3/templetor.fr) ) pour ajouter du code dans votre HTML:
133
134 $def with (name)
135
136 $if name:
137 I just wanted to say <em>hello</em> to $name.
138 $else:
139 <em>Hello</em>, world!
140
141 Comme vous pouvez le voir, les gabarits ressemblent beaucoup à des fichiers Python, excepté la déclaration 'def' tout en haut (qui explique avec quoi le modèle est appelé) ainsi que les $s placés devant chaque code.
142 Actuellement, template.py exige que la déclaration $def soit la première ligne du gabarit. Notez également que web.py encode automatiquement les variables utilisées ici, de sorte que si, pour une raison un nom est défini dans une valeur contenant du HTML, il sera proprement encodé et apparaitra comme un texte plein.
143 Si vous souhaitez désactiver cette fonction, écrivez $:name à la place de $name.
144
145 Maintenant, retournons à notre "code.py". Sous la première ligne ajoutez:
146
147 render = web.template.render('templates/')
148
149 Cela indique à web.py qu'il faut rechercher le gabarit dans le repertoire 'templates'. Maintenant modifiez le contenu de la fonction GET dans index en:
150
151 name = 'Bob'
152 return render.index(name)
153
154 (Ici, 'index' est le nom du gabarit et 'name' est un argument qui lui est transmis)
155
156 Visitez votre site, il devrait vous afficher "I just wanted to say hello to Bob."
157
158 Mais imaginons que nous souhaitions que les gens entrent leur propre nom. Dans ce cas, remplacez les deux lignes que nous avons ajouté par:
159
160 i = web.input(name=None)
161 return render.index(i.name)
162
163 En visitant / il devrait vous afficher "Hello, world!". Mais en visitant /?name=Joe il vous affichera "I just wanted to say hello to Joe."
164 Naturellement, en voyant ceci, on constate que l'URL n'est pas très claire. Pour l'améliorer, modifiez votre ligne URL en haut en:
165
166 '/(.*)', 'index'
167
168 Et modifiez la définition de la fonction GET de la classe index en:
169
170 def GET(self, name):
171 return render.index(name)
172
173 puis effaçez la ligne qui définit le nom. Maintenant, visitez /joe et il devrait vous afficher hello to Joe.
174
175 Si vous désirez en apprendre davantage sur les gabarits de web.py, visitez la page [Templetor](http://webpy.org/templetor)
176
177 <a name="formulaires"></a>
178 # Formulaires
179
180 Le module de formulaire de web.py permet de générer des formulaires HTML, de récuperer les entrées des utilisateurs, et les valider avant de les traiter ou les ajouter à une base de donnée.
181 Si vous souhaitez en apprendre plus sur l'utilisation du module de formulaires de web.py, consultez la [Documentation](http://webpy.org/docs/0.3.fr) ou la traduction française du module [Formulaires](http://webpy.org/docs/0.3/form.fr)
182
183 <a name="bd"></a>
184 # Base de données
185
186 Note: Avant de pouvoir utiliser une base de données, soyez certains d'avoir la librairie de la base de données appropriée déjà installée. Pour la base de donnée MySQL, utilisez MySQLdb et pour Postgres, utilisez psycopg2.
187
188 Premièrement, vous devez créer un objet database.
189
190 db = web.database(dbn='postgres', user='username', pw='password', db='dbname')
191
192 (Adaptez ici -- particulièrement pour `username`, `password`, and `dbname` -- vos paramètres de connexion. les utilisateurs de MySQL devront modifier la définition `dbn` en `mysql`.)
193
194 C'est tout ce dont vous avez besoin -- web.py gèrera automatiquement la connexion et la déconnexion à la base de données.
195
196 <a name="affbd"></a>
197 ## Afficher le contenu d'une base de données
198
199 Utilisez votre interface d'administration de la base de données, et créez une simple table dans la base de données:
200
201 CREATE TABLE todo (
202 id serial primary key,
203 title text,
204 created timestamp default now(),
205 done boolean default 'f'
206 );
207
208 Ainsi qu'une ligne initiale:
209
210 INSERT INTO todo (title) VALUES ('Learn web.py');
211
212 Revenez à "code.py" et modifiez la fonction 'GET' de la Classe 'index' de la façon suivante en remplaçant la fonction entièrement:
213
214 def GET(self):
215 todos = db.select('todo')
216 return render.index(todos)
217
218 puis remodifiez le gestionnaire d'URLs pour qu'il ne prenne en compte que /:
219
220 '/', 'index'
221
222 Editez et remplaçez le contenu entier du gabarit `index.html` de cette façon:
223
224 $def with (todos)
225 <ul>
226 $for todo in todos:
227 <li id="t$todo.id">$todo.title</li>
228 </ul>
229
230 En visitant à nouveau votre site, vous devriez voir: "Learn web.py".
231
232 Félicitations ! Vous venez de créer une application complète qui lit une base de données.
233
234 <a name="ecrbd"></a>
235 ## Ecrire dans une base données
236
237 Maintenant, nous allons écrire dans la base de données.
238
239 A la fin du gabarit `index.html`, ajoutez:
240
241 <form method="post" action="add">
242 <p><input type="text" name="title" /> <input type="submit" value="Add" /></p>
243 </form>
244
245 puis modifiez la liste de vos URLs pour qu'elle ressemble à:
246
247 '/', 'index',
248 '/add', 'add'
249
250 (Vous devez être très prudents avec les virgules. Si vous en oubliez, Python joint les chaînes ensembles, et verra `/index/addadd` à la place de votre liste d'URLs!)
251
252 Maintenant, ajoutons une nouvelle Classe:
253
254 class add:
255 def POST(self):
256 i = web.input()
257 n = db.insert('todo', title = i.title)
258 raise web.seeother('/')
259
260 (Avez-vous noté que nous utilisons la fonction `POST` pour celle-ci?)
261
262 `web.input` vous donne accès à toutes les variables de l'utilisateur soumises via un formulaire.
263
264 Note: Afin d'accéder aux données à partir de plusieurs éléments identiquement nommé, dans un format de liste (Une série de cases à cocher qui ont toutes l'attribut name="name"), utilisez:
265
266 post_data=web.input(name=[])
267
268 `db.insert` insère les valeurs dans la table `todo` de la base de données et renvoie l'ID de la ligne créée.
269 `seeother` redirige les utilisateurs vers cette URL.
270
271 Quelques notes additionnelles:
272
273 `db.update` fonctionne comme `db.insert` excepté qu'au lieu de renvoyer l'ID, il doit recevoir en argument, après le nom de la table, soit l'ID soit une clause `WHERE` permettant d'identifier la ligne à modifier.
274
275
276 db.update('todo', where="id = 10", title = "web.py pour les nuls")
277
278
279 `web.input`, `db.query`, et d'autres fonctions dans web.py renvoient des Objets de Stockage (Storage objects), qui sont comme des dictionnaires mis à part que vous pouvez écrire `d.foo` en plus de `d['foo']`. Cela rend le code plus clair.
280
281 <a name="debug"></a>
282 # Debugger
283
284 web.py possède aussi des outils de debugging pour nous aider. Quand nous le faisons tourner avec le server web intégré, il commence l'application en mode debuggage. Dans ce mode, toutes les modifications du code et des gabarits sont automatiquement rechargées et les messages d'erreur contiennent de précieuses informations.
285
286 Le debuggage n'est pas actif lorsque l'application tourne comme un vrai serveur. Si vous souhaitez désactiver ce mode, vous pouvez le faire en ajoutant la ligne suivante avant de créer votre application/gabarit:
287
288 web.config.debug = False
289
290 C'est la fin du tutorial maintenant. Jetez un oeil à la [Documentation](http://webpy.org/docs/0.3.fr) pour voir ce que vous pouvez utiliser avec web.py.
291
292 Vous pourrez trouver pleins de détails de tout ceci ainsi que de toutes les fonctions web.py dans la [Documentation](http://webpy.org/docs/0.3.fr).
293
294 <a name="apres"></a>
295 ## Et après ?
296
297 * [Plus de documentation](/docs/0.3.fr)
298 * [Formulaires](/docs/0.3/form.fr)
299 * [Templator: le modèle de gabarit de web.py](/docs/0.3/templetor.fr)
300 * [Cookbook](/cookbook/fr)
301 * [Exemples de codes](/src)
Something went wrong with that request. Please try again.