国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
laiwei_linjuly_homepage ? 使用web.py創(chuàng)建一個blog

otherrrr@gmail.com原創(chuàng),轉(zhuǎn)載請注明原作者地址:otherrrr 的百度空間。

注:本文針對web.py 0.23版,以及python 2.5.1;
      如果您使用web.py 0.1x版,或python 2.4.x,
      那么有些功能會有所不同

01、準(zhǔn)備工作

先安裝Python,然后安裝web.py。
不會安裝的朋友,參考本博客的其他文章。
數(shù)據(jù)庫我準(zhǔn)備使用Python自帶的sqlite,因此不用另安裝其他數(shù)據(jù)庫。
(我的運行環(huán)境是在Windows 2003下面,因為Python是跨平臺的,所以理論上在Linux下面一樣可行,但是我沒有測試)
當(dāng)前程序版本:Python 2.5.1,web.py 0.23。
(Python的官方網(wǎng)站:http://www.python.org
(web.py的官方網(wǎng)站:http://webpy.org

02、數(shù)據(jù)庫

數(shù)據(jù)庫我是用sqlite,主要是我并不會做一個大大大大的blog,用mysql是不是太浪費了?
而且sqlite現(xiàn)在python也集成了,用起來很方便。
(當(dāng)然也可以用mysql,很流行的,如果想使用mysql的話,請搜一下“MySQLdb”)
(在web.py 0.23版本中,目前只支持3種數(shù)據(jù)庫:postgres、mysql、sqlite)

那么不用數(shù)據(jù)庫可不可以?當(dāng)然可以。我其實很喜歡用txt文件,呵呵。
但是大家都用,我們最好也用。
(很久很久之后的將來,你會發(fā)現(xiàn)用數(shù)據(jù)庫的好處)

我創(chuàng)建一個Python源程序文件:database.py,然后寫一些代碼來創(chuàng)建一個數(shù)據(jù)庫,并插入一些文件。

代碼如下:

# -*- coding: cp936 -*-

import sqlite3 # 導(dǎo)入sqlite模塊

con = sqlite3.connect("blog.db") # 連接到數(shù)據(jù)庫文件

cur = con.cursor() # 創(chuàng)建一個指針

cur.execute("create table user1 (date, number, article)") # 創(chuàng)建1個表格,并創(chuàng)建3個域

tt1 = (’2007-10-11′, ’1′, ‘aaa’) # 準(zhǔn)備要插入的數(shù)據(jù)

cur.execute("""insert into user1 (date, number, article) values(?,?,?)""", tt1) # 插入數(shù)據(jù)

tt2 = (’2008-01-19′, ’2′, ‘bbbbb’) # 再插入一組數(shù)據(jù)

cur.execute("""insert into user1 (date, number, article) values(?,?,?)""", tt2)

tt3 = (’1997-03-25′, ’3′, ‘cc’) # 再再插入一組數(shù)據(jù)

cur.execute("""insert into user1 (date, number, article) values(?,?,?)""", tt3)

con.commit() # 執(zhí)行操作

cur.close() # 關(guān)閉指針

con.close() # 關(guān)閉數(shù)據(jù)庫連接

如果你會SQL的話上面的東西就很好理解,不會的的話,也很好理解,是不是?
數(shù)據(jù)庫的連接——關(guān)閉,指針的創(chuàng)建——關(guān)閉,先建立一個表格,表格中有域,可以插入數(shù)據(jù)。
(你用過Excel沒有?差不多都是一樣的)

有可能你不太理解為什么要把插入的數(shù)據(jù)寫成(’2007-10-11′, ’1′, ‘aaa’)這樣的。
這樣的數(shù)據(jù)結(jié)構(gòu)是一個tuple(元祖),據(jù)說這樣可以防止“數(shù)據(jù)庫的注入式漏洞”。

好了,運行一下database.py吧,會在同目錄下出現(xiàn)一個文件“blog.db”。這就是我們的數(shù)據(jù)庫!

(最好能看一下Python Library Reference的13.13 sqlite3 — DB-API 2.0 interface for SQLite databases)
(這里面會對python里面內(nèi)置的sqlite3做一個簡單但是非常有用的介紹)

03、第一個頁面

我們現(xiàn)在來寫第一個頁面,看看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、整體架構(gòu)

現(xiàn)在讓我們冷靜一下,先想想我們要做的這個Blog的整體架構(gòu)。
雖然我們要做個最最最簡單的Blog,但是還是要先想好然后再動手。

首先,要能“顯示”,能顯示每個用戶的文章、序號、以及日期。

然后,要能“登陸”,只有“登陸”之后才能“寫文章”。

我就想到這兩點,我認(rèn)為這就是一個blog的雛形了。

那么我們需要幾個頁面呢?

第1個:主頁面,顯示所有用戶的文章。

第2個:登陸頁面,用戶在這里輸入用戶名和密碼

第3個:顯示頁面,顯示某個用戶的文章

第4個:編輯頁面,用戶在這里寫新文章

(當(dāng)然,有一些功能也很重要,比如“修改”,比如“圖片”之類,慢慢來添加好不好?)

05、主頁面

現(xiàn)在我們來做主頁面,要能顯示數(shù)據(jù)庫中的數(shù)據(jù)。

我們直接來修改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是一個相當(dāng)不成熟的例子,我想你也能感覺出來。
因為數(shù)據(jù)庫不是這樣用的,web.py是一個框架(Framework),
它提供了數(shù)據(jù)庫和模板的方便調(diào)用方法,這也是我們使用框架的原因。

現(xiàn)在讓我們來使用數(shù)據(jù)庫吧。
我們直接修改blog_1.py文件。

先在:web.run(urls, globals())這一行上面添加:
web.config.db_parameters = dict(dbn=’sqlite’, db=’blog.db’)
(這一行代碼是配置數(shù)據(jù)庫的,mysql的話還需要添加用戶名和密碼)
其中dbn表示數(shù)據(jù)庫的名稱,我們填入sqlite;
db表示具體數(shù)據(jù)庫的文件名稱,我們填入blog.db。
(注意:一定要加后綴名)

然后把print ‘index’這行代碼刪除,
添加新的代碼:

        user1 = web.select("user1")
        print user1[0].date
        print len(list(user1))
(第1行是遍歷出整個user1表,第2行顯示user1表的第1個元素的number值,第3行顯示user1表的長度)
(關(guān)于第3行看上去會有點奇怪,但是如果你試著用len(user1)這樣就會出錯,請試著理解,這就是“數(shù)據(jù)庫的方式”)

其中第1行可以改為user1 = web.query("select * from user1"),顯示出來的東西會是完全一樣的。
為什么呢?
因為本質(zhì)上是一樣的。但是web.query是用作查詢之用的,最好還是專職專用。
(詳細的還是要看C:\Python25\Lib\site-packages\web文件夾下面的db.py)

把這個文件另存為:blog_3.py。并運行之。
在127.0.0.1:8080下面我們應(yīng)該能夠看到:“2007-10-11 2”

其中“2007-10-11”是user1[0].date的值;
“2”是“數(shù)據(jù)庫游標(biāo)之后部分的長度”。
游標(biāo)是什么呢?即cursor(游標(biāo),指針),它指向數(shù)據(jù)庫的當(dāng)前位置。

接下來,你可以試試把user1[0].number改成user1[1].number或者user[2].article,看看會顯示出來什么。

07、 主頁面的第2次修改

我們試著來顯示數(shù)據(jù)庫中所有的元素。

直接修改blog_3.py,其實主要就是修改index類中的GET方法。代碼如下:

class index:
    def GET(self):
        user1 = web.select("user1")
        user1_len = len(list(user1)) #數(shù)據(jù)庫長度
        user1_date = web.select("user1") #得到日期
        user1_number = web.select("user1") #得到序號
        user1_article = web.select("user1") #得到文章內(nèi)容
for i in range(0, user1_len):
     print user1_date[i].date, \
                  user1_number[i].number, \
                  user1_article[i].article

另存為blog_4.py,并運行之,應(yīng)該能看到: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)) #數(shù)據(jù)庫長度
        user1_date = web.query("select date from user1") #得到日期
        user1_number = web.query("select number from user1") #得到序號
        user1_article = web.query("select article from user1") #得到文章內(nèi)容
        for i in range(0, user1_len):
            print user1_date[i].date, \
                  user1_number[i].number, \
                  user1_article[i].article

