使用web.py創建一個blog

 

01、準備工作
先安裝Python,然後安裝web.py。
不會安裝的朋友,參考本博客的其他文章。
數據庫我準備使用Python自帶的sqlite,因此不用另安裝其他數據庫。
(我的運行環境是在Windows 2003下面,因爲Python是跨平臺的,所以理論上在Linux下面一樣可行,但是我沒有測試)
當前程序版本:Python 2.5.1,web.py 0.23。
(Python的官方網站:http://www.python.org
(web.py的官方網站:http://webpy.org
02、數據庫
數據庫我是用sqlite,主要是我並不會做一個大大大大的blog,用mysql是不是太浪費了?
而且sqlite現在python也集成了,用起來很方便。
(當然也可以用mysql,很流行的,如果想使用mysql的話,請搜一下“MySQLdb”)
(在web.py 0.23版本中,目前只支持3種數據庫:postgres、mysql、sqlite)
那麼不用數據庫可不可以?當然可以。我其實很喜歡用txt文件,呵呵。
但是大家都用,我們最好也用。
(很久很久之後的將來,你會發現用數據庫的好處)
我創建一個Python源程序文件:database.py,然後寫一些代碼來創建一個數據庫,並插入一些文件。
代碼如下:(有可能會串行,自己調整一下。因爲我是在Opera下面來寫所以造成串行的。在Safari下面也是)
# -*- coding: cp936 -*-
import sqlite3 # 導入sqlite模塊
con = sqlite3.connect("blog.db") # 連接到數據庫文件
cur = con.cursor() # 創建一個指針
cur.execute("create table user1 (date, number, article)") # 創建1個表格,並創建3個域
tt1 = ('2007-10-11', '1', 'aaa') # 準備要插入的數據
cur.execute("""insert into user1 (date, number, article) values(?,?,?)""", tt1) # 插入數據
tt2 = ('2008-01-19', '2', 'bbbbb') # 再插入一組數據
cur.execute("""insert into user1 (date, number, article) values(?,?,?)""", tt2)
tt3 = ('1997-03-25', '3', 'cc') # 再再插入一組數據
cur.execute("""insert into user1 (date, number, article) values(?,?,?)""", tt3)
con.commit() # 執行操作
cur.close() # 關閉指針
con.close() # 關閉數據庫連接
如果你會SQL的話上面的東西就很好理解,不會的的話,也很好理解,是不是?
數據庫的連接——關閉,指針的創建——關閉,先建立一個表格,表格中有域,可以插入數據。
(你用過Excel沒有?差不多都是一樣的)
有可能你不太理解爲什麼要把插入的數據寫成('2007-10-11', '1', 'aaa')這樣的。
這樣的數據結構是一個tuple(元祖),據說這樣可以防止“數據庫的注入式漏洞”。
好了,運行一下database.py吧,會在同目錄下出現一個文件“blog.db”。這就是我們的數據庫!
(最好能看一下Python Library Reference的13.13 sqlite3 -- DB-API 2.0 interface for SQLite databases)
(這裏面會對python裏面內置的sqlite3做一個簡單但是非常有用的介紹)
03、第一個頁面
我們現在來寫第一個頁面,看看web.py到底能不能跑起來。
代碼如下:
import web
urls = (
'/', 'index',
)

class index:
def GET(self):
print 'index'
if __name__ == "__main__":
web.run(urls, globals())
保存爲:blog_1.py。並運行之。
注意:一定要在命令提示符下運行!
可以在命令提示符下面看到:http://0.0.0.0:8080/
打開IE,訪問:http://127.0.0.1:8080/
可以看到“index”了,是不是?
04、整體架構
現在讓我們冷靜一下,先想想我們要做的這個Blog的整體架構。
雖然我們要做個最最最簡單的Blog,但是還是要先想好然後再動手。
首先,要能“顯示”,能顯示每個用戶的文章、序號、以及日期。
然後,要能“登陸”,只有“登陸”之後才能“寫文章”。
我就想到這兩點,我認爲這就是一個blog的雛形了。
那麼我們需要幾個頁面呢?
第1個:主頁面,顯示所有用戶的文章。
第2個:登陸頁面,用戶在這裏輸入用戶名和密碼
第3個:顯示頁面,顯示某個用戶的文章
第4個:編輯頁面,用戶在這裏寫新文章
(當然,有一些功能也很重要,比如“修改”,比如“圖片”之類,慢慢來添加好不好?)
05、主頁面
現在我們來做主頁面,要能顯示數據庫中的數據。
我們直接來修改blog_1.py。
在import web這行代碼的下面添加:
import sqlite3
把print 'index'這行代碼刪除,
添加:
con = sqlite3.connect("blog.db")
cur = con.cursor()
cur.execute('select * from user1')
for row in cur:
print row
cur.close()
con.close()
把這個文件另存爲:blog_2.py。並運行之(記住要在命令提示符下運行)。
然後我們打開IE,輸入:http://127.0.0.1:8080/
我看到了:(u'2007-10-11', u'1', u'aaa') (u'2008-01-19', u'2', u'bbbbb') (u'1997-03-25', u'3', u'cc')
你看到了沒有?
06、主頁面的第1次修改
其實blog_2.py是一個相當不成熟的例子,我想你也能感覺出來。
因爲數據庫不是這樣用的,web.py是一個框架(Framework),
它提供了數據庫和模板的方便調用方法,這也是我們使用框架的原因。
現在讓我們來使用數據庫吧。
我們直接修改blog_1.py文件。
先在:web.run(urls, globals())這一行上面添加:
web.config.db_parameters = dict(dbn='sqlite', db='blog.db')
(這一行代碼是配置數據庫的,mysql的話還需要添加用戶名和密碼)
其中dbn表示數據庫的名稱,我們填入sqlite;
db表示具體數據庫的文件名稱,我們填入blog.db。
(注意:一定要加後綴名)
然後把print 'index'這行代碼刪除,
添加新的代碼:
user1 = web.select("user1")
print user1[0].date
print len(list(user1))
(第1行是遍歷出整個user1表,第2行顯示user1表的第1個元素的number值,第3行顯示user1表的長度)
(關於第3行看上去會有點奇怪,但是如果你試着用len(user1)這樣就會出錯,請試着理解,這就是“數據庫的方式”)
其中第1行可以改爲user1 = web.query("select * from user1"),顯示出來的東西會是完全一樣的。
爲什麼呢?
因爲本質上是一樣的。但是web.query是用作查詢之用的,最好還是專職專用。
(詳細的還是要看C:/Python25/Lib/site-packages/web文件夾下面的db.py)
把這個文件另存爲:blog_3.py。並運行之。
在127.0.0.1:8080下面我們應該能夠看到:“2007-10-11 2”
其中“2007-10-11”是user1[0].date的值;
“2”是“數據庫遊標之後部分的長度”。
遊標是什麼呢?即cursor(遊標,指針),它指向數據庫的當前位置。
接下來,你可以試試把user1[0].number改成user1[1].number或者user[2].article,看看會顯示出來什麼。
07 主頁面的第2次修改
我們試着來顯示數據庫中所有的元素。
直接修改blog_3.py,其實主要就是修改index類中的GET方法。代碼如下:
class index:
def GET(self):
user1 = web.select("user1")
user1_len = len(list(user1)) #數據庫長度
user1_date = web.select("user1") #得到日期
user1_number = web.select("user1") #得到序號
user1_article = web.select("user1") #得到文章內容
for i in range(0, user1_len):
print user1_date[i].date, /
user1_number[i].number, /
user1_article[i].article
另存爲blog_4.py,並運行之,應該能看到:2007-10-11 1 aaa 2008-01-19 2 bbbbb 1997-03-25 3 cc
或者改爲:
class index:
def GET(self):
user1 = web.select("user1")
user1_len = len(list(user1)) #數據庫長度
user1_date = web.query("select date from user1") #得到日期
user1_number = web.query("select number from user1") #得到序號
user1_article = web.query("select article from user1") #得到文章內容
for i in range(0, user1_len):
print user1_date[i].date, /
user1_number[i].number, /
user1_article[i].article
另存,運行,得到的結果也和上面的一模一樣。
主要區別在於調用的方法不同,一個是web.select一個是web.query。
(我看到別人寫的一個程序,好像都是用的web.query)
雖然這樣可以顯示,不過好醜!
怎麼辦?用模板!
08 用模板
(模板的英文是templates)
我們一步一步來看看模板怎麼用。
首先,先創建一個目錄,名字就是templates。
然後,在這個目錄裏面創建一個文件,名字是index.html。
那麼往這個index.html上面寫些什麼呢?
$def with (user1_date)
<html>
<head>
<title>blog</title>
</head>
<body>
$user1_date[0].date
</body>
</html>
在blog_4.py上面直接修改,在import web的下一行加上:
render = web.template.render('templates/')
然後另存爲blog_5.py。
這主要是告訴程序模板文件的位置。
然後修改index類的GET方法,原先的代碼統統刪掉,新代碼如下:
user1_date = web.query("select date from user1") #得到日期
print render.index(user1_date)
好了,現在保存,然後運行blog_5.py吧。
我看到了:2007-10-11
你呢?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章