摘要:下面的例子就是一個項目的基本框架。一檢查,發(fā)現(xiàn)一個重要的目錄里面還空著呢,那里面放文件,這個文件里面是請求響應的類這個文件的代碼沒有什么增加的內容,只是多了三行設置為的配置,目的是避免漢字亂碼。
</>復制代碼
"just as the Son of Man came not to be served but to serve, and to give his life a ransom for many."(MATTHEW:20:28)
在網(wǎng)上瀏覽網(wǎng)頁,由于現(xiàn)在網(wǎng)速也快了,大概你很少注意網(wǎng)頁中那些所謂的靜態(tài)文件。怎么找出來靜態(tài)文件呢?
如果使用firefox(我特別向列位推薦這個瀏覽器,它是我認為的最好的瀏覽器,沒有之一。哈哈?!澳阈挪恍牛糠凑倚帕恕!?,可以通過firebug組件,來研究網(wǎng)頁的代碼,當然,你直接看源碼也行。
上圖中,我打開了一個對天朝很多人來說不存在的網(wǎng)站,并且通過Firebug查看其源碼,打開,發(fā)現(xiàn)里面有不少
此外,網(wǎng)站中的靜態(tài)文件還包括一些圖片,比如logo,以及做為邊框的圖片等。
在tornado中,有專門方法處理這些靜態(tài)文件。
靜態(tài)路徑看官是否還記得在前面寫過這個模樣的代碼:template_path=os.path.join(os.path.dirname(__file__), "templates"),這里是設置了模板的路徑,放置模板的目錄名稱是templates。類似的方法,我們也可以設置好靜態(tài)文件的路徑。
</>復制代碼
static_path=os.path.join(os.path.dirname(__file__), "static")
這里的設置,就是將所有的靜態(tài)文件,放在了static目錄中。
這樣就設置了靜態(tài)路徑。
下面的代碼是將[上一節(jié)]的代碼進行了改寫,注意變化的地方
</>復制代碼
#! /usr/bin/env python
#-*- coding:utf-8 -*-
import os.path
import tornado.httpserver
import tornado.ioloop
import tornado.web
import tornado.options
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):
lst = ["python","www.itdiffer.com","qiwsir@gmail.com"]
self.render("index.html", info=lst)
handlers = [(r"/", IndexHandler),]
template_path = os.path.join(os.path.dirname(__file__), "temploop")
static_path = os.path.join(os.paht.dirname(__file__), "static") #這里增加設置了靜態(tài)路徑
if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(handlers, template_path, static_path, debug=True) #這里也多了點
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
上面的代碼比前一講中,多了兩處,一處是定義了靜態(tài)文件路徑static_path,在這里將存儲靜態(tài)文件的目錄命名為static。另外一個修改就是在實例化tornado.web.Application()的時候,在參數(shù)中,出了有靜態(tài)路徑參數(shù)static_path,還有一個參數(shù)設置debug=True,這個參數(shù)設置的含義是當前的tornado服務器可以不用重啟,就能夠體現(xiàn)已經(jīng)修改的代碼功能?;叵胍幌?,在前面進行調試的時候,是不是每次如果修改了代碼,就得重啟tornado服務器,才能看到修改效果。用了這個參數(shù)就不用這么麻煩了。
特別說著,debug=True僅僅用于開發(fā)的調試過程中,如果在生產(chǎn)部署的時候,就不要這么使用了。
編寫模板文件我們設置靜態(tài)路徑的目的就是要在模板中引入css和js等類型的文件以及圖片等等。那么如何引入呢,下面以css為例說明。
在一般網(wǎng)頁的...部分,都會引入CSS,例如下面的寫法不少網(wǎng)站都愿意引用google的字體庫,樣式如下:
</>復制代碼
這就是CSS的引入。
但是,如果看官在墻內也這么引入字體庫,希望自己的網(wǎng)頁上能使用,那就有點麻煩了,因為google的這個項目已經(jīng)不行被墻,如果在網(wǎng)頁中寫了上面代碼,會導致網(wǎng)頁打開速度很慢,有的甚至出錯。
怎么辦?那就不用啦。不過,國內有好心網(wǎng)站做了整個谷歌字體的代理,可以用下面方式,墻里面就不怕了。
</>復制代碼
順便提供一個墻內的常用前端庫地址:http://libs.useso.com/,供看官參考使用。
那么如果我自己寫CSS呢?并且按照前面的設定,已經(jīng)將該CSS文件放在了static目錄里面,命名為style.css,就可以這樣引入
</>復制代碼
但是,這里往往會有一個不方便的地方,如果我手閑著無聊,或者因為別的充足理由,將存儲靜態(tài)文件的目錄static換成了sta,并且假設我已經(jīng)在好幾個模板中都已經(jīng)寫了上面的代碼。接下來我就要把這些文件全打開,一個一個更改里面的地址。
請牢記,凡是遇到重復的事情,一定要找一個函數(shù)方法解決。tornado就提供了這么一個:static_url(),把上面的代碼寫成:
</>復制代碼
這樣,就不管你如何修改靜態(tài)路徑,模板中的設置可以不用變。
按照這個引入再修改相應的模板文件。
一個項目框架以上以及此前,我們所有寫過的,都是簡單的技術方法演示,如果要真的寫一個基于tornado框架的網(wǎng)站,一般是不用這樣的直接把代碼都寫到一個文件index.py中的,一個重要原因,就是這樣做不容易以后維護,也不便于多人協(xié)作寫一個項目。
所以在真實的項目中,常常要將不同部件寫在不同文件中。下面的例子就是一個項目的基本框架。當然,這還是一個比較小的項目,但是“麻雀雖小,五臟俱全”。
創(chuàng)建一個文件夾,我給它命名為project,在這個文件里面分別創(chuàng)建下面的文件和目錄,文件和目錄里面的內容可以先不用管,“把式把式,先看架勢”,先搭起項目結構來。
文件application.py:這個文件的核心任務是完成tornado.web.Application()的實例化
文件url.py:在這個文件中記錄項目中所有URL和映射的類,即完成前面代碼中handlers=[...]的功能
文件server.py:這是項目的入口文件,里面包含if __name__ == "__main__",從這里啟動項目和服務
目錄handler:存放.py文件,即所謂各種請求處理類(當然,如果更大一些的項目,可能還要分配給別的目錄來存儲這種東西)
目錄optsql:存放操作數(shù)據(jù)庫的文件,比如各種讀取或者寫入數(shù)據(jù)庫的類或函數(shù),都放在這里面的某些文件中
目錄static:存放靜態(tài)文件,就是上文說的比如CSS,JS,圖片等,為了更清晰,在這個目錄里面,還可建立子目錄,比如我就建立了:css,js,img三個子目錄,分別對應上面的三種。
目錄template:存放.html的模板(在更大型的項目中,可能會設計多個目錄來存放不同的模板,或者在里面再有子目錄進行區(qū)分)
以上就是我規(guī)劃的一個項目的基本框架了。不同開發(fā)者根據(jù)自己的習慣,有不同的規(guī)劃,或者有不同的命名,這沒有關系。不過需要說明的,盡量使用名詞(英文)。我看到過有人做過單復數(shù)之爭論。我個人認為,這個無所謂,只要在一個項目中一貫就好了。我還是用單數(shù)吧,因為總忘記那個復數(shù)后面的s
下面分別把不同部分文件的內容列出來,因為都是前面代碼的重復,不過是做了一點從新部署,所以,就不解釋了。個別地方有一點點說明。
文件application.py的代碼如下:
</>復制代碼
#!/usr/bin/env python
#coding:utf-8
from url import url
import tornado.web
import os
setting = dict(
template_path=os.path.join(os.path.dirname(__file__),"template"),
static_path=os.path.join(os.path.dirname(__file__),"static"),
)
application = tornado.web.Application(
handlers=url,
**setting
)
from url import url是從文件url.py引入內容
下面看看url.py文件內容:
</>復制代碼
#!/usr/bin/env python
#coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
from handler.index import IndexHandler
url=[
(r"/", IndexHandler),
]
在這個文件中,從import sys開始的三行,主要是為了解決如果文件里面有漢字,避免出現(xiàn)亂碼。現(xiàn)在這個文件很簡單,里面只有(r"/", IndexHandler)一條URL,如果多條了,就要說明每條是什么用途,如果用中文寫注釋,需要避免亂碼。
以上兩個預備好了,就開始寫server.py,內容如下:
</>復制代碼
#!/usr/bin/env python
#coding:utf-8
import tornado.ioloop
import tornado.options
import tornado.httpserver
import sys
from application import application
from tornado.options import define,options
define("port",default=8888,help="run on th given port",type=int)
def main():
tornado.options.parse_command_line()
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(options.port)
print "Development server is running at http://127.0.0.1:%s/" % options.port
print "Quit the server with Control-C"
tornado.ioloop.IOLoop.instance().start()
if __name__=="__main__":
main()
這個就不需要解釋了。接下來就看目錄,首先在static/css/里面建立一個style.css的文件,并寫樣式表。我只寫了下面的樣式,這個樣式的目的主要是去除瀏覽器默認的樣式,在實際的工程項目中,這個步驟是非常必要的,一定要去除所有默認的樣式,然后重新定義,才能便于控制。
</>復制代碼
html, body, div, span, applet, object, iframe,h1, h2, h3, h4, h5, h6, p, blockquote, pre,a, abbr, acronym, address, big, cite, code,del, dfn, em, img, ins, kbd, q, s, samp,small, strike, strong, sub, sup, tt, var,b, u, i, center,dl, dt, dd, ol, ul, li,fieldset, form, label, legend,table, caption, tbody, tfoot, thead, tr, th, td,article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary,time, mark, audio, video {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {
display: block;
}
body {
/* standard body */
margin: 0 auto;
width: 960px;
font: 14px/20px "Trebuchet MS", Verdana, Helvetica, Arial, sans-serif;
}
為了能夠在演示的時候看出樣式控制的變化,多寫了一個對body的控制,居中且寬度為960px。
樣式表已經(jīng)定義好,就要看template/index.html了,這個文件就是本項目中的唯一一個模板。
</>復制代碼
Loop <span class="hljs-keyword">in</span> template
aaaAAA
There is a list, it is {{info}}
I will print the elements of this list in order.
{% for element in info %}
{{element}}
{% end %}
{% for index,element in enumerate(info) %}
info[{{index}}] is {{element}}
{% if element == "python" %}
I love this language--{{element}}
{% end %}
{% end %}
{% if "qiwsir@gmail.com" in info %}
A Ha, this the python lesson of LaoQi, It is good! His email is {{info[2]}}
{% end %}
Next, I set "python-tornado"(a string) to a variable(var)
{% set var="python-tornado" %}
Would you like {{var}}?
在這個文件中,特別注意就是,這里引入了前面定義的樣式表文件。引入方式就是前文講述的方式,不過由于是在css這個子目錄里面,所以寫了相對路徑。
行文到此,我原以為已經(jīng)完成了。一檢查,發(fā)現(xiàn)一個重要的目錄handler里面還空著呢,那里面放index.py文件,這個文件里面是請求響應的類IndexHandler
</>復制代碼
#!/usr/bin/env python
#coding:utf-8
import tornado.web
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
class IndexHandler(tornado.web.RequestHandler):
def get(self):
lst = ["python","www.itdiffer.com","qiwsir@gmail.com"]
self.render("index.html", info=lst)
這個文件的代碼沒有什么增加的內容,只是多了三行設置為utf-8的配置,目的是避免漢字亂碼。另外,很需要說明的是,由于這個文件在handler目錄里面,要在上一層的url.py中引用(看url.py內容),必須要在本目錄中建立一個名稱是__init__.py的空文。
好了,基本結構已經(jīng)完成。跑起來。效果就是這樣的:
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37438.html
摘要:軟件開發(fā)者通常依據(jù)特定的框架實現(xiàn)更為復雜的商業(yè)運用和業(yè)務邏輯。所有,做開發(fā),要用一個框架。的性能是相當優(yōu)異的,因為它師徒解決一個被稱之為問題,就是處理大于或等于一萬的并發(fā)。 One does not live by bread alone,but by every word that comes from the mouth of God --(MATTHEW4:4) 不...
摘要:的非阻塞單線程的特點在這個模塊中體現(xiàn)。還有一個模塊引入,是用完成的這兩句就顯示了所謂命令行解析模塊的用途了。表示可以接收來自的請求了。以上把一個簡單的剖析。 As he walked by the sea of Galilee, he saw two brothers, Simon, who is called Peter, and Andrew his brother, cas...
摘要:在的模板中,功能還是很不少的,本講介紹模板語法先。然后在模板中,利用語句,依次顯示得到的列表中的元素。的代碼不變,只修改模板的代碼,重點理解模板中的語句寫法。這樣就是實現(xiàn)了模板中變量的使用。 Come to me, all you that are weary and are carrying heavy burdens, and I will give you rest. Ta...
摘要:特別提醒,看官不要自宮,因為本教程不是辟邪劍譜,也不是葵花寶典,撰寫本課程的人更是生理健全者。直到目前,科學上尚未有證實或證偽自宮和寫程序之間是否存在某種因果關系。和是中用的最多的方法啦。 Do not store up for yourselves treasures on earth, where moth and rust consume and where thieves...
摘要:在年時,由網(wǎng)景公司的布蘭登艾克,在網(wǎng)景導航者瀏覽器上首次設計實作而成。為了取得技術優(yōu)勢,微軟推出了,推出,與同樣可在瀏覽器上運行。在表單中還要注意,有一個,表示的是要將表單的內容提交給路徑所對應的程序來處理。 But when he heard this, he said:Those who are well have no need of a physician, but th...
閱讀 1865·2023-04-25 14:28
閱讀 1897·2021-11-19 09:40
閱讀 2802·2021-11-17 09:33
閱讀 1390·2021-11-02 14:48
閱讀 1716·2019-08-29 16:36
閱讀 3338·2019-08-29 16:09
閱讀 2923·2019-08-29 14:17
閱讀 2386·2019-08-29 14:07