另存,運行,得到的結(jié)果也和上面的一模一樣。
主要區(qū)別在于調(diào)用的方法不同,一個是web.select一個是web.query。
(我看到別人寫的一個程序,好像都是用的web.query)

雖然這樣可以顯示,不過好丑!
怎么辦?用模板!

08、 用模板

(模板的英文是templates)

我們一步一步來看看模板怎么用。

首先,先創(chuàng)建一個目錄,名字就是templates。

然后,在這個目錄里面創(chuàng)建一個文件,名字是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方法,原先的代碼統(tǒng)統(tǒng)刪掉,新代碼如下:

user1_date = web.query("select date from user1") #得到日期
print render.index(user1_date)

好了,現(xiàn)在保存,然后運行blog_5.py吧。
我看到了:2007-10-11
你呢?

09 蛋炒飯

我放棄web.py有一段時間了。主要是因為自己在做:
http://code.google.com/p/ssqpython/項目。
但是因為空間的問題,SSQPython項目也擱置了,
于是回頭來看web.py。

web.py官方發(fā)布版本還沒有更新,還是0.23(到2008-04-22為止)。
據(jù)說在下一個版本0.3中,會更改render的顯示方式,把print改為return。

現(xiàn)在準(zhǔn)備重新把這個炒起來。
(注:其實我注意到了在code.google.com上面有類似的項目)

