Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP

Loading…

fix language link in faq file and add language files to /doc/0.3 for tutorial.md #37

Merged
merged 3 commits into from

2 participants

@five3

fix language link in faq.md file
add 2 files to /doc/0.3/: tutorial.zh-cn.md and tutorial.fr.md

five3 added some commits
@five3 five3 fix one translate in tutorial3.zh-cn
start the server ---> 启动服务
e8d5695
@five3 five3 add new tutorial file under /doc/0.3/ folder
tutorial.fr.md, tutorial.zh-cn.md
4bd0043
@five3 five3 fix language link in faq.md file
from /faq/xx --> /faq.xx
a0bda62
@aaronsw aaronsw merged commit a3d2a1c into webpy:master
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on Aug 7, 2012
  1. @five3

    fix one translate in tutorial3.zh-cn

    five3 authored
    start the server ---> 启动服务
  2. @five3

    add new tutorial file under /doc/0.3/ folder

    five3 authored
    tutorial.fr.md, tutorial.zh-cn.md
  3. @five3

    fix language link in faq.md file

    five3 authored
    from /faq/xx --> /faq.xx
This page is out of date. Refresh to see the latest.
View
301 docs/0.3/tutorial.fr.md
@@ -0,0 +1,301 @@
+---
+layout: default
+title: web.py 0.3 tutorial
+---
+
+# web.py 0.3 tutorial
+
+Autre langages : [english](/tutorial3.en) | [chinese](/tutorial3.zh-cn) | [japan](/tutorial2.ja) | ...
+
+# Sommaire
+
+
+* <a href="#introduction">Prérequis</a>
+* <a href="#manipurl">Manipuler les URLs</a>
+* <a href="#gereurl">Gérer les URLs</a>
+* <a href="#getpost">GET et POST : la différence</a>
+* <a href="#index">Page index - ma première classe</a>
+* <a href="#lance">Lancer le serveur</a>
+* <a href="#template">Modèles, gabarits</a>
+* <a href="#formulaires">Formulaires</a>
+* <a href="#bd">Base de données</a>
+* <a href="#affbd">Afficher le contenu d'une base de données</a>
+* <a href="#ecrbd">Ecrire dans une base de données</a>
+* <a href="#debug">Debugger</a>
+* <a href="#apres">Et Après ?</a>
+
+<a name="introduction"></a>
+# Prérequis
+
+
+
+Vous connaissez Python et vous désirez construire un site web. Webpy vous permettra de le faire facilement.
+
+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/)
+
+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.
+
+
+# Commençons
+
+
+<a name="manipurl"></a>
+## Manipuler les URLs
+
+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.
+
+Pour commencer avec votre application web.py, ouvrez un nouveau fichier texte (que nous appelerons "code.py") et tapez:
+
+ import web
+
+Cela importera le module web.py.
+
+Maintenant, Nous devons donner à web.py notre structure URL. Commençons avec quelque chose de simple:
+
+ urls = (
+ '/', 'index'
+ )
+
+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.
+/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]
+
+Cette ligne signifie que nous souhaitons l'URL / (Note: la page d'accueil) qui doit être traitée par la classe nommée 'index'.
+
+<a name="gereurl"></a>
+## Gérer les URLs
+
+Maintenant, nous avons besoin de créer une application spécifiant les URLs.
+
+ app = web.application(urls, globals())
+
+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.
+
+<a name="getpost"></a>
+## GET et POST: la différence
+
+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).
+
+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!)
+
+
+<a name="index"></a>
+## Page index - ma première classe
+
+Dans notre code web.py, nous faisons la distinction entre les deux clairement. Maintenant, il est nécessaire d'écrire la Classe 'index'.
+
+ class index:
+ def GET(self):
+ return "Hello, world!"
+
+Cette fonction GET sera maintenant appelée par web.py chaque fois qu'il y aura une requête GET pour /.
+
+Très bien, maintenant nous avons juste besoin d'en finir avec une ligne finale disant à web.py de commencer à fournir des pages web:
+
+ if __name__ == "__main__": app.run()
+
+Cela explique à web.py qu'il faut lancer l'application que nous avons créé ci-dessus.
+
+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.
+
+<a name="lance"></a>
+## Lancer le serveur
+
+Si vous allez dans votre terminal et que vous tapez les lignes de commande suivantes :
+
+ $ python code.py
+
+Vous verrez s'afficher : http://0.0.0.0:8080/
+
+Vous avez maintenant votre application web.py qui tourne comme un vrai serveur web sur votre ordinateur!
+
+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.)
+
+[Note traducteur : A PRECISER]
+
+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 :
+
+ $ python code.py 1234
+
+
+
+<a name="template"></a>
+# Modèles, gabarits
+
+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.
+
+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é.
+
+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:
+
+ <em>Hello</em>, world!
+
+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:
+
+ $def with (name)
+
+ $if name:
+ I just wanted to say <em>hello</em> to $name.
+ $else:
+ <em>Hello</em>, world!
+
+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.
+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.
+Si vous souhaitez désactiver cette fonction, écrivez $:name à la place de $name.
+
+Maintenant, retournons à notre "code.py". Sous la première ligne ajoutez:
+
+ render = web.template.render('templates/')
+
+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:
+
+ name = 'Bob'
+ return render.index(name)
+
+(Ici, 'index' est le nom du gabarit et 'name' est un argument qui lui est transmis)
+
+Visitez votre site, il devrait vous afficher "I just wanted to say hello to Bob."
+
+Mais imaginons que nous souhaitions que les gens entrent leur propre nom. Dans ce cas, remplacez les deux lignes que nous avons ajouté par:
+
+ i = web.input(name=None)
+ return render.index(i.name)
+
+En visitant / il devrait vous afficher "Hello, world!". Mais en visitant /?name=Joe il vous affichera "I just wanted to say hello to Joe."
+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:
+
+ '/(.*)', 'index'
+
+Et modifiez la définition de la fonction GET de la classe index en:
+
+ def GET(self, name):
+ return render.index(name)
+
+puis effaçez la ligne qui définit le nom. Maintenant, visitez /joe et il devrait vous afficher hello to Joe.
+
+Si vous désirez en apprendre davantage sur les gabarits de web.py, visitez la page [Templetor](http://webpy.org/templetor)
+
+<a name="formulaires"></a>
+# Formulaires
+
+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.
+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)
+
+<a name="bd"></a>
+# Base de données
+
+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.
+
+Premièrement, vous devez créer un objet database.
+
+ db = web.database(dbn='postgres', user='username', pw='password', db='dbname')
+
+(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`.)
+
+C'est tout ce dont vous avez besoin -- web.py gèrera automatiquement la connexion et la déconnexion à la base de données.
+
+<a name="affbd"></a>
+## Afficher le contenu d'une base de données
+
+Utilisez votre interface d'administration de la base de données, et créez une simple table dans la base de données:
+
+ CREATE TABLE todo (
+ id serial primary key,
+ title text,
+ created timestamp default now(),
+ done boolean default 'f'
+ );
+
+Ainsi qu'une ligne initiale:
+
+ INSERT INTO todo (title) VALUES ('Learn web.py');
+
+Revenez à "code.py" et modifiez la fonction 'GET' de la Classe 'index' de la façon suivante en remplaçant la fonction entièrement:
+
+ def GET(self):
+ todos = db.select('todo')
+ return render.index(todos)
+
+puis remodifiez le gestionnaire d'URLs pour qu'il ne prenne en compte que /:
+
+ '/', 'index'
+
+Editez et remplaçez le contenu entier du gabarit `index.html` de cette façon:
+
+ $def with (todos)
+ <ul>
+ $for todo in todos:
+ <li id="t$todo.id">$todo.title</li>
+ </ul>
+
+En visitant à nouveau votre site, vous devriez voir: "Learn web.py".
+
+Félicitations ! Vous venez de créer une application complète qui lit une base de données.
+
+<a name="ecrbd"></a>
+## Ecrire dans une base données
+
+Maintenant, nous allons écrire dans la base de données.
+
+A la fin du gabarit `index.html`, ajoutez:
+
+ <form method="post" action="add">
+ <p><input type="text" name="title" /> <input type="submit" value="Add" /></p>
+ </form>
+
+puis modifiez la liste de vos URLs pour qu'elle ressemble à:
+
+ '/', 'index',
+ '/add', 'add'
+
+(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!)
+
+Maintenant, ajoutons une nouvelle Classe:
+
+ class add:
+ def POST(self):
+ i = web.input()
+ n = db.insert('todo', title = i.title)
+ raise web.seeother('/')
+
+(Avez-vous noté que nous utilisons la fonction `POST` pour celle-ci?)
+
+`web.input` vous donne accès à toutes les variables de l'utilisateur soumises via un formulaire.
+
+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:
+
+ post_data=web.input(name=[])
+
+`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.
+`seeother` redirige les utilisateurs vers cette URL.
+
+Quelques notes additionnelles:
+
+`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.
+
+
+ db.update('todo', where="id = 10", title = "web.py pour les nuls")
+
+
+`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.
+
+<a name="debug"></a>
+# Debugger
+
+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.
+
+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:
+
+ web.config.debug = False
+
+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.
+
+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).
+
+<a name="apres"></a>
+## Et après ?
+
+* [Plus de documentation](/docs/0.3.fr)
+* [Formulaires](/docs/0.3/form.fr)
+* [Templator: le modèle de gabarit de web.py](/docs/0.3/templetor.fr)
+* [Cookbook](/cookbook/fr)
+* [Exemples de codes](/src)
View
2  docs/0.3/tutorial.md
@@ -5,7 +5,7 @@ title: Tutorial
# Tutorial
-Other languages : [chinese 简体中文 ](/tutorial3.zh-cn) | [français](/tutorial3.fr) | ...
+Other languages : [chinese 简体中文 ](/docs/0.3/tutorial.zh-cn) | [français](/docs/0.3/tutorial.fr) | ...
## Summary
View
272 docs/0.3/tutorial.zh-cn.md
@@ -0,0 +1,272 @@
+---
+layout: default
+title: web.py 0.3 新手指南
+---
+
+# web.py 0.3 新手指南
+
+* [开始](#starting)
+* [URL处理](#urlhandling)
+* [GET和POST的区别](#getpost)
+* [启动服务](#start)
+* [模板](#templating)
+* [表单](#forms)
+* [数据库](#databasing)
+* [开发](#developing)
+* [下一步做什么?](#whatnext)
+
+## 开始
+
+你知道Python同时你希望制作一个网站。 那么web.py正好提供了一种简单的方法。
+
+如果你希望读完整个指南, 你需要安装Python, web.py, flup, psycopg2, 和Postgres (或者等价的数据库和Python驱动)。 详细,可以查看 [webpy.org](http://webpy.org/).
+
+如果你已经有了一个web.py项目,请看看[升级](/docs/0.3/upgrade) 页面的相关信息。
+
+准备开始。
+
+<a name="urlhandling"> </a>
+## URL 处理
+
+任何网站最重要的部分就是它的URL结构。你的URL并不仅仅只是访问者所能看到并且能发给朋友的。它还规定了你网站运行的心智模型。在一些类似[del.icio.us](http://del.icio.us/)的流行网站 , URL甚至是UI的一部分。 web.py使这类强大的URL成为可能。
+
+在开始你的web.py程序之前,打开一个文本文件(文件名为code.py)输入:
+
+ import web
+
+这条语句会导入web.py模块。
+
+现在我们需要把我们的URL结构告诉web.py。让我从下面这个简单的例子开始:
+
+ urls = (
+ '/', 'index'
+ )
+
+第一部分是匹配URL的[正则表达式](http://osteele.com/tools/rework/),像`/``/help/faq``/item/(\d+)`等(`\d+`将匹配数字)。圆括号表示捕捉对应的数据以便后面使用。第二部分是接受请求的类名称,像`index``view``welcomes.hello` (`welcomes`模块的`hello`类),或者`get_\1``\1` 会被正则表达式捕捉到的内容替换,剩下来捕捉的的内容将被传递到你的函数中去。
+
+这行表示我们要URL`/`(首页)被一个叫`index`的类处理。
+
+现在我们需要创建一个列举这些url的application。
+
+ app = web.application(urls, globals())
+
+这会告诉web.py去创建一个基于我们刚提交的URL列表的application。这个application会在这个文件的全局命名空间中查找对应类。
+
+<a name="getpost"> </a>
+## GET和POST: 区别
+
+现在我们需要来写`index`类。虽然大多数人只会看看,并不会注意你的浏览器在使用用于与万维网通信的HTTP语言。具体的细节并不重要,但是要理解web访问者请求web服务器去根据URL(像`/``/foo?f=1`)执行一个合适的函数(像`GET``POST`)的基本思想。
+
+`GET`是我们都熟悉的。它用于请求网页文本。当你在浏览器输入`harvard.edu`,它会直接访问Harvard的web服务器,去`GET /`。 第二个最有名的是`POST`,它经常被用在提交form,比如请求买什么东西。每当提交一个去做什么事情(像使用信用卡处理一笔交易)的请求时,你可以使用`POST`。这是关键,因为`GET`的URL可以被搜索引擎索引,并通过搜索引擎访问。虽然大部分页面你希望被索引,但是少数类似订单处理的页面你是不希望被索引的 (想象一下Google尝试去购买你网站上的所有东西)。
+
+在我们web.py的代码中,我们将这两个方法明确区分:
+
+ class index:
+ def GET(self):
+ return "Hello, world!"
+
+当有人用`GET`请求`/`时,这个`GET`函数随时会被web.py调用。
+
+好了,限制我们只需要最后一句就写完了。这行会告诉web.py开始提供web页面:
+
+ if __name__ == "__main__": app.run()
+
+这会告诉web.py为我们启动上面我们写的应用。
+
+
+现在注意,即使我已经在这里说了很多,但我们真正有5行这些代码。这就是你需要编写的一个完整的web.py应用。
+为了更方便的使用,你的完整代码应该像下面这样:
+
+ import web
+
+ urls = (
+ '/', 'index'
+ )
+
+ class index:
+ def GET(self):
+ return "Hello, world!"
+
+ if __name__ == "__main__":
+ app = web.application(urls, globals())
+ app.run()
+
+
+
+<a name="start"> </a>
+## 启动服务
+
+ 如果你在命令行下面,请输入::
+ $ python code.py
+ http://0.0.0.0:8080/
+
+现在你的web.py应用正运行在你电脑上的一个真正的web服务器上。 访问那个URL,然后你应该看到"Hello, world!" (你可以通过把IP地址/端口加在"code.py"的后面,来控制web.py在哪里启动服务器。你也可以让它运行在`fastcgi``scgi`服务器上)。
+
+**注意:** 如果你不能或者不想使用默认端口,你可以使用这样的命令来指定端口号:
+
+ $ python code.py 1234
+
+
+
+<a name="templating"> </a>
+## 模板
+
+在 Python 中写 HTML 不是聪明的选择,相反在 HTML 中写 Python 则有趣的多。幸运的是,`web.py` 让这件事情做得简单而又漂亮。
+
+**注意:** 老版本的 `web.py` 使用 [Cheetah 模板系统](http://www.cheetahtemplate.org/),你可以也欢迎使用其他模板系统,但它可能不会被长久支持。
+
+给模板新建一个目录(命名为 `templates`),在该目录下新建一个以 `.html` 结尾的文件,内容如下:
+
+ <em>Hello</em>, world!
+
+你也可以在模板中使用 `web.py` 模板支持代码:
+
+ $def with (name)
+
+ $if name:
+ I just wanted to say <em>hello</em> to $name.
+ $else:
+ <em>Hello</em>, world!
+
+如上,该模板看起来就像 python 文件一样,除了顶部的 `def with` (表示从模板将从这后面取值)和总是位于代码段之前的`$`。当前,`template.py` 首先请求模板文件的首行 `$def` 。当然,你要注意 `web.py` 将会转义任何任何用到的变量,所以当你将 `name` 的值设为是一段 HTML 时,它会被转义显示成纯文本。如果要关闭该选项,可以写成 `$:name` 来代替 `$name`
+
+回看再看 `code.py`。在第一行之下添加:
+
+ render = web.template.render('templates/')
+
+这会告诉web.py到你的模板目录中去查找模板。然后把 `index.GET`改成:
+告诉 `web.py` 在你的模板目录下查找模板文件。修改 `index.GET`
+
+ name = 'Bob'
+ return render.index(name)
+
+('index' 是模板的名字,'name' 是传入模板的一个参数)
+
+访问站点它将显示 hello Bob。
+
+但是如果我们想让用户自行输入他的名字,么办?如下:
+
+ i = web.input(name=None)
+ return render.index(i.name)
+
+访问 `/` 将显示 hello world,访问 `/?name=Joe` 将显示 hello Joe。
+
+URL 的后面的 `?` 看起来不好看?修改下 URL 配置:
+
+ '/(.*)', 'index'
+
+然后修改下 `index.GET`:
+
+ def GET(self, name):
+ return render.index(name)
+
+现在访问 `/Joe` 看看,它会显示 hello Joe。
+
+如果学习更多关于 web.py 的模板处理,请访问 [web.py 模板](/docs/0.3/templetor).
+
+<a name="forms"> </a>
+## 表单
+
+web.py的form模块能够帮助你生成HTML表单;获取用户的输入,并在处理或添加到数据库之前对其进行内容的验证。
+如果你要学习更多关于form模块的使用,请查看[帮助文档](/docs/0.3)或者[Form](/form)类库的链接
+
+
+<a name="databasing"> </a>
+## 数据库操作
+
+**注意:** 在你开始使用数据库之前,确保你已经安装了合适的数据库访问库。比如对于MySQL数据库,使用 [MySQLdb](http://sourceforge.net/project/showfiles.php?group_id=22307) ,对于Postgres数据库使用[psycopg2](http://initd.org/pub/software/psycopg/)。
+
+首先你需要创建一个数据库对象。
+
+ db = web.database(dbn='postgres', user='username', pw='password', db='dbname')
+
+(根据需要修改这里 -- 尤其是`username``password``dbname` -- 。 MySQL用户还需要把 `dbn` 定义改为 `mysql`。)
+
+这就是所有你需要做的 -- web.py将会自动处理与数据库的连接和断开。
+
+使用的的数据库引擎管理工具,在你的库中创建一个简单的表:
+
+ CREATE TABLE todo (
+ id serial primary key,
+ title text,
+ created timestamp default now(),
+ done boolean default 'f' );
+
+然后初始化行:
+
+ INSERT INTO todo (title) VALUES ('Learn web.py');
+
+我们回来继续编辑 `code.py` ,把 `index.GET` 改成下面的样子,替换整个函数:
+
+ def GET(self):
+ todos = db.select('todo')
+ return render.index(todos)
+
+然后把URL列表改回来,只保留 `/`:
+
+ '/', 'index',
+
+像这样编辑并替换 `index.html` 的全部内容:
+
+ $def with (todos)
+ <ul>
+ $for todo in todos:
+ <li id="t$todo.id">$todo.title</li>
+ </ul>
+
+再访问你的网站,然后你可以看到你的todo item: "Learn web.py"。恭喜你!你已经完整地写好了一个可以从数据库读取数据的程序。现在让我们同样再写一个可以把数据写入数据库的程序。
+
+在 `index.html`尾部添加:
+
+ <form method="post" action="add">
+ <p><input type="text" name="title" /> <input type="submit" value="Add" /></p>
+ </form>
+
+然后把你的URL列表改为:
+
+ '/', 'index',
+ '/add', 'add'
+
+(你必须要非常小心那些逗号。如果你省略他们,Python会把所有字符串连接起来,变成 `'/index/addadd'`)
+
+现在添加另一个类:
+
+ class add:
+ def POST(self):
+ i = web.input()
+ n = db.insert('todo', title=i.title)
+ raise web.seeother('/')
+
+(注意现在我们正在使用 `POST`)
+
+`web.input` 可以让你访问用户通过form提交的任何数据。
+
+注意: 如果要访问多个相同名字的字段,请使用list的格式(比如:一串name="name"的多选框):
+
+ post_data=web.input(name=[])
+
+`db.insert` 把数据插入数据表 `todo` ,然后把新的行号返回给你。 `seeother` 把用户重定向到指定的URL。
+
+一些快速补充说明: `db.update``db.insert` 差不多,除了它返回的行号是直接从sql语句里面提取的(`WHERE ID=2`)。
+
+`web.input``db.query`已经其他web.py中的函数返回"Storage objects",这些东西就像字典,你除了可以 `d['foo']`之外,你还可以 `d.foo`。这可以让代码更加干净。
+
+你可以在[the documentation](/docs/0.3)找到这方面具体的细节以及所有web.py的函数说明。
+
+<a name="developing"> </a>
+## 开发
+
+web.py 还有一些帮助我们debug的工具。当它在内建的服务器中运行时,它会一debug模式启动程序。在debug模式中,任何代码、模板的修改,都会让服务器重新加载它们,然后还会输出有用的错误消息。
+
+只有在生产环境中debug模式是关闭的。如果你想禁用debug模式,你可以在创建程序/模板前添加像这样的行。
+
+ web.config.debug = False
+
+我们的指南就到这里了。如果要做更多很酷的东西,你可以先查看一下文档。
+
+<a name="whatnext"> </a>
+## 下一步是什么?
+
+* [更多文档](/docs/0.3)
+* [Cookbook](/cookbook)
+* [code samples](/src)
View
66 faq.md
@@ -1,34 +1,34 @@
----
-layout: default
-title: FAQ
----
-
-# FAQ
-
-Other languages : [español](/faq/es) | [russian русский](/faq/ru) | [japan 日本語](/faq/ja) | [chinese 简体中文](/faq/zh-cn) | [français](/faq/fr)
-
-Example code for many common questions can be found in the [cookbook section](/cookbook).
-
-99. **Why are the urls just one long list?**
-
- If they were a dictionary, they wouldn't be ordered. If it was a list of tuples, then it'd be a lot more typing.
-
-99. **How do I serve static files such as JavaScripts or images like PNG and JPG with the web.py server?**
-
- Create a directory (also known as a folder) called `static` in the location of the script that runs the web.py server. Then place the static files you wish to server in the `static` folder. For example, the URL `http://localhost/static/logo.png` will send the image `./static/logo.png` to the client.
-
-99. **Where can I go for additional help?**
-
- Google Groups has a [web.py group](http://groups.google.com/group/webpy) that is quite helpful.
-
-99. **How do I debug print to the console?**
-
- web.debug("I will get printed to the console and not the body of the webpage")
-
-99. **I stumbled over a bug in web.py. Where can I file it?**
-
- Go to the [webpy launchpad site](https://launchpad.net/webpy), login (or register if you have to) and click on "report a bug".
-
-99. **What's this magic `ctx` I see in examples?**
-
+---
+layout: default
+title: FAQ
+---
+
+# FAQ
+
+Other languages : [español](/faq.es) | [russian русский](/faq.ru) | [japan 日本語](/faq.ja) | [chinese 简体中文](/faq.zh-cn) | [français](/faq.fr) | [Česko](/faq.cs)
+
+Example code for many common questions can be found in the [cookbook section](/cookbook).
+
+99. **Why are the urls just one long list?**
+
+ If they were a dictionary, they wouldn't be ordered. If it was a list of tuples, then it'd be a lot more typing.
+
+99. **How do I serve static files such as JavaScripts or images like PNG and JPG with the web.py server?**
+
+ Create a directory (also known as a folder) called `static` in the location of the script that runs the web.py server. Then place the static files you wish to server in the `static` folder. For example, the URL `http://localhost/static/logo.png` will send the image `./static/logo.png` to the client.
+
+99. **Where can I go for additional help?**
+
+ Google Groups has a [web.py group](http://groups.google.com/group/webpy) that is quite helpful.
+
+99. **How do I debug print to the console?**
+
+ web.debug("I will get printed to the console and not the body of the webpage")
+
+99. **I stumbled over a bug in web.py. Where can I file it?**
+
+ Go to the [webpy launchpad site](https://launchpad.net/webpy), login (or register if you have to) and click on "report a bug".
+
+99. **What's this magic `ctx` I see in examples?**
+
[ctx cookbook recipe](/cookbook/ctx) []()
View
2  tutorial3.zh-cn.md
@@ -94,7 +94,7 @@ title: web.py 0.3 新手指南
<a name="start"> </a>
-## Start the server
+## 启动服务
如果你在命令行下面,请输入::
$ python code.py
Something went wrong with that request. Please try again.