摘要:也就是說用于設(shè)定與處理類間的映射關(guān)系。在中,默認(rèn)使用和函數(shù)分別處理兩種請求。因為表單仍提交到當(dāng)前頁面,所以還是由處理。載入時間相關(guān)的的一個類,獲取當(dāng)前時間戳。獲取數(shù)據(jù)庫中的名為的。
前面的話
Demo1是一個簡單的博客系統(tǒng)(=。=什么網(wǎng)站都叫系統(tǒng))。我們從這個簡單的系統(tǒng)入手,去了解P+T+M網(wǎng)站的內(nèi)部邏輯,并記住一些“規(guī)則”,方便我們進(jìn)一步自己開發(fā)。
“規(guī)則”這個詞特意打上了雙引號,目的是想借此聲明一點:本教程內(nèi)不會將各語句背后的原理逐一講明(事實上我也講不清楚哈哈)。我的著重點將在“怎樣快速學(xué)會使用這個‘框架’去搭建我們想要的網(wǎng)站”,即“怎樣快速上手一個工具”。由于本人在技術(shù)上研究不深入不細(xì)致,所以用詞或者內(nèi)容上難免有不規(guī)范或錯誤之處,能理解的就自行理解哈。當(dāng)然愿意斧正的歡迎指出。
對了,本教程默認(rèn)讀者是有web開發(fā)基礎(chǔ)的,明白“渲染”、“get請求”、“post請求”等分別是什么意思。
講解模式基本的是:
列出項目目錄結(jié)構(gòu)
展示源碼,通過部分源碼注釋(紅色字)講解
列表項目
根據(jù)網(wǎng)站邏輯結(jié)合“代碼回顧”進(jìn)行講解
希望大家復(fù)制源碼(記得把紅字注釋刪除)根據(jù)項目目錄結(jié)構(gòu)創(chuàng)建項目,或者直接將附件中的代碼包拷到你的項目目錄,跟著講解一步一步試驗。
OK,開始。
Demo1項目目錄結(jié)構(gòu)demo1 demo.py -static -css style.css -img bg.jpg logo.png -templates index.html blog.html源碼
demo.py
#!/usr/bin/env python # -*- coding: utf-8 -*- #用于規(guī)定字符編碼,想要中文正常最好就加上這句 import os.path import tornado.auth import tornado.escape import tornado.httpserver import tornado.ioloop import tornado.options import tornado.web from tornado.options import define, options #巴拉巴拉import一大堆tornado的東西,反正都有用,原封不動即可 import pymongo #這里是導(dǎo)入MongoDB define(“port”, default=8002, help=”run on the given port”, type=int) #定義監(jiān)聽的端口,隨便挑個喜歡的數(shù)字吧 class Application(tornado.web.Application): def __init__(self): handlers = [ (r”/”, MainHandler), (r”/blog”, BlogHandler), ] settings = dict( template_path=os.path.join(os.path.dirname(__file__), “templates”), static_path=os.path.join(os.path.dirname(__file__), “static”), debug=True, ) conn = pymongo.Connection(“l(fā)ocalhost”, 12345) self.db = conn[“demo”] tornado.web.Application.__init__(self, handlers, **settings) class MainHandler(tornado.web.RequestHandler): def get(self): self.render(“index.html”,) def post(self): import time title = self.get_argument(‘title’, None) content = self.get_argument(‘content’, None) blog = dict() if title and content: blog[‘title’] = title blog[‘content’] = content blog[‘date’] = int(time.time()) coll = self.application.db.blog coll.insert(blog) self.redirect(‘/blog’) self.redirect(‘/’) class BlogHandler(tornado.web.RequestHandler): def get(self): coll = self.application.db.blog blog = coll.find_one() if blog: self.render(“blog.html”, page_title = blog[‘title’], blog = blog, ) else: self.redirect(‘/’) def main(): tornado.options.parse_command_line() http_server = tornado.httpserver.HTTPServer(Application()) http_server.listen(options.port) tornado.ioloop.IOLoop.instance().start() if __name__ == “__main__”: main()
index.html
B06 Innovation Space 文章正文:
blog.html
部署項目{{ page_title }} ![]()
歡迎訪問B06創(chuàng)新實驗室的博客
{{ blog[‘title’] }} {{ locale.format_date(blog[‘date’], relative=False) }}
{{ blog[‘content’] }}
從頭開始說。
部署用Python開發(fā)的網(wǎng)站,需要在服務(wù)器上運行一個主文件,比如demo1的部署:
打開終端,cd到項目文件夾,執(zhí)行python demo.py命令,此時python就在設(shè)定好的默認(rèn)端口8002運行了我們這個網(wǎng)站。
代碼回顧:
define(“port”, default=8002, help=”run on the given port”, type=int)
此時打開瀏覽器,訪問http://127.0.0.1:8002,我們可以發(fā)現(xiàn)網(wǎng)站已經(jīng)可以正常訪問。
再看終端窗口,發(fā)現(xiàn)已經(jīng)接收到了一個get請求。
服務(wù)器是怎么樣根據(jù)我們的請求然后輸出給我們相應(yīng)頁面的呢?
代碼回顧:
class Application(tornado.web.Application): def __init__(self): handlers = [ (r”/”, MainHandler), (r”/blog”, BlogHandler), ] settings = dict( template_path=os.path.join(os.path.dirname(__file__), “templates”), static_path=os.path.join(os.path.dirname(__file__), “static”), debug=True, ) conn = pymongo.Connection(“l(fā)ocalhost”, 12345) self.db = conn[“demo”] tornado.web.Application.__init__(self, handlers, **settings)
我們看到在Application中初始化了兩個東西(數(shù)據(jù)庫連接另說),分別是handlers和settings。
顧名思義settings就是項目的各種設(shè)置,其中template_path用于指定我們之后要渲染的html文件的文件夾位置,而static_path用于指定之后要用的的一些引用文件(如css文件、js文件、圖片等)的文件夾位置 (我偏不解釋debug是干什么的:-) )。
handler,我百度翻譯了一下,是“處理者”的意思。它的作用就是處理我們向服務(wù)器提交的請求。怎么處理呢?
以(r”/”, MainHandler)為例,雙引號中間是要訪問頁面的相對路徑,而后面的XxxHandler表示這個路徑對應(yīng)的“處理者類”。初始化如上handlers后,當(dāng)我們訪問http://127.0.0.1:8002/時,我們的請求會被交給MainHandler處理;同樣的,當(dāng)我們訪問http://127.0.0.1:8002/blog時,我們的請求將會被交給BlogHandler處理。也就是說handlers用于設(shè)定url與處理類間的映射關(guān)系。
在之后的幾個demo里面,通過對更多handler的設(shè)置,我們會慢慢對handler了解得更清楚一些,不要著急。反正大概意思就是一個網(wǎng)址對應(yīng)一個handler唄。
數(shù)據(jù)庫連接代碼回顧:
class Application(tornado.web.Application): …… conn = pymongo.Connection(“l(fā)ocalhost”, 12345) self.db = conn[“demo”] tornado.web.Application.__init__(self, handlers, **settings)
然后說一下這個部分。聰明的人一看就知道這是數(shù)據(jù)庫連接嘛。
第一句:參數(shù)一,數(shù)據(jù)庫服務(wù)器地址,我們現(xiàn)在是本地服務(wù)器所以用localhost;參數(shù)二,端口號,端口號當(dāng)然是你本地MongoDB使用的端口號。這樣就連接上MongoDB了。
第二句:self.db = conn[“demo”],選擇一個數(shù)據(jù)庫,把數(shù)據(jù)庫名字放在雙引號中間。我的數(shù)據(jù)庫就叫做demo。最后一句就是把之前的設(shè)置都初始化嘛,init就是初始化,聰明人都懂的。
服務(wù)器處理請求OK,回過頭來,剛才說到當(dāng)用戶訪問一個頁面的時候,根據(jù)我們初始化的handler,服務(wù)器會將不同的請求分發(fā)給不同的處理類進(jìn)行處理。
我們的Demo1包含兩個頁面。首頁有一個表單,提交表單后跳轉(zhuǎn)至博客頁面。我們先來看看訪問首頁時是怎么處理的。
當(dāng)我們訪問http://127.0.0.1:8002/時,我們的請求會被交給MainHandler處理,即執(zhí)行這個類里對應(yīng)的內(nèi)容。
代碼回顧:
class MainHandler(tornado.web.RequestHandler):
處理類的定義規(guī)則是class XxxxHandler(tornado.web.RequestHandler)。Request請求,Handler處理者,處理請求的一個類嘛。括號里面的東西肯定跟tornado、跟網(wǎng)絡(luò)什么的有關(guān),乖乖地復(fù)制就好了。
代碼回顧:
def get(self):#用于處理get請求,默認(rèn)參數(shù)是self self.render(“index.html”,) def post(self):#用于處理post請求,默認(rèn)參數(shù)是self import time title = self.get_argument(‘title’, None) content = self.get_argument(‘content’, None) blog = dict() if title or content: blog[‘title’] = title blog[‘content’] = content blog[‘date’] = int(time.time()) coll = self.application.db.blog coll.insert(blog) self.redirect(‘/blog/’) self.redirect(‘/’)
我們看到MainHandler類里定義了get和post兩個方法。
學(xué)習(xí)tornado讓我很感動的一點就是,它讓我明白了其實我們在訪問網(wǎng)頁的時候歸根結(jié)底就是向網(wǎng)站發(fā)出了兩種請求(這個認(rèn)識可能比較淺?。?。
一種是get請求,即打開某個頁面。
另一種是post請求,即向某個頁面提交表單(數(shù)據(jù))。
在tornado中,默認(rèn)使用get和post函數(shù)分別處理兩種請求。所以當(dāng)我們訪問http://127.0.0.1:8002/時,服務(wù)器就會執(zhí)行MainHandler中的get函數(shù)。
代碼回顧:
def get(self): self.render(“index.html”,)
render就是渲染的意思。這一句就是:在瀏覽器中渲染出index.html這個文件的內(nèi)容。index.html文件在哪里呢?從項目目錄結(jié)構(gòu)中可以看到,它在templates文件夾中。還記得settings中定義的templates_path嗎?我們在render()中的雙引號內(nèi)填入templates文件夾中文件的相對路徑即可,服務(wù)器會根據(jù)templates_path自動補(bǔ)全路徑,找到文件,并將之渲染出來。
插一句:在用tornado開發(fā)時,我們常用的目錄結(jié)構(gòu)正如demo1的目錄結(jié)構(gòu)。根目錄下放置python文件,templates文件夾中放置html文件,static文件夾中放置引用文件。
所以,當(dāng)我們訪問http://127.0.0.1:8002/時,最終看到的就是下圖:
代碼回顧:
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/18734.html
摘要:接下來判斷是否為空。因此接下來執(zhí)行。這個方法用于獲取字典中指定鍵名的鍵值第一個參數(shù),如果該鍵名不存在,則返回第二個參數(shù)設(shè)定的默認(rèn)值。當(dāng)我們填寫好表單,點擊發(fā)布按鈕,表單就以方式被提交到相對路徑,對應(yīng)的絕對路徑為。 前面的話 在Demo1里面,我們練習(xí)了如何部署應(yīng)用、tornado框架的基本結(jié)構(gòu)以及應(yīng)用如何處理請求。 其實Demo1算不上一個博客啦。一個最基本的信息系統(tǒng)一定要包含對數(shù)據(jù)...
摘要:接下來判斷是否為空。因此接下來執(zhí)行。這個方法用于獲取字典中指定鍵名的鍵值第一個參數(shù),如果該鍵名不存在,則返回第二個參數(shù)設(shè)定的默認(rèn)值。當(dāng)我們填寫好表單,點擊發(fā)布按鈕,表單就以方式被提交到相對路徑,對應(yīng)的絕對路徑為。 前面的話 在Demo1里面,我們練習(xí)了如何部署應(yīng)用、tornado框架的基本結(jié)構(gòu)以及應(yīng)用如何處理請求。 其實Demo1算不上一個博客啦。一個最基本的信息系統(tǒng)一定要包含對數(shù)據(jù)...
摘要:學(xué)習(xí)筆記七數(shù)學(xué)形態(tài)學(xué)關(guān)注的是圖像中的形狀,它提供了一些方法用于檢測形狀和改變形狀。學(xué)習(xí)筆記十一尺度不變特征變換,簡稱是圖像局部特征提取的現(xiàn)代方法基于區(qū)域圖像塊的分析。本文的目的是簡明扼要地說明的編碼機(jī)制,并給出一些建議。 showImg(https://segmentfault.com/img/bVRJbz?w=900&h=385); 前言 開始之前,我們先來看這樣一個提問: pyth...
摘要:如果你使用而不是硬編碼的話,你的代碼不需要改變。如果你在每個引用靜態(tài)資源的文件中硬編碼靜態(tài)路徑部分,你將不得不手動修改每個模板。 我相信當(dāng)你在看這篇文章的時候,你一定已經(jīng)了解了 模板Templates 這個概念。 在Tornado Web應(yīng)用中使用render方法傳送HTML給瀏覽器,即將模板在瀏覽器中渲染出來。 我們知道render函數(shù)參數(shù)包含兩個部分:第一個部分是模板文件。我們...
閱讀 2508·2021-11-24 09:39
閱讀 3553·2019-08-30 15:53
閱讀 631·2019-08-29 15:15
閱讀 2936·2019-08-26 13:23
閱讀 3259·2019-08-26 10:48
閱讀 679·2019-08-26 10:31
閱讀 808·2019-08-26 10:30
閱讀 2393·2019-08-23 18:32