我們先來重新完整的考慮一下整個blog系統(tǒng)的架構(gòu):
(注:如果你是從一開始來看本文章的,也許到了這里你會有一點失望,
      因為我會重新來做,不過前面就當(dāng)作熱身了,好不好?)
- 登陸頁面(login.html) —- (這個頁面也同時作為注冊頁面,這樣好嗎?)
- 瀏覽頁面(blog.html) —- (這個頁面也是主頁面,即在不登陸的情況下顯示此頁面)
- 發(fā)表頁面(post.html)
以上3個頁面是用戶(user)的頁面。
我在這里省去了很多東西,比如:回復(fù)文章功能、修改文章功能、刪除文章功能等等。
而且將來可以添加用戶信息顯示及自定義功能。

我們再來考慮一下管理員(admin)的頁面:
- 登陸頁面(login.html) —- (管理員就不能有注冊頁面了,要在后臺進行注冊及密碼修改等操作)
- 查看頁面(index.html) —- (瀏覽用戶的數(shù)據(jù),可刪除用戶、刪除文章……)
以上2個頁面也不是很完整,還有許多功能需要添加,但是目前我還沒有想到還有什么功能是必須的。

至于“登出”功能則會在每個頁面都顯示一個按鈕的方式來實現(xiàn)。

這些架構(gòu)的思考目前還不是很完善,我也是在一步一步摸索中……
(注:其實“標(biāo)簽”或者“類別”的功能很重要,這個將來也要完善)

10 大排面(主瀏覽頁面–生成數(shù)據(jù)庫)

我們現(xiàn)在假設(shè)數(shù)據(jù)庫中有很多很多數(shù)據(jù),我們現(xiàn)在只是要把它們顯示出來。
這個顯示頁面是主瀏覽頁面(index.html)。

首先我們來生成這樣的數(shù)據(jù)。
我們創(chuàng)建一個db.py文件。
文件內(nèi)容如下:

import sqlite3

con = sqlite3.connect(‘blog.db’)
cur = con.cursor()

cur.execute(‘create table article \
(articleID, articleTitle, articleContent, \
articleAuthor, articleTime)’)

