[零基礎學python]Tornado靜態路徑以及一個項目框架

"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)javascript

在網上瀏覽網頁,因爲如今網速也快了,大概你不多注意網頁中那些所謂的靜態文件。怎麼找出來靜態文件呢?css

若是使用firefox(我特別向列位推薦這個瀏覽器,它是我認爲的最好的瀏覽器,沒有之一。哈哈。「你信不信?反正我信了。」),能夠經過firebug組件,來研究網頁的代碼,固然,你直接看源碼也行。html

圖片描述

上圖中,我打開了一個對天朝不少人來講不存在的網站,而且經過Firebug查看其源碼,打開<head>,發現裏面有很多<script<link開始引入的文件,這些文件一部分是javascript文件,一部分是css文件。在一個網站中,這類文件通常是不會發生變化的,也就是它的內容穩定,直到下次文件管理員或者有權限的人修改時。而網站程序自己通常不會修改它們。所以將他們稱之爲靜態文件前端

此外,網站中的靜態文件還包括一些圖片,好比logo,以及作爲邊框的圖片等。java

在tornado中,有專門方法處理這些靜態文件。python

靜態路徑

看官是否還記得在前面寫過這個模樣的代碼:template_path=os.path.join(os.path.dirname(__file__), "templates"),這裏是設置了模板的路徑,放置模板的目錄名稱是templates。相似的方法,咱們也能夠設置好靜態文件的路徑。web

static_path=os.path.join(os.path.dirname(__file__), "static")

這裏的設置,就是將全部的靜態文件,放在了static目錄中。sql

這樣就設置了靜態路徑。數據庫

下面的代碼是將[上一節]的代碼進行了改寫,注意變化的地方canvas

#! /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")    #這裏增長設置了靜態路徑

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()

上面的代碼比前一講中,多了兩處,一處是定義了靜態文件路徑static_path,在這裏將存儲靜態文件的目錄命名爲static。另一個修改就是在實例化tornado.web.Application()的時候,在參數中,出了有靜態路徑參數static_path,還有一個參數設置debug=True,這個參數設置的含義是當前的tornado服務器能夠不用重啓,就可以體現已經修改的代碼功能。回想一下,在前面進行調試的時候,是否是每次若是修改了代碼,就得重啓tornado服務器,才能看到修改效果。用了這個參數就不用這麼麻煩了。

特別說着,debug=True僅僅用於開發的調試過程當中,若是在生產部署的時候,就不要這麼使用了。

編寫模板文件

咱們設置靜態路徑的目的就是要在模板中引入css和js等類型的文件以及圖片等等。那麼如何引入呢,下面以css爲例說明。

在通常網頁的<head>...</head>部分,都會引入CSS,例以下面的寫法很多網站都願意引用google的字體庫,樣式以下:

<link href='http://fonts.googleapis.com/css?family=Open+Sans:300,400,600&subset=latin,latin-ext' rel='stylesheet'>

這就是CSS的引入。

可是,若是看官在牆內也這麼引入字體庫,但願本身的網頁上能使用,那就有點麻煩了,由於google的這個項目已經不行被牆,若是在網頁中寫了上面代碼,會致使網頁打開速度很慢,有的甚至出錯。

怎麼辦?那就不用啦。不過,國內有好心網站作了整個谷歌字體的代理,能夠用下面方式,牆裏面就不怕了。

<link href='http://fonts.useso.com/css?family=Open+Sans:300,400,600&subset=latin,latin-ext' rel='stylesheet'>

順便提供一個牆內的經常使用前端庫地址:http://libs.useso.com/,供看官參考使用。

那麼若是我本身寫CSS呢?而且按照前面的設定,已經將該CSS文件放在了static目錄裏面,命名爲style.css,就能夠這樣引入

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

可是,這裏每每會有一個不方便的地方,若是我手閒着無聊,或者由於別的充足理由,將存儲靜態文件的目錄static換成了sta,而且假設我已經在好幾個模板中都已經寫了上面的代碼。接下來我就要把這些文件全打開,一個一個更改<link>裏面的地址。

請牢記,凡是遇到重複的事情,必定要找一個函數方法解決。tornado就提供了這麼一個:static_url(),把上面的代碼寫成:

