你知道 Python 同時你但願製做一個網站。 那麼web.py正好提供了一種簡單的方法。 html
若是你但願讀完整個指南, 你須要安裝Python, web.py, flup, psycopg2, 和Postgres (或者等價的數據庫和Python驅動)。 詳細,能夠查看 webpy.org. java
若是你已經有了一個web.py項目,請看看升級 頁面的相關信息。 python
準備開始。 mysql
任何網站最重要的部分就是它的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會在這個文件的全局命名空間中查找對應類。
如今咱們須要來寫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
咱們的指南就到這裏了。若是要作更多很酷的東西,你能夠先查看一下文檔。