insert_datas = (’1′, ‘title_1′, ‘content_1′, ‘user_1′, ’2008-01-01′)
cur.execute(‘insert into article \
(articleID, articleTitle, articleContent, \
articleAuthor, articleTime) values (?, ?, ?, ?, ?)’, \
insert_datas)

con.commit()                  
cur.close()
con.close()

運行:python db.py
則會生成:blog.db文件

在這個數(shù)據(jù)庫中有1個表(table),
這個表有5個域(field)或者說是5個列(column),
分別是:文章的ID號(這個會從1開始排列到無窮大)
        文章的標(biāo)題
        文章的內(nèi)容
        文章的作者
        文章的時間(這里當(dāng)前記錄的文章的發(fā)表時間,將來會有另一個來記錄修改時間)

11 大肉面(主瀏覽頁面–主程序文件)

我們再創(chuàng)建一個blog.py,這個會是我們這個blog的主程序文件。

import web

render = web.template.render(‘templates/’)

urls = (
    ‘/’, ‘index’,
)

class index:
    def GET(self):
        datas = web.query("select * from article order by articleID desc")
        print render.index(datas)

if __name__ == "__main__":
    web.webapi.internalerror = web.debugerror
    web.config.db_parameters = dict(dbn=’sqlite’, db=’blog.db’)
    web.run(urls, globals(), web.reloader)

在這里我們定義了模板(template)的位置:templates文件夾。
并且定義了當(dāng)訪問“/”的時候,調(diào)用index類。
這表示我們訪問127.0.0.1的時候,會顯示index類中的print內(nèi)容。

并且我們開啟了debug,即:web.webapi.internalerror = web.debugerror
并設(shè)置數(shù)據(jù)庫為sqlite,訪問文件為blog.db。

12 炸醬面(主瀏覽頁面–模板)

我們先創(chuàng)建一個文件夾:templates。
在這個文件夾下面創(chuàng)建一個index.html文件,這個文件就是我們用到的模板。
文件內(nèi)容如下:

$def with (datas)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>blog</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<div id="wrapper">
    <div id="logo">
        <p>Blog</p>
    </div>
    <div id="nav">
    </div>
    <div id="article">
       $for data in datas:
            <div id="title">
            <p>$data.articleTitle</h3>
            </div>
            <div id="time">
            <p>$data.articleTime</p>
            </div>
            <div id="content">
            <p>$data.articleContent</p>
            </div>
            <div id="author">
            <p>Post by $data.articleAuthor</p>
            </div>
        </div>
    </div>
    <div id="copyright">
        <p>Copyright &copy; 2008 otherrrr. All rights reserved.</p>
    </div>
</div>
</body>
</html>

其中:
<!DOCTYPE …….>是定義HTML的文件格式
<head>文件頭
<title>文件標(biāo)題
<meta ……>文檔的其他信息
<body>主體
<div id="">之類的東西,CSS+DIV。
目前我們還沒有用上CSS,先定義一下,將來一定會用上的。

$def with (datas)定義了傳遞過來的變量,
這個與blog.py中的print render.index(datas)
相對應(yīng)。
$for data in datas:是想循環(huán)顯示所有數(shù)據(jù)。
datas是一個storage格式的數(shù)據(jù),類似與dict(字典),
所以調(diào)用其中的值時可以用[],例如data['articleTitle']
但是用“.”無疑更為方便!

13 鹵肉飯(主瀏覽頁面–好了)

好了,現(xiàn)在我們運行一下吧:python blog.py
(這個要在命令行下運行)
顯示:http://0.0.0.0:8080/
在瀏覽器中訪問網(wǎng)址:http://127.0.0.1:8080/
(請把這個網(wǎng)址添加到瀏覽器的收藏夾中,因為在后面會多次用到)
(而且我建議用Firefox,因為有些插件感覺挺不錯的,F(xiàn)irebug/YSlow)

可以看到:

title_1 – user_1

content_1

2008-01-01

因為現(xiàn)在只有一組數(shù)據(jù),所以只顯示了一組數(shù)據(jù)。

順便說一下:如果你想修改端口,可以這樣:python blog.py 80
這樣就可以瀏覽:http://127.0.0.1/了。

