為什么要寫這個教程呢?非常多的新手問同樣的問題,很煩惱。我并不打算寫得大而全,我只想寫一個簡單的入門級的,解決新手的煩惱,其他知識你需要看官方文檔。我寫了一個簡單的 todo 程序,供新手學(xué)習(xí)和參考。
查看100%效果圖 > 來看源代碼的?直接拉到最后。
許多新手,特別是從 ASP/PHP/JSP 轉(zhuǎn)過來的同學(xué),經(jīng)常問下面這幾個問題:
嗯,我很理解,我當(dāng)初也一樣遇到,原因是我們對 Python 的基礎(chǔ)工作原理不熟悉。Python 中有一個包機(jī)制,也就是說 code.py 中的東西都可以獨(dú)立出來,做為一個模塊或一個包存在,你需要什么就導(dǎo)入什么。例如 url 的配置,你可以獨(dú)立成一個 url.py 的文件,這樣你把 url 配置寫在這里,在 code.py 中導(dǎo)入即可。
不是 /index 對應(yīng)訪問 /index.py 的,在 web.py 中,是對應(yīng)后面的類。在 web.py 中,絕大部分是沒有寫死的,只有 GET 和 POST 是寫死的。
這是我的文件結(jié)構(gòu),不代表其他同學(xué)。
|-- code.py|-- config/
| |-- __init__.py
| |-- settings.py
| `-- url.py
|-- controllers/
| |-- __init__.py
| `-- todo.py
|-- static/
| |-- images/
| `-- styles/
| |-- index/
| | |-- images/
| | | `-- website.png
| | `-- style.css
| `-- reset.css
`-- templates/
|-- error.html
|-- foot.html
|-- header.html
|-- index.html
`-- todo/
`-- edit.html# 使用 Ulipad 的 目錄樹打印 功能輸出。
code.py 主要用于啟動,絕大部分時(shí)候它是沒有用的。
/static 這個是靜態(tài)文件目錄,在內(nèi)置的開發(fā)服務(wù)器上不可以修改,如果你使用其他 web server 來配置的是可以改的。
/controllers 控制層的代碼,或者實(shí)際工作的代碼就在這里。
__init__.py 這是用來做什么的?看起來像初始化?嗯… 如果你希望某個目錄可以被引用,加上這個一樣空白文件就好了,表示當(dāng)前是一個模塊可以被引用。這是給新手做的說明。
/config 一些常用配置,我把 url 的配置獨(dú)立出來了,因?yàn)轫?xiàng)目做大了,url 很長。
我取消了 model 層,不要問我為什么,這是一個很糾結(jié)的話題,如果你需要,你可以獨(dú)立出一個 model 層。
其他的應(yīng)該不用解釋了。
pre_fix = 'controllers.'
urls = (
'/', pre_fix + 'todo.Index',
'/todo/new', pre_fix + 'todo.New',
'/todo/(\d+)', pre_fix + 'todo.View',
'/todo/(\d+)/edit', pre_fix + 'todo.Edit',
'/todo/(\d+)/delete', pre_fix + 'todo.Delete',)
原理前面說過了,前面的訪問地址對應(yīng)后面的方法路徑。好多重復(fù)的字符串,所以我就把前面的弄成一個變量了。
大部分時(shí)候簡單的正則可以適用你的常規(guī)應(yīng)用了,數(shù)字用 (\d+),字符串用 (.*) 。
#!/usr/bin/env python
# coding: utf-8
程序文件中請確保有這兩行開頭,你讀過簡明教程,對吧?你應(yīng)該懂的。第一行表示在 *nix 下面,使用 python 來解釋當(dāng)前程序;第二行表示當(dāng)前文件編碼為 utf-8。
數(shù)據(jù)庫、程序文件等,請全部使用 utf-8 編碼。
經(jīng)常遇到程序編碼錯誤?web.py 內(nèi)部默認(rèn)使用 unicode,經(jīng)過 web.py 處理過的都是 unicode,所以你如果有中文,嘗試轉(zhuǎn)為 unicode,比如 a = u'中文啊'。大部分情況下可能解決。
請統(tǒng)一換行符,即文件格式問題,全部使用 Unix 風(fēng)格的換行符。可能是你的 CSS 是 win 格式的編碼,請改為 Unix 編碼。
默認(rèn) webserver 開發(fā)模式下,不可改名,不可改路徑。你要是拖了自己的其他 webserver,那你自己另外配,當(dāng)然可以是任何名字。
把 render 做為全局變量放到模板中去,然后 $:render.header() 這樣。同樣本示例源碼中也使用了該方式,而沒有使用 layout 方式,該方式看官方文檔。
這樣 $:news.content
i = web.input() # get,post 提交的數(shù)據(jù)通收。
從 i 中取 title,如果沒有取到則將 title 賦值 None。不然,你直接 title = i.title 如果前面的表單中沒有這一項(xiàng)會報(bào)錯。
a = db.select(tb, where='id=$id', vars=locals()) # id 為自增的那個主鍵
select 返回的是一個列表,因此要 a[0] 取到第 1 條。不過你有經(jīng)驗(yàn)的話,接下去仍然要判斷下:
if not a:
return '沒有找到結(jié)果…'
return a[0]
讀代碼最實(shí)際,對吧?項(xiàng)目主頁:
Google Code: http://code.google.com/p/simple-todo/
Bitbucket.org https://bitbucket.org/qichangxing/simple-todo
數(shù)據(jù)文件在 /static/sql
下面,請自行導(dǎo)入,默認(rèn)使用了 mysql,需要可以修改成其他數(shù)據(jù)庫,在 /config/settings.py
中修改配置。
請放心,源碼是可以直接工作的,可以直接在目錄下 code.py 即可。其中用到了你經(jīng)常用的常識,期望有了這個之后你可以輕松地開始 web.py 學(xué)習(xí)和應(yīng)用之旅。那么馬上開始吧:
E:\web\test\todo>code.py
http://0.0.0.0:8080/
使用 http://127.0.0.1:8080 訪問。
如果想使用 80 端口訪問,則可以直接加 80 端口號:
E:\web\test\todo>code.py 80