[零基礎學python]使用tornado表單和模板

But when he heard this, he said:"Those who are well have no need of a physician, but those who are sick. Go and learn what this means,'Idesire mercy, not sacrifice' For I have come to call not the righteous but sinners."(MATTHEW 9:12)javascript

若是像前面那麼作網站,也太醜陋了。而且功能也很少。html

在實際作網站中,如今都要使用一個模板,而且在用戶直接看到的頁面,用html語言來寫頁面(關於HTML,本教程默認爲看官已經熟悉,若是不熟悉,能夠到找有關教程來學習)。前端

在作網站的行業裏面,經常將HTML+CSS+JS組成的網頁,稱做「前端」。它主要負責展現,或者讓用戶填寫一些表格,經過JS提交給用python寫的程序,讓python程序來處理數據,那些處理數據的python程序稱之爲「後端」。我經常提醒作「後端」的,不要輕視「前端」。若是看官立志成爲全棧工程師,就要從前到後都通。java

在本講中,爲了突出模板和後端程序,我略去CSS+JS,雖然這樣一來界面難看,並且用戶的友好度也不怎麼樣(JS,javascript是使網頁變得更友好的重要工具,如不用更換地址就能刷新頁面等等,特別提醒看官,必定要學好javascript,雖然這個可能沒有幾個大學教的。請看維基百科對javascript簡介:)。python

JavaScript,一種直譯式腳本語言,是一種動態類型、弱類型、基於原型的語言,內置支持類。它的解釋器被稱爲JavaScript引擎,爲瀏覽器的一部分,普遍用於客戶端的腳本語言,最先是在HTML網頁上使用,用來給HTML網頁增長動態功能。然而如今JavaScript也可被用於網絡服務器,如Node.js。web

在1995年時,由網景公司的布蘭登·艾克,在網景導航者瀏覽器上首次設計實做而成。由於網景公司與昇陽公司合做,網景公司管理層次結構但願它外觀看起來像Java,所以取名爲JavaScript。但實際上它的語法風格與Self及Scheme較爲接近。後端

爲了取得技術優點,微軟推出了JScript,CEnvi推出ScriptEase,與JavaScript一樣可在瀏覽器上運行。爲了統一規格,1997年,在ECMA(歐洲計算機制造商協會)的協調下,由Netscape、Sun、微軟、Borland組成的工做組肯定統一標準:ECMA-262。由於JavaScript兼容於ECMA標準,所以也稱爲ECMAScript。瀏覽器

上面這段引文裏面提到了一個很是著名的公司:網景,可能年青一代都忘卻了。也建議有興趣的看官到維基百科中瞭解這個傳奇公司,它曾經有一個傳奇產品,雖然名字不復存在,可是Firefox是秉承它衣鉢的。服務器

話題再轉回來,仍是關於本講,主要是要演示一個用模板(HTML)寫一個表單,而後提交給後端的python程序,再轉到另一個顯示的前端頁面顯示。爲了簡化流程,這個過程當中沒有數據處理和CSS+Javascript的工做,全部界面會醜陋。可是,「我很醜,但是我很溫柔」。網絡

一個表單

要作一個前端的頁面,顯示的內容就如同下圖樣式

圖片描述

相應代碼是,並命名爲index.html,存在一個名稱是template的目錄中。

<!DOCTYPE html>
<html>
    <head>
        <title>sign in your name</title>
    </head>
    <body>
        <h2>Please sing in.</h2>
        <form method="post" action="/user">
            <p>Name:<br><input type="text" name="username"></p>
            <p>Email:<br><input type="text" name="email"></p>
            <p>Website:<br><input type="text" name="website"></p>
            <p>Language:<br><input type="text" name="language"></p>
            <input type="submit" value="ok,submit my information">
        </form>
    </body>
</html>

上面的代碼是比較簡單,若是看官熟悉html的話,不熟悉也沒關係,網上搜索就能理解。注意,沒有CSS+JS,因此簡單。若是在真正開發中,這兩個是不能少的。

有了這個表單以後,若是用戶把相關信息都填寫好了。點擊下面的按鈕,就應該提交給後端的python程序來處理。

後端處理程序

作爲tornado驅動的網站,首先要可以把前面的index.html顯示出來,這個通常用get方法,顯示的樣式就按照上面的樣子顯示。