14 雞腿飯(主瀏覽頁面–多個文章同時顯示)

現(xiàn)在我們開始修改了,你最好把剛才那些文件另存為一下,
以免修改過程中出現(xiàn)“天災(zāi)人禍”。

我們首先修改db.py,新的代碼如下:

import sqlite3

con = sqlite3.connect(‘blog.db’)
cur = con.cursor()

cur.execute(‘create table article \
(articleID, articleTitle, articleContent, \
articleAuthor, articleTime)’)

insert_datas = (’1′, ‘title_1′, ‘content_1′, ‘user_1′, ’2008-01-01′)
cur.execute(‘insert into article \
(articleID, articleTitle, articleContent, \
articleAuthor, articleTime) values (?, ?, ?, ?, ?)’, \
insert_datas)

insert_datas = (’2′, ‘title_2′, ‘content_2′, ‘user_2′, ’2008-02-02′)
cur.execute(‘insert into article \
(articleID, articleTitle, articleContent, \
articleAuthor, articleTime) values (?, ?, ?, ?, ?)’, \
insert_datas)

con.commit()                  
cur.close()
con.close()

其實主要是又添加了一組數(shù)據(jù)。

刪除目錄下的blog.db,然后運行:python db.py

重新啟動:python blog.py,在瀏覽器下可以看到:

title_2 – user_2

content_2

2008-02-02

title_1 – user_1

content_1

2008-01-01

是的,你很聰明的發(fā)現(xiàn)了,這是倒序的,也就是最后插入的數(shù)據(jù)在最上面顯示。
這時我故意的:注意blog.py中的代碼:
datas = web.query("select * from article order by articleID desc")
注意到了desc了嗎?
desc表示倒序。

你可以試著刪除desc來看看顯示效果。

提示:當(dāng)你修改blog.py的時候,并不用關(guān)閉web server,
      修改完成后也不用重啟,可直接刷新頁面瀏覽。
      這是因為我們在blog.py中的最后一行加了: web.reloader

15 茶蛋(網(wǎng)頁鏈接CSS)

網(wǎng)頁中插入CSS的方式有兩種(我就知道兩種,具體幾種方式不確定)
一種是連接文件:
我們來修改一下index.html:
在</head>上面插入一行:

<link rel="stylesheet" type="text/css" href="/static/style.css">

提示:當(dāng)修改template文件夾中的文件之后,必須重啟才能看到效果。

我們重啟一下,看看瀏覽器中顯示什么。
什么也沒發(fā)生變化!
但是在命令行下,我們可以看到:
… /static/style.css" – 404 File not found

我們先創(chuàng)建一個文件夾:static,這個名字是web.py默認(rèn)的放置靜態(tài)文件的目錄名。
然后創(chuàng)建一個style.css,可以用記事本或者之類的東西創(chuàng)建。
(我用gVim,對于vim我有這樣的感受:它確實提高了我的效率,但是也讓我的手——
變得更累了)

文件內(nèi)容如下:

*******
(注:在百度的blog中填寫css代碼,會給顯示出來,暫時無法給出CSS的代碼)

然后刷新瀏覽器,感覺非常慢,
但是最終還是顯示出來了。
字體、顏色、位置有了些變化,是不是?

詳細的CSS介紹我就不說了,不過CSS對于網(wǎng)站的美觀真的很重要。

16 咸鴨蛋(網(wǎng)頁內(nèi)置CSS)

我們也可以把CSS放到HTML中。

現(xiàn)在我們重新修改index.html,刪掉<link ……這一行。
在</head>上面加入如下文字:

<style type="text/css">
*******
</style>

(注:在百度的blog中填寫css代碼,會給顯示出來,暫時無法給出CSS的代碼)

其中的設(shè)置和style.css一模一樣。

重啟服務(wù)器,刷新瀏覽器。是不是快很多了?

據(jù)說用lighttpd或apache作為web server(服務(wù)器),
對于像CSS文件這樣的靜態(tài)文件的讀取會有很大的提高。
這個我正在嘗試中。

