Tornado框架的學習--4.代碼拆分以及常用的MVC/MTV(MVT)結構的解析以及搭建

實際上,在實際的生產中,是不會將所有的代碼寫在同一個.py文件裏的,主要原因是一個項目,少說幾萬條代碼,多則十幾萬甚至幾十萬行代碼.全寫在一個文件內非常不適合後續開發以及維護(一般一個py文件也就寫500行以內的代碼,多了閱讀以及維護都會加大難度).所以我們很有必要將原本緊密的代碼結構(耦合度很高)變得鬆散一些,把代碼拆分爲容易理解和維護(在不影響功能完整性的前提下)的小段,分門類分功能放進去,通過import 進行連接.
在這裏,如何拆分代碼又是一個很講究的東西,現在業界搞web開發的基本上都遵從MVC的結構(MTV與其差別並不大,可以一塊講).
那麼,MVC是什麼,百度吧.在這裏,我直接放上我自己的理解

#MVC
#  M:Model模型  V:View界面  C:Controller控制器
#MVT(MTV)
#  M:Model模型  T:Template界面(模板)  V:View視圖控制器

嗯,沒有程序設計經驗的人估計搞不懂.先看了實例再說(畢竟概念很抽象)
拆分的代碼結構
init.py(有下滑線的!!csdn的編輯器顯示不出來)

import tornado.web
from App.urls import patterns
from App.settings import app_settings


def make_app():
    return tornado.web.Application(
        handlers=patterns,
        **app_settings,
    )

models.py

#model.py
#   這裏寫模型
#   模型:數據庫表

settings.py

#settings.py  項目配置
import os
from tornado.options import define, options


BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
define('port',default=80,type=int)
define('debug',default=True,type=bool)

app_settings = {
    "debug" : options.debug,
    "template_path" : os.path.join(BASE_DIR, 'templates'),
    "static_path" : os.path.join(BASE_DIR, 'static'),
}

urls.py

#urls.py  存放路由配置(規則)
from tornado.web import url

from App.views import *

patterns = [
            url(r'/index/',IndexHandler),
]

views.py

#views.py  存放視圖(類視圖)
#   存放RequestHandler
import tornado.web
from .models import *

#類視圖
class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        name = "蔡徐坤"
        age = 24
        likes = ["唱", "跳", "rap"]
        user = {
            "height":170,
            "weight":130,
        }

        data = {
            "name":name,
            "age":age,
            "likes":likes,
            "user":user,
        }
        # self.render('index.html', **data)
        # self.render('base.html')
        self.render('child.html')

base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}首頁{% end %}</title>

    <link rel="stylesheet" href="{{ static_url('css/base.css') }}">
    {% block extcss %}
    {% end %}

</head>
<body>
    <header>
        {% block head %}
        {% end %}
    </header>
    <div>
        {% block content %}
        {% end %}
    </div>
    <footer>
        {% block foot %}
        {% end %}
    </footer>

    <script src="{{ static_url('js/base.js') }}"></script>
        {% block extjs %}
        {% end %}
</body>
</html>

child.html

{% extends 'base.html' %}

{% block title %}
子頁面
{% end %}

{% block extcss %}
    <link rel="stylesheet" href="{{ static_url('css/child.css') }}">
{% end%}

{% block head %}
    <h2>周琦 波蘭人</h2>
{% end %}

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h2>模板語言</h2>
    <hr>

    {#  註釋  #}
    <p>{{ name }}</p>
    <p>{{ age }}</p>
    <p>{{ likes }}</p>
    <p>{{ likes[1] }}</p>
    <p>{{ user["height"] }}</p>

    {# if語法與python類似 #}
    {% if age < 18 %}
        <p>蔡徐坤是女的{{ age }}</p>
    {% elif age >18 %}
        <p>蔡徐坤真菜</p>
    {% else %}
        <p>蔡徐坤是條狗</p>
    {% end %}

    {# foe也是 #}
    {% for like in likes %}
        <p>like</p>
        <p>{{ like }}</p>
    {% end %}
    <hr>
    {% for i in range(10) %}
        <p>{{ i }}</p>
    {% end %}
    <hr>
    {% for i in [x**2 for x in range(10)] %}
        <p>{{ i }}</p>
    {% end %}
</body>
</html>

manage.py

#接受命令行參數,並啓動項目
import tornado.ioloop
from tornado.options import parse_command_line, options
from App import make_app


#接受命令行參數
parse_command_line()

#啓動項目
app = make_app()
app.listen(options.port)
tornado.ioloop.IOLoop.current().start()

效果圖
base
base
child
child
index(帶參數)
index

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章