web.py 0.3 新手指南

開始

你知道 Python 同時你但願製做一個網站。 那麼web.py正好提供了一種簡單的方法。 html

若是你但願讀完整個指南, 你須要安裝Python, web.py, flup, psycopg2, 和Postgres (或者等價的數據庫和Python驅動)。 詳細,能夠查看 webpy.org. java

若是你已經有了一個web.py項目,請看看升級 頁面的相關信息。 python

準備開始。 mysql

URL 處理

任何網站最重要的部分就是它的URL結構。你的URL並不只僅只是訪問者所能看到而且能發給朋友的。它還規定了你網站運行的心智模型。在一些相似 del.icio.us 的流行網站 , URL甚至是UI的一部分。 web.py使這類強大的URL成爲可能。 web

在開始你的web.py程序以前,打開一個文本文件(文件名爲code.py)輸入: 正則表達式

import web

這條語句會導入web.py模塊。 sql

如今咱們須要把咱們的URL結構告訴web.py。讓我從下面這個簡單的例子開始: 數據庫

urls = (
  '/', 'index'
)

第一部分是匹配URL的 正則表達式,像/、/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會在這個文件的全局命名空間中查找對應類。

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應用。若是你在命令行下面,請輸入:

$ 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

模板

在 Python 中寫 HTML 不是聰明的選擇,相反在 HTML 中寫 Python 則有趣的多。幸運的是,web.py 讓這件事情作得簡單而又漂亮。

注意: 老版本的 web.py 使用 Cheetah 模板系統,你能夠也歡迎使用其餘模板系統,但它可能不會被長久支持。

給模板新建一個目錄(命名爲 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 模板.

數據庫操做

注意: 在你開始使用數據庫以前,確保你已經安裝了合適的數據庫訪問庫。好比對於MySQL數據庫,使用 MySQLdb ,對於Postgres數據庫使用psycopg2。

首先你須要建立一個數據庫對象。

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 找到這方面具體的細節以及全部web.py的函數說明。

開發

web.py 還有一些幫助咱們debug的工具。當它在內建的服務器中運行時,它會一debug模式啓動程序。在debug模式中,任何代碼、模板的修改,都會讓服務器從新加載它們,而後還會輸出有用的錯誤消息。

只有在生產環境中debug模式是關閉的。若是你想禁用debug模式,你能夠在建立程序/模板前添加像這樣的行。

web.config.debug = False

咱們的指南就到這裏了。若是要作更多很酷的東西,你能夠先查看一下文檔。

下一步是什麼?

相關文章
相關標籤/搜索