17 軟炸里脊(用戶發(fā)表文章代碼)

用戶發(fā)表文章,就是向數(shù)據(jù)庫中添加信息。

首先修改blog.py

修改urls,代碼如下:

urls = (
    ‘/’, ‘index’,
    ‘/add’, ‘add’,
)

即定義網(wǎng)址后面是“/add”的會調(diào)用add類。

然后我們來寫add類。

class add:
    def GET(self):
        print render.add()

    def POST(self):
        i = web.input()
        t = time.localtime(time.time())
        st = time.strftime("%Y-%m-%d", t)
        datas = list(web.query("select * from article order by articleID desc"))
        n = web.insert(‘article’,
                articleID=str(len(datas)+1), \
                articleTitle=i.post_title, \
                articleContent=i.post_content, \
                articleAuthor=’user_3′, \
                articleTime=st)
        web.seeother(‘/’)

GET中定義顯示add.html這個模板。

POST中定義來提交后的處理。

i = web.input()
得到網(wǎng)頁中提交的數(shù)據(jù)。

time部分是處理日期的格式。
注意:需要在blog.py最前面加上import time。

datas = list(…)
這部分是算一下當(dāng)前的ID會是多少。

為什么len(datas)+1要加str呢?
因為不加str的話,排序會有問題。
我個人認(rèn)為sqlite太過于隨便,不需要初始定義數(shù)據(jù)的類型,
但是到后面才發(fā)現(xiàn),其實預(yù)先定義還是有好處的。

這里面我們的用戶暫時先默認(rèn)為“user_3”,將來會改的。

web.seeother(‘/’)
表示我們會跳轉(zhuǎn)到“/”網(wǎng)址,也就是主頁面。
這部分將來也需要改,我初步的想法是跳到“/blog”頁面。

簡單說一下web.seeother()和web.redirect()的區(qū)別。
redirect()無法后退,后退時會提示:是否需要重新提交數(shù)據(jù)。
官方說明里面說:當(dāng)徹底跳轉(zhuǎn)的時候最好用redirect()。
(注:感覺web.py的官方文檔真的很少,而且有一部分是針對0.3版本的,
      但是主頁能下載的卻是0.23版本的)
(注:web2py不知道大家用過沒有,在郵件列表中感覺其作者“非常”熱情,
      如果一個禮拜當(dāng)中提問的人少,他都會說“太安靜了”,呵呵)

18 糖醋里脊(用戶發(fā)表文章頁面)

我們在templates目錄下創(chuàng)建一個add.html。

我們需要:
一個輸入文章標(biāo)題的文本框、
一個輸入文章內(nèi)容的文本框、
一個提交按鈕。

(我們現(xiàn)在沒有考慮用戶登陸的情況,
在實際情況下,如果用戶未登陸,
那么應(yīng)該提示用戶登陸,并引導(dǎo)
用戶到登陸頁面)

代碼如下(我隱去了CSS部分的代碼):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>post</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<div id="wrapper">
    <div id="logo">
        <p>Blog</p>
    </div>
    <div id="post">
        <form action="/add" method="post">
        <label for="post_title">Title</label><br />
        <textarea id="post_title" name="post_title" cols="60" rows="1"></textarea><br />
        <label for="post_content">Content</label><br />
        <textarea id="post_content" name="post_content" cols="80" rows="10"></textarea><br />
        <input type="submit" name="post_submit" value="Post it" />
        </form>
    </div>
    <div id="copyright">
        <p>Copyright &copy; 2008 otherrrr. All rights reserved.</p>
    </div>
</div>
</body>
</html>

其中<form>定義了一個提交表單。
表單中有兩個文本域(textarea),一個用來輸入標(biāo)題,一個用來輸入內(nèi)容。
并定義了一個提交按鈕。

也許你會問<br />是怎么回事?和<br>有什么區(qū)別。
都是換行的意思。
但是從符合w3c的角度來說<br />更規(guī)范。
(就是說沒有結(jié)束符的標(biāo)簽最好自己本身帶一個結(jié)束符“/”,
同理還有input標(biāo)簽)

