Skip to content

Tons of Markdown fixes, improvements, and cleanup #151

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 13 commits into
base: master
Choose a base branch
from
13 changes: 6 additions & 7 deletions cookbook/Insert.zh-cn.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ title: db.insert 向数据库中新增数据

# db.insert 向数据库中新增数据

###问题
### 问题
如何向数据加新增数据?

###解决办法
### 解决办法

在 0.3 中,数据库连接如下:

Expand All @@ -28,18 +28,17 @@ sequence_id = db.insert('mytable', firstname="Bob",lastname="Smith",joindate=web
* _test
* \**values


##tablename
## tablename
表名,即你希望向哪个表新增数据。

##seqname
## seqname
可选参数,默认 None。Set `seqname` to the ID if it's not the default, or to `False`.

##_test
## _test
`_test` 参数可以让你看到 SQL 的执行过程:

results = db.select('mytable', offset=10, _test=True)
><sql: 'SELECT * FROM mytable OFFSET 10'>

##\**values
## \**values
字段参数。如果没有赋值,数据库可能创建默认值或者发出警告。
4 changes: 0 additions & 4 deletions cookbook/alternating_style.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ Solution: Give templetor access to the `int` built-in and use modulo to test.

web.template.Template.globals['int'] = int


## template.html ##

<ul>
Expand All @@ -28,16 +27,13 @@ Solution: Give templetor access to the `int` built-in and use modulo to test.
">$track.title</li>
</ul>


## New Templetor ##

In the new implementation of templetor (which will be the default when version .3 is released), within any template loop you have access to a $loop variable. This works like so:


<ul>
$for foo in foos:
<li class="$loop.parity">
$foo
</li>
</ul>

2 changes: 0 additions & 2 deletions cookbook/alternating_style.zh-cn.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,10 @@ web.template.Template.globals['int'] = int
">$track.title</li>
</ul>


## New Templetor ##

In the new implementation of templetor (which will be the default when version .3 is released), within any template loop you have access to a $loop variable. This works like so:


<ul>
$for foo in foos:
<li class="$loop.parity">
Expand Down
5 changes: 2 additions & 3 deletions cookbook/application_processors.fr.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ title: Application processors, hooks

# Application processors, hooks

Autre langages [english](/../application_processors) | ...
Autre langages: [English](/../application_processors) | ...

## Probleme

Expand Down Expand Up @@ -41,8 +41,7 @@ Vous pouvez écrire ou utiliser les variables globales dans les fonctions hook,

app.add_processor(web.loadhook(my_loadhook))


###Tip: et vous pouvez également utiliser web.ctx ou web.input() dans un hook.
### Tip: et vous pouvez également utiliser web.ctx ou web.input() dans un hook.

def my_loadhook():
input = web.input()
Expand Down
4 changes: 2 additions & 2 deletions cookbook/application_processors.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ title: Application processors, hooks

# Application processors, hooks

Other languages : [français](/../cookbook/application_processors.fr) | ...
Other languages: [Français](/../cookbook/application_processors.fr) | ...

## Problem

Expand Down Expand Up @@ -41,7 +41,7 @@ you can write or use global variables in hook function, for example: web.header(

app.add_processor(web.loadhook(my_loadhook))

###Tip: and also can use web.ctx or web.input() in hook.
### Tip: and also can use web.ctx or web.input() in hook.

def my_loadhook():
input = web.input()
Expand Down
4 changes: 2 additions & 2 deletions cookbook/cgi-apache.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ That's it. Your application is accessible via `http://server/app/app.py/`. Addit

Here it is assumed that your application is called index.py. The above htaccess checks if some static file/directory exists failing which it routes the data to your index.py. Change the Rewrite Base to a sub-directory if needed.

#Hiding the script name using mod_rewrite (tested with webpy 0.33)
# Hiding the script name using mod_rewrite (tested with webpy 0.33)

(warning: this section written by someone new to webpy; it works, but may not follow prescribed practices)

Expand All @@ -60,7 +60,7 @@ So now if you go to `http://server/app/` you'll hit `app.py`'s handler for `'/'`

Are we done? Well, that's what I thought. There's still one problem: webpy doesn't know how things were rewritten on the way *in*, so it doesn't know how to rewrite them on the way *out*.

For instance, one can normally use `web.url()` to compose urls such that the right content is found. Want `static/style.css`? Call `web.url('/static/style.css') and you'll get ... `/app/app.py/static/style.css` ... not what we wanted. That doesn't exist. Problem.
For instance, one can normally use `web.url()` to compose urls such that the right content is found. Want `static/style.css`? Call `web.url('/static/style.css') and you'll get... `/app/app.py/static/style.css` ...not what we wanted. That doesn't exist. Problem.

If you don't use `web.url()`, it can still bite you because *webpy* does. Say `raise web.seeother('/')` and you'll end up at `http://server/app/app.py/`, which defeats the purpose of hiding it using mod_rewrite.

Expand Down
31 changes: 16 additions & 15 deletions cookbook/cookies.fr.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,19 @@ title: Travailler avec les cookies

# Travailler avec les cookies

Autre langages: [english](/../cookies) | ...
Autre langages: [English](/../cookies) | ...

##Problème:
## Problème:

Comment déposer et récupérer les cookies d'un utilisateur qui navigue sur le site?

##Solution:
## Solution:

Web.py permet d'une façon très simple d'utiliser les méthodes de dépot/récupération de cookies (setting/getting).

###Déposer des cookies
####Vue d'ensemble
### Déposer des cookies

#### Vue d'ensemble

setcookie(name, value, expires="", domain=None, secure=False):

Expand All @@ -26,7 +27,7 @@ Web.py permet d'une façon très simple d'utiliser les méthodes de dépot/récu
* *domain* `(string)` - Le nom de domaine pour lequel le cookie est valide. Par défaut, réglé sur le site d'accueil, cela vous permet de définir le domaine, plutôt que simplement un hôte(tel que `.webpy.org`).
* *secure* `(bool)`- Si vrai, exige que le cookie soit envoyé via HTTPS.

####Exemple
#### Exemple

`web.setcookie()` peut être utilisé pour déposer un cookie à un utilisateur, comme ceci:

Expand All @@ -36,31 +37,31 @@ Web.py permet d'une façon très simple d'utiliser les méthodes de dépot/récu
web.setcookie('age', i.age, 3600)
return "Age set in your cookie"


L'appel de la classe ci-dessus avec GET déposera un cookie nommé "age" ayant pour valeur par défaut "25" (cette valeur par défaut provient en fait de web.input et non de la fonction setcookie), et qui expirera dans une heure (3600 secondes).


Le troisième (et optionnel) argument de `web.setcookie()`, "expires", vous permet de définir quand vous voulez que votre cookie expire. Tout nombre négatif expirera le cookie immédiatement. Un nombre positif est le nombre de secondes durant lequel le cookie va durer (3600 se traduirait en une heure de durée du cookie). Laisser cet argument vide a pour conséquence, d'expirer le cookie session quand le navigateur s'arrête. Pour créer un cookie permanent, mettez à jour le temps d'expiration du cookie à intervalles réguliers (exemple : quand un utilisateur s'est connecté)

### Récuperer des cookies

###Récuperer des cookies
####Vue d'ensemble
#### Vue d'ensemble

Il existe de nombreuses méthodes pour retrouver des cookies, en fonction de la réaction souhaitée à un cookie manquant.

#####Méthode 1 (Renvoi None si le cookie n'est pas trouvé):
##### Méthode 1 (Renvoi None si le cookie n'est pas trouvé):

web.cookies().get(cookieName)
#cookieName est le nom du cookie présenté par le navigateur
#####Méthode 2 (Lève une exception AttributeError si le cookie n'est pas trouvé):
##### Méthode 2 (Lève une exception AttributeError si le cookie n'est pas trouvé):

foo = web.cookies()
foo.cookieName
#####Méthode 3 (Evite la levée d'exception en attribuant une valeur par défaut au cookie qui n'a pas été trouvé):
##### Méthode 3 (Evite la levée d'exception en attribuant une valeur par défaut au cookie qui n'a pas été trouvé):

foo = web.cookies(cookieName=defaultValue)
foo.cookieName # renvoi la valeur (qui pourrait être par défaut)
#cookieName est le nom du cookie présenté par le navigateur

####Exemple

#### Exemple

`web.cookies()` peut être utilisé pour accéder à un cookie déjà défini. Si un cookie est créé en utilisant le code `web.setcookie()` plus haut, il peut être retrouvé de cette façon:

Expand Down
4 changes: 3 additions & 1 deletion cookbook/cookies.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ title: cookies

# cookies

Other languages: [français](/../cookbook/cookies.fr) | ...
Other languages: [Français](/../cookbook/cookies.fr) | ...

## Problem

Expand All @@ -16,6 +16,7 @@ You want to set and retrieve cookies for a user browsing the site.
Web.py *comes* with an easy to use method for setting/getting cookies.

### Setting Cookies

#### Overview

```
Expand Down Expand Up @@ -46,6 +47,7 @@ Calling the above class with GET will set a cookie named `age` with a default va
The third (and optional) argument to `web.setcookie()`, `expires`, allows you to set when you want your cookie to expire. Any negative number will expire the cookie immediately. Any positive number is the number of seconds that the cookie will last (3600 would result in an hour long cookie). Leaving this argument empty results in a session cookie, which expires when your browser shuts down. To make the cookie permanent, simply update cookie expiration time at regular interval (e.g. when user logged in).

### Retrieving Cookies

#### Overview

There are many methods to retrieve cookies, depending on the desired reaction to a missing cookie.
Expand Down
4 changes: 3 additions & 1 deletion cookbook/cookies.zh-cn.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ title: 如何操作Cookie
对web.py而言,设置/获取Cookie非常方便。

### 设置 Cookies

#### 概述

setcookie(name, value, expires="", domain=None, secure=False):
Expand All @@ -33,12 +34,12 @@ title: 如何操作Cookie
web.setcookie('age', i.age, 3600)
return "Age set in your cookie"


用 GET方式调用上面的类将设置一个名为age,默认值是25的cookie(实际上,默认值25是在web.input中赋予i.age的,从而间接赋予 cookie,而不是在setcookie函式中直接赋予cookie的)。这个cookie将在一小时后(即3600秒)过期。

`web.setcookie()`的第三个参数-"expires"是一个可选参数,它用来设定cookie过期的时间。如果是负数,cookie将立刻过期。如果是正数,就表示cookie的有效时间是多久,以秒为单位。如果该参数为空,cookie就永不过期。

### 获得Cookies

#### 概述

获取Cookie的值有很多方法,它们的区别就在于找不到cookie时如何处理。
Expand All @@ -60,6 +61,7 @@ title: 如何操作Cookie
#cookieName is the name of the cookie submitted by the browser

#### 示例:

用`web.cookies()` 访问cookie. 如果已经用`web.setcookie()`设置了Cookie, 就可以象下面这样获得Cookie:

class CookieGet:
Expand Down
1 change: 0 additions & 1 deletion cookbook/csrf.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ We need 4 things:

1. Add `<input type="hidden" name="csrf_token" value="$csrf_token()"/>` to the forms in the templates.


We define `csrf_token()` like this:

def csrf_token():
Expand Down
51 changes: 22 additions & 29 deletions cookbook/ctx.fr.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,55 +5,48 @@ title: web.ctx

# web.ctx

Autre langages: [english](/../ctx) | ...
Autre langages: [English](/../ctx) | ...

Probleme
-------
## Probleme

Vous souhaitez utiliser des variables contextuelles dans votre code comme la page référante ou le navigateur du client.


Solution
--------
## Solution

C'est possible en utilisant 'web.ctx'. D'abord un peu d'architecture: 'web.ctx' est basée sur la classe 'threadeddict', alias 'ThreadedDict'. Cette classe crée un objet de type dictionnaire qui possède des attributs spécifiques au processus id de thread. C'est élégant dans la mesure ou cela nous permet d'utiliser un objet de type dictionnaire, tandis que beaucoup d'utilisateurs accèdent au système simultanément, et l'objet ne contiendra que les données de la requête HTTP donnée. (aucune données n'est partagée donc l'objet est ["thread-safe"](http://fr.wikipedia.org/wiki/Threadsafe) -- _On dit qu’un programme ou qu'une portion de code est thread-safe s’il fonctionne correctement durant une exécution simultanée par plusieurs threads (processus légers)_.)


'web.ctx' contient des variables pour chaque requête qui comprennent des informations spécifiques pour chaque demande, comme les variables environnement du client. En supposant que vous vouliez déterminer quelle était la page référante d'un utilisateur accédant à une page:

Exemple
-------
## Exemple

class example:
def GET(self):
referer = web.ctx.env.get('HTTP_REFERER', 'http://google.com')
raise web.seeother(referer)


Ce code utilise 'web.ctx.env' pour accéder à l'environnement variables 'HTTP_REFERER'. Si il n'y en a pas, ce sera par défaut google.com. Enfin, il redirige l'utilisateur vers la page d'où il vient.


'web.ctx' est aussi très pratique car il peut-être rêglé par un ['loadhook'] (../application_processors/fr). Les données session, par exemple, sont fixées chaque fois qu'une demande est traitée et les données sont stockées dans 'web.ctx'. Depuis que 'web.ctx' est ["thread-safe"](http://fr.wikipedia.org/wiki/Threadsafe), vous pouvez utiliser les données session comme si elles étaient un objet régulier python.


Données que l'on trouve dans 'ctx'
-------------------
## Données que l'on trouve dans 'ctx'

### Request ###
* `environ` alias 'env' &ndash; un dictionnaire contenant les variables environnement standard de [WSGI](http://www.python.org/dev/peps/pep-0333/#environ-variables)
* `home` &ndash; le chemin de base pour l'application, y compris tout élément «consommée» par les applications extérieures *http://example.org/admin*
* `homedomain` &ndash; ? (semble être le protocole + l'hôte) *http://example.org*
* `homepath` &ndash; La partie du chemin requise par l'utilisateur, déduite de l'application courante. C'est à dire homepath + path = le chemin actuellement requis en HTTP par l'utilisateur. Exemple: */admin*

* `host` &ndash; le nom d'hôte (domaine) et (si ce n'est pas celui par défaut) le port requis par l'utilisateur. Exemple: *example.org*, *example.org:8080*
* `ip` &ndash; L'adresse ip de l'utilisateur. exemple: *xxx.xxx.xxx.xxx*
* `method` &ndash; la méthode HTTP utilisée. exemple: *GET*
* `path` &ndash; Le chemin demandé par l'utilisateur, relatif à l'aaplication en cours. Si vous utilisez des sous-applications, chaque partie de l'url filtrée par l'application externe sera déduite. Par exemple: vous avez une application principale dans code.py, et une sous application appelée 'admin.py'. Dans 'code.py', vous pointez '/admin' vers 'admin.app'. Dans 'admin.py', vous pointez '/stories' sur une classe nommée 'stories'. Au sein de 'stories', 'web.ctx.path' sera '/stories' et pas '/admin/stories'. Exemple: */articles/845*
* `protocol` &ndash; Le protocole utilisé. Exemple: *https*
* `query` &ndash; Une chaîne vide s'il n'y a pas d'argument de requête autre que '?' suivit par la chaine de requête. Exemple *?fourlegs=good&twolegs=bad*
* `fullpath` alias 'path + query' &ndash; Le chemin demandé inclut les arguments de requête mais n'inclut *pas* 'homepath'. Exemple : */articles/845?fourlegs=good&twolegs=bad*

* `environ` alias 'env' &ndash; un dictionnaire contenant les variables environnement standard de [WSGI](http://www.python.org/dev/peps/pep-0333/#environ-variables)
* `home` &ndash; le chemin de base pour l'application, y compris tout élément «consommée» par les applications extérieures *http://example.org/admin*
* `homedomain` &ndash; ? (semble être le protocole + l'hôte) *http://example.org*
* `homepath` &ndash; La partie du chemin requise par l'utilisateur, déduite de l'application courante. C'est à dire homepath + path = le chemin actuellement requis en HTTP par l'utilisateur. Exemple: */admin*

* `host` &ndash; le nom d'hôte (domaine) et (si ce n'est pas celui par défaut) le port requis par l'utilisateur. Exemple: *example.org*, *example.org:8080*
* `ip` &ndash; L'adresse ip de l'utilisateur. exemple: *xxx.xxx.xxx.xxx*
* `method` &ndash; la méthode HTTP utilisée. exemple: *GET*
* `path` &ndash; Le chemin demandé par l'utilisateur, relatif à l'aaplication en cours. Si vous utilisez des sous-applications, chaque partie de l'url filtrée par l'application externe sera déduite. Par exemple: vous avez une application principale dans code.py, et une sous application appelée 'admin.py'. Dans 'code.py', vous pointez '/admin' vers 'admin.app'. Dans 'admin.py', vous pointez '/stories' sur une classe nommée 'stories'. Au sein de 'stories', 'web.ctx.path' sera '/stories' et pas '/admin/stories'. Exemple: */articles/845*
* `protocol` &ndash; Le protocole utilisé. Exemple: *https*
* `query` &ndash; Une chaîne vide s'il n'y a pas d'argument de requête autre que '?' suivit par la chaine de requête. Exemple *?fourlegs=good&twolegs=bad*
* `fullpath` alias 'path + query' &ndash; Le chemin demandé inclut les arguments de requête mais n'inclut *pas* 'homepath'. Exemple : */articles/845?fourlegs=good&twolegs=bad*

### Response ###
* `status` &ndash; Le code statut HTTP (par defaut '200 OK') *401 Unauthorized*
* `headers` &ndash; Une liste de deux tuples contenant les en-têtes HTTP (headers)
* `output` &ndash; Une chaîne contenant l'entité de réponse

* `status` &ndash; Le code statut HTTP (par defaut '200 OK') *401 Unauthorized*
* `headers` &ndash; Une liste de deux tuples contenant les en-têtes HTTP (headers)
* `output` &ndash; Une chaîne contenant l'entité de réponse
Loading