bootstrap既然是這么的流行又能省很多的事為什么不用他呢?再加上牛X的produced by FB的tornado簡直如虎添翼了!
1. 安裝配置
安裝所需要的庫等內容。這里沒什么需要多講的。tornado直接用easy_install或者pip。bootstrap直接下下來就OK了。當然還需要下載bootstrap依賴的jquery。依次下載安裝就可以。
2. 目錄結構
把bootstrap目錄下得內容分別都放在static目錄下得css、fonts和js中。jquery對應的js也放在static目錄下得js目錄中。
templates目錄放置html文件,可以看到高亮出來的一個index.html文件。
3. tornado代碼
import logging import tornado.auth import tornado.escape import tornado.ioloop import tornado.web import os.path import uuid from tornado.concurrent import Future from tornado import gen from tornado.options import define, options, parse_command_line define("port", default=8888, help="run on the given port", type=int) define("debug", default=False, help="run in debug mode") class BaseHandler(tornado.web.RequestHandler): def get_current_user(self): user_json = self.get_secure_cookie("chatdemo_user") if not user_json: return None return tornado.escape.json_decode(user_json) class MainHandler(BaseHandler): @tornado.web.authenticated def get(self): self.render("index.html", messages=global_message_buffer.cache) def main(): parse_command_line() app = tornado.web.Application( [ (r"/", MainHandler), ], cookie_secret="__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__", template_path=os.path.join(os.path.dirname(__file__), "templates"), static_path=os.path.join(os.path.dirname(__file__), "static"), xsrf_cookies=True, debug=options.debug, ) app.listen(options.port) tornado.ioloop.IOLoop.instance().start() if __name__ == "__main__": main()
define定義了站點的port。
class BaseHandler(tornado.web.RequestHandler)定義了一個基類,用於簡單封裝tornado的RequestHandler。以后的每個類都需要集成這個BaseHandler,比如后面的MainHandler。這樣才能獲得http請求。
最后在(r"/", MainHandler),綁定了請求的url和對應的handler。這時還不能運行,因為我們需要在MainHandler中解析模板html。
4. Html模板
這里的index.htm模板是直接從bootstrap上得例子中扒下來的。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Bootstrap 101 Template</title> <!-- Bootstrap --> <link href="{{static_url("css/bootstrap.min.css")}}" rel="stylesheet"> <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries --> <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script> <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> <![endif]--> </head> <body> <nav class="navbar navbar-inverse navbar-fixed-top"> <div class="container"> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="#">Project name</a> </div> <div id="navbar" class="collapse navbar-collapse"> <ul class="nav navbar-nav"> <li class="active"><a href="#">Home</a></li> <li><a href="#about">About</a></li> <li><a href="#contact">Contact</a></li> </ul> </div><!--/.nav-collapse --> </div> </nav> <div class="container"> <div class="starter-template"> <h1>Bootstrap starter template</h1> <p class="lead">Use this document as a way to quickly start any new project.<br> All you get is this text and a mostly barebones HTML document.</p> </div> </div><!-- /.container --> <!-- jQuery (necessary for Bootstrap's JavaScript plugins) --> <script src="{{static_url("js/jquery-1.11.2.min.js")}}"></script> <!-- Include all compiled plugins (below), or include individual files as needed --> <script src="{{static_url("js/bootstrap.min.js")}}"></script> </body> </html>
其中的css、js都放在我們上面的目錄機構中的static目錄下。所以在原來模板中的這些內容都需要做一些修改:<link href="{{static_url("css/bootstrap.min.css")}}" rel="stylesheet">和<script src="{{static_url("js/jquery-1.11.2.min.js")}}"></script>還有<script src="{{static_url("js/bootstrap.min.js")}}"></script>。都通過了static_url這個內置方法實現了路徑的跳轉。
如果你不想這么設置路徑也可以,但是這些css和js之類的還是需要放在static目錄下。放在別的地方的話,可能是獲取不到靜態的內容。
這個時候運行代碼你就會看到這個網頁了。
好吧,這個時候似乎還是有些問題的。但是大體的結構就是這樣了!