用戶填寫信息以後,點擊按鈕提交。注意觀察上面的代碼表單中,設定了post方法,因此,在python程序中,應該有一個post方法專門來接收所提交的數據,而後把提交的數據在另一個網頁顯示出來。

在表單中還要注意,有一個action=/user,表示的是要將表單的內容提交給/user路徑所對應的程序來處理。這裏須要說明的是,在網站中,數據提交和顯示,路徑是很是重要的。

按照以上意圖,編寫以下代碼,並命名爲usercontroller.py,保存在template目錄中

#!/usr/bin/env python
#coding:utf-8

import os.path

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web

from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)

class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("index.html")

class UserHandler(tornado.web.RequestHandler):
    def post(self):
        user_name = self.get_argument("username")
        user_email = self.get_argument("email")
        user_website = self.get_argument("website")
        user_language = self.get_argument("language")
        self.render("user.html",username=user_name,email=user_email,website=user_website,language=user_language)

handlers = [
    (r"/", IndexHandler),
    (r"/user", UserHandler)
]

template_path = os.path.join(os.path.dirname(__file__),"template")

if __name__ == "__main__":
    tornado.options.parse_command_line()
    app = tornado.web.Application(handlers, template_path)
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

此次代碼量多一些。可是多數在前面講述tornado基本結構的時候已經說過了,跟前面同樣,這裏僅僅把重點的和新出現的進行講述,若是看官對某些內容還有疑問,能夠參考前面的相關章節。

在引入的模塊上,多了一個import os.path,這個模塊主要用在:

template_path = os.path.join(os.path.dirname(__file),"template")

這是要獲取存放程序的目錄template的路徑。

重點看兩個類中都有的self.render(),用這個方法引入相應的模板。

self.render("index.html")

顯示index.html模板,可是此時並無向模板網頁傳遞任何數據,僅僅顯示罷了。下面一個:

self.render("user.html",username=user_name,email=user_email,website=user_website,language=user_language)

與前面的不一樣在於,不只僅是要引用模板網頁user.html,還要向這個網頁傳遞一些數據,例如username=user_name,含義就是,在模板中,某個地方是用username來標示獲得的數據,而user_name是此方法中的一個變量,也就是對應一個數據,那麼模板中的username也就對應了user_name的數據,這是經過username=user_name完成的(說的有點像外語了)。後面的變量同理。

那麼,user_name的數據是哪裏來的呢?就是在index.html頁面的表單中提交上來的。注意觀察路徑的設置,r"/user", UserHandler,也就是在form中的action='/user',就是要將數據提交給UserHandler處理,而且是經過post方法。因此,在UserHandler類中,有post()方法來處理這個問題。經過self.get_argument()來接收前端提交過來的數據,接收方法就是,self.get_argument()的參數與index.html表單form中的各項的name值相同,就會獲得相應的數據。例如user_name = self.get_argument("username"),就可以獲得index.html表單中name爲"username"的元素的值,並賦給user_name變量。

還差一個網頁。

顯示結果

在上面的代碼中,又多了一個模板:index.html,對這個模板,跟前面那個模板有一點兒不同的地方,就是要引入一些變量。它的代碼是這樣的:

<!DOCTYPE html>
<html>
    <head>
        <title>sign in your name</title>
    </head>
    <body>
        <h2>Your Information</h2>
        <p>Your name is {{username}}</p>
        <p>Your email is {{email}}</p>
        <p>Your website is {{website}}, it is very good. This website is make by {{language}}</p>
    </body>
</html>

請將上面的代碼和這句話對照:

self.render("user.html",username=user_name,email=user_email,website=user_website,language=user_language)

上面的模板代碼存儲爲名爲user.html的文件,而且和前面已經保存的在同一個目錄中。

看HTML模板代碼中,有相似{{username}}的變量,模板中用{{}}引入變量,這個變量就是在self.render()中規定的,二者變量名稱一致,對應將相應的值對象引入到模板中。

運行結果

進入到template目錄,執行:

qw@qw-Latitude-E4300:~/template$ python userscontroller.py

而後在瀏覽器的地址欄中輸入

http://localhost:8000

出現以下圖的表單,並填寫表單內容

圖片描述

點擊「按鈕」以後:

圖片描述

這樣就實現了一個簡單表單提交的網站。

相關文章
相關標籤/搜索