Python實(shí)現(xiàn)網(wǎng)站表單提交和模板
如果像前面那么做網(wǎng)站,也太丑陋了。并且功能也不多。
在實(shí)際做網(wǎng)站中,現(xiàn)在都要使用一個(gè)模板,并且在用戶直接看到的頁面,用html語言來寫頁面。
在做網(wǎng)站的行業(yè)里面,常常將HTML+CSS+JS組成的網(wǎng)頁,稱作“前端”。它主要負(fù)責(zé)展示,或者讓用戶填寫一些表格,通過JS提交給用python寫的程序,讓python程序來處理數(shù)據(jù),那些處理數(shù)據(jù)的python程序稱之為“后端”。我常常提醒做“后端”的,不要輕視“前端”。如果立志成為全棧工程師,就要從前到后都通。
關(guān)于本講,主要是要演示一個(gè)用模板(HTML)寫一個(gè)表單,然后提交給后端的python程序,再轉(zhuǎn)到另外一個(gè)顯示的前端頁面顯示。為了簡化流程,這個(gè)過程中沒有數(shù)據(jù)處理和CSS+Javascript的工作,所有界面會丑陋。
一個(gè)表單
要做一個(gè)前端的頁面,顯示的內(nèi)容就如同下圖樣式
相應(yīng)代碼是,并命名為index.html,存在一個(gè)名稱是template的目錄中。
<!DOCTYPE html> <html> <head> <title>sign in your name</title> </head> <body> <h2>Please sign 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的話,不熟悉也不要緊,網(wǎng)上搜索就能理解。注意,沒有CSS+JS,所以簡單。如果在真正開發(fā)中,這兩個(gè)是不能少的。
有了這個(gè)表單之后,如果用戶把相關(guān)信息都填寫好了。點(diǎn)擊下面的按鈕,就應(yīng)該提交給后端的python程序來處理。
后端處理程序
做為tornado驅(qū)動(dòng)的網(wǎng)站,首先要能夠把前面的index.html顯示出來,這個(gè)一般用get方法,顯示的樣式就按照上面的樣子顯示。
用戶填寫信息之后,點(diǎn)擊按鈕提交。注意觀察上面的代碼表單中,設(shè)定了post方法,所以,在python程序中,應(yīng)該有一個(gè)post方法專門來接收所提交的數(shù)據(jù),然后把提交的數(shù)據(jù)在另外一個(gè)網(wǎng)頁顯示出來。
在表單中還要注意,有一個(gè)action=/user,表示的是要將表單的內(nèi)容提交給/user路徑所對應(yīng)的程序來處理。這里需要說明的是,在網(wǎng)站中,數(shù)據(jù)提交和顯示,路徑是非常重要的。
按照以上意圖,編寫如下代碼,并命名為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()
這次代碼量多一些。但是多數(shù)在前面講述tornado基本結(jié)構(gòu)的時(shí)候已經(jīng)說過了,跟前面一樣,這里僅僅把重點(diǎn)的和新出現(xiàn)的進(jìn)行講述,如果對某些內(nèi)容還有疑問,可以參考前面的相關(guān)章節(jié)。
在引入的模塊上,多了一個(gè)import os.path
,這個(gè)模塊主要用在:
template_path = os.path.join(os.path.dirname(__file),"template")
這是要獲取存放程序的目錄template
的路徑。
重點(diǎn)看兩個(gè)類中都有的self.render()
,用這個(gè)方法引入相應(yīng)的模板。
self.render("index.html")
顯示index.html模板,但是此時(shí)并沒有向模板網(wǎng)頁傳遞任何數(shù)據(jù),僅僅顯示罷了。下面一個(gè):
self.render("user.html",username=user_name,email=user_email,website=user_website,language=user_language)
與前面的不同在于,不僅僅是要引用模板網(wǎng)頁user.html,還要向這個(gè)網(wǎng)頁傳遞一些數(shù)據(jù),例如username=user_name,含義就是,在模板中,某個(gè)地方是用username來標(biāo)示得到的數(shù)據(jù),而user_name是此方法中的一個(gè)變量,也就是對應(yīng)一個(gè)數(shù)據(jù),那么模板中的username也就對應(yīng)了user_name的數(shù)據(jù),這是通過username=user_name完成的。后面的變量同理。
那么,user_name的數(shù)據(jù)是哪里來的呢?就是在index.html頁面的表單中提交上來的。注意觀察路徑的設(shè)置,r"/user"
, UserHandler
,也就是在form中的action='/user'
,就是要將數(shù)據(jù)提交給UserHandler處理,并且是通過post方法。所以,在UserHandler類中,有post()方法來處理這個(gè)問題。通過self.get_argument()來接收前端提交過來的數(shù)據(jù),接收方法就是,self.get_argument()的參數(shù)與index.html表單form中的各項(xiàng)的name值相同,就會得到相應(yīng)的數(shù)據(jù)。例如user_name = self.get_argument("username")
,就能夠得到index.html表單中name為"username"的元素的值,并賦給user_name變量。
還差一個(gè)網(wǎng)頁。
顯示結(jié)果
在上面的代碼中,又多了一個(gè)模板:user.html
,對這個(gè)模板,跟前面那個(gè)模板有一點(diǎn)兒不一樣的地方,就是要引入一些變量。它的代碼是這樣的:
<!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的文件,并且和前面已經(jīng)保存的在同一個(gè)目錄中。
看HTML模板代碼中,有類似{{username}}
的變量,模板中用{{}}
引入變量,這個(gè)變量就是在self.render()
中規(guī)定的,兩者變量名稱一致,對應(yīng)將相應(yīng)的值對象引入到模板中。
運(yùn)行結(jié)果
進(jìn)入到template目錄,執(zhí)行:
~/template$ python userscontroller.py
然后在瀏覽器的地址欄中輸入
出現(xiàn)如下圖的表單,并填寫表單內(nèi)容
點(diǎn)擊“按鈕”之后:
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
- Python發(fā)送form-data請求及拼接form-data內(nèi)容的方法
- python處理multipart/form-data的請求方法
- Python模擬瀏覽器上傳文件腳本的方法(Multipart/form-data格式)
- 在python中使用requests 模擬瀏覽器發(fā)送請求數(shù)據(jù)的方法
- kafka-python批量發(fā)送數(shù)據(jù)的實(shí)例
- python使用 request 發(fā)送表單數(shù)據(jù)操作示例
- python實(shí)現(xiàn)的登錄與提交表單數(shù)據(jù)功能示例
- Python使用requests提交HTTP表單的方法
- Python 自動(dòng)化表單提交實(shí)例代碼
- Python的Django框架中forms表單類的使用方法詳解
- Python實(shí)現(xiàn)模擬登錄及表單提交的方法
- python實(shí)現(xiàn)發(fā)送form-data數(shù)據(jù)的方法詳解
相關(guān)文章
實(shí)例講解Python腳本成為Windows中運(yùn)行的exe文件
在本篇文章里小編給大家分享了關(guān)于Python腳本成為Windows中運(yùn)行的exe文件的相關(guān)知識點(diǎn)內(nèi)容,有興趣的朋友們學(xué)習(xí)下。2019-01-01解決python3 Pycharm上連接數(shù)據(jù)庫時(shí)報(bào)錯(cuò)的問題
今天小編就為大家分享一篇解決python3 Pycharm上連接數(shù)據(jù)庫時(shí)報(bào)錯(cuò)的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12Python中實(shí)現(xiàn)輸入一個(gè)整數(shù)的案例
這篇文章主要介紹了Python中實(shí)現(xiàn)輸入一個(gè)整數(shù)的案例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05python 判斷網(wǎng)絡(luò)連通的實(shí)現(xiàn)方法
下面小編就為大家分享一篇python 判斷網(wǎng)絡(luò)連通的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04python實(shí)現(xiàn)根據(jù)窗口標(biāo)題調(diào)用窗口的方法
這篇文章主要介紹了python實(shí)現(xiàn)根據(jù)窗口標(biāo)題調(diào)用窗口的方法,涉及Python操作窗口的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03一文詳解Python中的行為驗(yàn)證碼驗(yàn)證功能
最近在開發(fā)行為驗(yàn)證碼,經(jīng)常觸及到關(guān)于驗(yàn)證類型的相關(guān)內(nèi)容。但使用起來不太熟練,所以本文就來總結(jié)一下對行為驗(yàn)證碼驗(yàn)證類型的理解2023-03-03Python實(shí)現(xiàn)多元線性回歸的梯度下降法
梯度下降法的機(jī)器學(xué)習(xí)的重要思想之一,梯度下降法的目標(biāo),是使得代價(jià)函數(shù)最小。本文主要和大家分享的是python實(shí)現(xiàn)多元線性回歸的梯度下降法,感興趣的可以了解一下2022-08-08python利用pandas將excel文件轉(zhuǎn)換為txt文件的方法
今天小編就為大家分享一篇python利用pandas將excel文件轉(zhuǎn)換為txt文件的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10