那么w3c是什么?一個網(wǎng)頁規(guī)范組織。

19 清蒸里脊(發(fā)表文章測試)

在瀏覽器中訪問:http://127.0.0.1:8080/add
如果無法訪問,請確認(rèn)你的web服務(wù)器已經(jīng)開啟了。

輸入一點東西吧,然后點擊“Post it”按鈕,
看看效果。

再試一次,多輸入點文字,看看有什么不同。

我發(fā)現(xiàn)一個問題,如果輸入多行數(shù)據(jù),但是顯示的時候卻是一行。
只是數(shù)據(jù)之間加了空格。

如果要保證顯示完全正確,是不是需要將“\n”改為“<p>”。

20 糖醋魚(用戶登陸代碼)

修改blog.py,在urls中添加login,修改后代碼如下:

urls = (
    ‘/’, ‘index’,
    ‘/add’, ‘add’,
    ‘/login’, ‘login’,
)

并創(chuàng)建一個login類,代碼如下:

class login:
    def GET(self):
        print render.login()

    def POST(self):
        i = web.input()
        web.setcookie(‘id’, ’1′)
        web.setcookie(‘username’, i.post_username)
        web.seeother(‘/blog’)

在GET()中我們定義了顯示login模板。

在POST()中我們定義了接收到輸入后,跳轉(zhuǎn)到網(wǎng)址“/blog”。

注意看,這里我用到了cookie。
cookie可以記錄用戶訪問網(wǎng)站的一些信息。
如果我們不關(guān)掉瀏覽器,那么這個cookie會一直在。
(因此我們將來一定要做退出)

其中需要設(shè)置兩個值,id和username。

在這里id我是未做完的狀態(tài),固定為“1”。
正常情況下,應(yīng)該判斷用戶的帳戶在數(shù)據(jù)庫中有沒有,以及密碼是否正確。
如帳戶和密碼都正確就從數(shù)據(jù)庫中返回出一個id號。

username則是輸入的值。

(在登陸頁面,其實最好用一些JavaScript來做判斷。
如:用戶名或密碼是否為空等等)

21 水煮魚(用戶登陸頁面)

在撞見用戶登陸頁面之前,我們先從首頁加個鏈接。
修改index.html。

代碼中添加對login頁面的鏈接:

    <div id="nav">
        <a href="/login">Log in</a>
    </div>

并添加對應(yīng)CSS設(shè)置部分。

然后在templates文件夾下創(chuàng)建login.html文件。
文件中的內(nèi)容如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Log in</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<div id="wrapper">
    <div id="logo">
        <p>Blog</p>
    </div>
    <div id="post">
        <form action="/login" method="post">
        <label for="post_username">Username</label><br />
        <input id="post_username" name="post_username"><br />
        <label for="post_password">Password</label><br />
        <input id="post_password" name="post_password" type="password"><br />
        <input type="submit" name="post_login" value="Login" />
        </form>
    </div>
    <div id="copyright">
        <p>Copyright &copy; 2008 otherrrr. All rights reserved.</p>
    </div>
</div>
</body>
</html>

注:文件省去了CSS設(shè)置部分。

我們定義了一個表單(form),用來提交信息。
然后有兩個輸入框(input),一個用來輸入用戶,一個用來輸入密碼。
還有一個提交(submit)按鈕,用來登陸。

密碼框的類型(type)一定要指定為“password”。
不然你輸入密碼旁邊的眼神好的小子就能看見了。

22 家燜黃花魚(跳轉(zhuǎn)到blog頁面)

首先我們還是要該blog.py

urls里面加上:’/blog’, ‘blog’,
(我覺得你現(xiàn)在應(yīng)該知道這個怎么加了)

然后我們定義blog類:

class blog:
    def GET(self):
        session = web.cookies()
        datas = web.query("SELECT * FROM article where articleAuthor=$session.username", vars=locals())
        print render.blog(datas, session)

我們這里得到了cookies()。

并且我們從數(shù)據(jù)庫中查找作者名為登陸用戶名的所有文章。