<link href="{{ static_url("style.css") }}" rel="stylesheet" >

這樣,就無論你如何修改靜態路徑,模板中的設置能夠不用變。

按照這個引入再修改相應的模板文件。

一個項目框架

以上以及此前,咱們全部寫過的,都是簡單的技術方法演示,若是要真的寫一個基於tornado框架的網站,通常是不用這樣的直接把代碼都寫到一個文件index.py中的,一個重要緣由,就是這樣作不容易之後維護,也不便於多人協做寫一個項目。

因此在真實的項目中,經常要將不一樣部件寫在不一樣文件中。下面的例子就是一個項目的基本框架。固然,這仍是一個比較小的項目,可是「麻雀雖小,五臟俱全」。

建立一個文件夾,我給它命名爲project,在這個文件裏面分別建立下面的文件和目錄,文件和目錄裏面的內容能夠先不用管,「把式把式,先看架勢」,先搭起項目結構來。

  • 文件application.py:這個文件的核心任務是完成tornado.web.Application()的實例化
  • 文件url.py:在這個文件中記錄項目中全部URL和映射的類,即完成前面代碼中handlers=[...]的功能
  • 文件server.py:這是項目的入口文件,裏面包含if __name__ == "__main__",從這裏啓動項目和服務
  • 目錄handler:存放.py文件,即所謂各類請求處理類(固然,若是更大一些的項目,可能還要分配給別的目錄來存儲這種東西)
  • 目錄optsql:存放操做數據庫的文件,好比各類讀取或者寫入數據庫的類或函數,都放在這裏面的某些文件中
  • 目錄static:存放靜態文件,就是上文說的好比CSS,JS,圖片等,爲了更清晰,在這個目錄裏面,還可創建子目錄,好比我就創建了:css,js,img三個子目錄,分別對應上面的三種。
  • 目錄template:存放.html的模板(在更大型的項目中,可能會設計多個目錄來存放不一樣的模板,或者在裏面再有子目錄進行區分)

以上就是我規劃的一個項目的基本框架了。不一樣開發者根據本身的習慣,有不一樣的規劃,或者有不一樣的命名,這沒有關係。不過須要說明的,儘可能使用名詞(英文)。我看到過有人作過單複數之爭論。我我的認爲,這個無所謂,只要在一個項目中一向就行了。我仍是用單數吧,由於總忘記那個複數後面的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開始的三行,主要是爲了解決若是文件裏面有漢字,避免出現亂碼。如今這個文件很簡單,裏面只有(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。

樣式表已經定義好,就要看template/index.html了,這個文件就是本項目中的惟一一個模板。

<DOCTYPE html>
<html>
    <head>
        <title>Loop in template</title>
        <link rel="stylesheet" type="text/css" href="{{ static_url('css/style.css')}}">
    </head>
    <body>
    <h1>aaaAAA</h1>
    <p>There is a list, it is <b>{{info}}</b></p>
    <p>I will print the elements of this list in order.</p>
    {% for element in info %}
        <p>{{element}}</p>
    {% end %}
    <br>
    {% for index,element in enumerate(info) %}
        <p>info[{{index}}] is {{element}}
        {% if element == "python" %}
            <p> <b>I love this language--{{element}}</b></p>
        {% end %}
    {% end %}

    {% if "qiwsir@gmail.com" in info %}
        <p><b>A Ha, this the python lesson of LaoQi, It is good! His email is {{info[2]}}</b></p>
    {% end %}
    <h2>Next, I set "python-tornado"(a string) to a variable(var)</h2>
    {% set var="python-tornado" %}
    <p>Would you like {{var}}?</p>
    </body>
</html>

在這個文件中,特別注意就是<link rel="stylesheet" type='text/css' href="{{ static_url('css/style.css')}}",這裏引入了前面定義的樣式表文件。引入方式就是前文講述的方式,不過因爲是在css這個子目錄裏面,因此寫了相對路徑。

行文到此,我原覺得已經完成了。一檢查,發現一個重要的目錄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的空文。

好了,基本結構已經完成。跑起來。效果就是這樣的:

圖片描述


歡迎反問個人網站:www.itdiffer.com,這裏已經將全部《零基礎學python》的課程整理好,而且及時更改錯誤。

相關文章
相關標籤/搜索