接下來,是的,我們需要創(chuàng)建blog模板了。
代碼如下(沒有CSS版本的):

$def with (datas, session)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>blog</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<div id="wrapper">
    <div id="logo">
        <p>Blog</p>
    </div>
    <div id="nav">
        <ul>
             <li><a href="/logout">Logout</a></li>
                <li><a href="/add">Add</a></li>
                <li><p>$session.username</p><li>
        </ul>
    </div>
    <div id="article">
       $for data in datas:
            <div id="title">
            <p>$data.articleTitle</h3>
            </div>
            <div id="time">
            <p>$data.articleTime</p>
            </div>
            <div id="content">
            <p>$data.articleContent</p>
            </div>
            <div id="author">
            <p>Post by $data.articleAuthor</p>
            </div>
        </div>
        <div id="copyright">
            <p>Copyright &copy; 2008 otherrrr. All rights reserved.</p>
        </div>
    </div>
</div>
</body>
</html>

是的,這個和index.html非常相似。我就是從index.html上面改的。

主要不同的是這里:
    <div id="nav">
        <ul>
             <li><a href="/logout">Logout</a></li>
                <li><a href="/add">Add</a></li>
                <li><p>$session.username</p><li>
        </ul>
    </div>
我加了2個鏈接,一個是Logout(登陸出),一個是Add(添加文章)。

并添加顯示了登陸進來的用戶名。

注意最前面的部分:
$def with (datas, session)
是的,我們繼承(獲取?)了session變量。
不然我們沒辦法顯示用戶名,對不對?

23 炸刀魚(測試登陸一下下)

首先在index.html里面加一個鏈接:
    <div id="nav">
        <a href="/login">Log in</a>
    </div>
主要是為了鏈接到login(登陸)頁面。

我們先重啟一下Web服務(wù)器:python blog.py

然后,在瀏覽器中訪問http://127.0.0.1/
這會讓我們看到所有用戶的文章。

然后我們點擊Login鏈接,跳轉(zhuǎn)到http://127.0.0.1/login
這個就是登陸頁面。

輸入用戶名:user_2
輸入密碼:*****(隨便輸什么都行,因為我們并沒有驗證用戶和密碼的有效性)

然后點擊Login按鈕。

唰一下,跳轉(zhuǎn)到http://127.0.0.1/blog。
在這里,我們只看見了user_2發(fā)布的文章。

你可以重復(fù)試試登陸user_1或user_3。

(我也不知道自己為什么會用菜名作為小節(jié)名,大概是因為中午總吃不好的緣故吧)

24 火爆腰花(CSS的新處理方法)

把CSS放到網(wǎng)頁中無疑是非常不爽的。
我們來改一下下。

Blog.py中修改urls:

‘/styles.css’, ‘style’,

然后添加新的類(即處理方法):

class style:
    def GET(self):
        web.header("Content-Type","text/css; charset=utf-8")
        print open(‘static/styles.css’).read()

網(wǎng)頁中寫法如下:

<link rel="stylesheet" type="text/css" href="styles.css" />

然后只要將styles.css放在templates目錄下就可以了。

25 黃瓜蜇皮(修改add類)

我們添加一項,當(dāng)?shù)顷懼髸⒂脩裘砑拥綌?shù)據(jù)庫中。
session = web.cookies()
(好像反復(fù)的讀取好像這個不太對,不過我現(xiàn)在還不會在web.py內(nèi)部傳遞變量)

數(shù)據(jù)存儲:sql加上xml,sql記錄正文數(shù)據(jù),xml記錄不常變動的數(shù)據(jù)

(最后更新時間:2008-05-06下午)
otherrrr@gmail.com

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Day 16: Goose Extractor —— 好用的文章提取工具
(轉(zhuǎn))Python 網(wǎng)站開發(fā)(三)Django 模板的使用-東奎博客
避免常見的6種HTML5錯誤用法
html框架
Python 實現(xiàn)個人博客系統(tǒng)
Div CSS布局入門教程(一)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服