藍(lán)圖

什么是藍(lán)圖宰啦?

一個(gè)藍(lán)圖定義了視圖谋竖,模板,靜態(tài)文件以及可以用于應(yīng)用程序的其它元素的集合檐蚜。例如蟆技,讓我們假設(shè)下我們有一個(gè)管理面板的藍(lán)圖玩敏。這個(gè)藍(lán)圖會(huì)定義一些包含像 /admin/login 和 /admin/dashboard 路由的視圖。它也可能包含服務(wù)于這些路由的模板以及靜態(tài)文件质礼。接著我們可以使用這個(gè)藍(lán)圖添加一個(gè)管理面板到我們的應(yīng)用程序中旺聚,不論我們的應(yīng)用程序是什么類型的。

為什么要使用藍(lán)圖眶蕉?

藍(lán)圖“殺手級(jí)”使用場(chǎng)景就是把我們的應(yīng)用程序組織成不同的組件砰粹。對(duì)于一個(gè)類似 Twitter 的微型博客,我們可能有一個(gè)針對(duì)網(wǎng)站頁(yè)面的藍(lán)圖妻坝,例如伸眶,index.html 和 about.html。接著我們還有另外一個(gè)帶有登錄面板的藍(lán)圖刽宪,在那里我們顯示了所有最新的文章,然后我們還有一個(gè)用于后臺(tái)管理的面板的藍(lán)圖界酒。網(wǎng)站的每一個(gè)不同的區(qū)域也能夠被分成不同區(qū)域的代碼來(lái)實(shí)現(xiàn)圣拄。這能夠讓我們用幾個(gè)小的 “apps” 構(gòu)建我們的應(yīng)用程序,每一個(gè) apps 都在做一件事情毁欣。

你把它們放哪里庇谆?

使用藍(lán)圖組織我們的應(yīng)用程序有很多的方式。通常情況下凭疮,我們可以考慮按功能結(jié)構(gòu)和分區(qū)這兩種選擇(功能結(jié)構(gòu)和分區(qū)這兩個(gè)詞語(yǔ)我借鑒了商業(yè)上的概念)饭耳。

功能結(jié)構(gòu)

按照功能結(jié)構(gòu)的話,你可以通過(guò)它們所做的事情來(lái)組織你的應(yīng)用程序的結(jié)構(gòu)执解。模板在一個(gè)文件夾中寞肖,靜態(tài)文件在另一個(gè)文件夾中,視圖在第三個(gè)文件夾中衰腌。

yourapp/
    __init__.py
    static/
    templates/
        home/
        control_panel/
        admin/
    views/
        __init__.py
        home.py
        control_panel.py
        admin.py
    models.py

除了 yourapp/views/init.py新蟆,在上面列表中的 yourapp/views/ 文件夾中的每一個(gè) .py 文件都是一個(gè)藍(lán)圖。在 yourapp/init.py 中我們要導(dǎo)入這些藍(lán)圖并且在我們的 Flask() 對(duì)象中 注冊(cè) 它們右蕊。我們會(huì)在本章的后面看看實(shí)現(xiàn)方式琼稻。

分區(qū)

對(duì)于分區(qū)結(jié)構(gòu)了,你可以基于它們有助于應(yīng)用程序的哪一部分來(lái)組織應(yīng)用程序的結(jié)構(gòu)饶囚。管理面板所有的模板帕翻,視圖以及靜態(tài)文件都在一個(gè)文件夾中鸠补,用戶控制的所有的模板,視圖和靜態(tài)文件在另一個(gè)文件夾中嘀掸。

yourapp/
    __init__.py
    admin/
        __init__.py
        views.py
        static/
        templates/
    home/
        __init__.py
        views.py
        static/
        templates/
    control_panel/
        __init__.py
        views.py
        static/
        templates/
    models.py

像上面列出的應(yīng)用程序的分區(qū)結(jié)構(gòu)莫鸭,在 yourapp/ 中每一個(gè)文件夾都是一個(gè)單獨(dú)的藍(lán)圖。所有的這些藍(lán)圖都會(huì)應(yīng)用到頂層 \\init\\.py 中的 Flask() 對(duì)象中横殴。

哪一個(gè)是最好的被因?

你選擇的組織結(jié)構(gòu)很大程度上是一種個(gè)人決定。唯一的區(qū)別是層次結(jié)構(gòu)的表示方式衫仑,因此你可以自由地決策要使用的組織結(jié)構(gòu)梨与,你可以選擇一個(gè)對(duì)自己有意義的。

如果你的應(yīng)用程序大部分是獨(dú)立的結(jié)構(gòu)文狱,僅僅共享著像模型和配置粥鞋,分區(qū)結(jié)構(gòu)就是合適的選擇方式。一個(gè)例子就是讓用戶建立網(wǎng)站的 SaaS 應(yīng)用程序瞄崇。你可能就有藍(lán)圖分別針對(duì)主頁(yè)呻粹,控制面板,用戶網(wǎng)站苏研,以及管理面板等浊。這些組件可能有完全不同的靜態(tài)文件和布局。如果考慮負(fù)責(zé)這個(gè)應(yīng)用程序或者分拆/重構(gòu)這個(gè)應(yīng)用程序的話摹蘑,分區(qū)結(jié)構(gòu)會(huì)更加適用一些筹燕。

另一方面,如果你的應(yīng)用程序聯(lián)系地更加緊密一些的話衅鹿,它可能用一個(gè)功能結(jié)構(gòu)呈現(xiàn)更加合適撒踪。一個(gè)示例就是 Facebook。如果 Facebook 使用 Flask 的話大渤,它可能就有靜態(tài)頁(yè)(例如制妄,登錄-注銷頁(yè),注冊(cè)泵三,關(guān)于等等)耕捞,控制面板(例如,新聞源)切黔,個(gè)人主頁(yè)(/robert/about 以及 /robert/photos)砸脊,設(shè)置(/settings/security 和 /settings/privacy)等等一些藍(lán)圖。這些組件共享一個(gè)通用的布局和樣式纬霞,但是每一個(gè)也會(huì)有自己的布局凌埂。下面的列表中展示了一個(gè)進(jìn)行大量刪減版的 Facebook 的樣子,如果它是使用 Flask 構(gòu)建的話诗芜。

facebook/
    __init__.py
    templates/
        layout.html
        home/
            layout.html
            index.html
            about.html
            signup.html
            login.html
        dashboard/
            layout.html
            news_feed.html
            welcome.html
            find_friends.html
        profile/
            layout.html
            timeline.html
            about.html
            photos.html
            friends.html
            edit.html
        settings/
            layout.html
            privacy.html
            security.html
            general.html
    views/
        __init__.py
        home.py
        dashboard.py
        profile.py
        settings.py
    static/
        style.css
        logo.png
        models.py

在 facebook/views/ 中的藍(lán)圖僅僅是視圖的集合而不是完全獨(dú)立的組件瞳抓。同一的靜態(tài)文件將會(huì)被大多數(shù)的藍(lán)圖的視圖使用埃疫。大多數(shù)模板都會(huì)擴(kuò)展一個(gè)主模板。功能結(jié)構(gòu)是組織這個(gè)項(xiàng)目的一種好的方式孩哑。

你如何使用它們栓霜?

基本用法

讓我們看看 Facebook 示例中的其中一個(gè)藍(lán)圖的代碼。

# facebook/views/profile.py

from flask import Blueprint, render_template

profile = Blueprint('profile', __name__)

@profile.route('/<user_url_slug\\>')
def timeline(user_url_slug):
    # Do some stuff
    return render_template('profile/timeline.html')

@profile.route('/<user_url_slug\\>/photos')
def photos(user_url_slug):
    # Do some stuff
    return render_template('profile/photos.html')

@profile.route('/<user_url_slug\\>/about')
def about(user_url_slug):
    # Do some stuff
    return render_template('profile/about.html')

要?jiǎng)?chuàng)建一個(gè)藍(lán)圖對(duì)象横蜒,我們先導(dǎo)入 Blueprint() 類并且用參數(shù) name 和 import_name 初始化它胳蛮。通常情況下,import_name 就是 __name__丛晌,這是一個(gè)包含當(dāng)前模塊名稱的特殊 Python 變量仅炊。

在這個(gè) Facebook 示例中我們使用了一個(gè)功能結(jié)構(gòu)。如果我們使用分區(qū)結(jié)構(gòu)的話澎蛛,我們要通知 Flask 藍(lán)圖有自己的模板和靜態(tài)文件夾抚垄。此塊的代碼大概的樣子如下所示。

profile = Blueprint('profile', __name__,
                    template_folder='templates',
                    static_folder='static')

現(xiàn)在我們已經(jīng)定義我們的藍(lán)圖谋逻。是時(shí)候在我們的 Flask 應(yīng)用程序中注冊(cè)它呆馁。

# facebook/__init__.py

from flask import Flask
from .views.profile import profile

app = Flask(\\_\\_name\\_\\_)
app.register_blueprint(profile)

現(xiàn)在定義在 facebook/views/profile.py 上的路由(例如,/<user\_url\_slug>)在應(yīng)用程序上注冊(cè)并且表現(xiàn)得像你使用 @app.route() 定義它們一樣毁兆。

使用動(dòng)態(tài)的 URL 前綴

繼續(xù) Facebook 例子浙滤,注意到所有的用戶資料路由都是以 <user\_url\_slug> 開(kāi)始并且把它的值傳遞給視圖。我們希望用戶們能夠通過(guò)瀏覽像 https://facebo-ok.com/john.doe 類似的網(wǎng)址訪問(wèn)用戶資料頁(yè)荧恍。我們可以通過(guò)為所有的藍(lán)圖的路由定義一個(gè)動(dòng)態(tài)的前綴來(lái)停止重復(fù)工作瓷叫。

藍(lán)圖可以讓我們定義動(dòng)態(tài)和靜態(tài)的前綴。我們可以通知 Flask 在一個(gè)藍(lán)圖中的所有的路由都是以 /profile 為前綴的(這里的 /profile 只是一個(gè)示例)送巡,這就是一個(gè)靜態(tài)的前綴。至于 Facebook 示例盒卸,前綴是基于瀏覽的用戶資料而變化骗爆。無(wú)論他們?yōu)g覽哪個(gè)用戶的個(gè)人資料,我們都應(yīng)該在 URL 標(biāo)簽中顯示蔽介。這就是一個(gè)動(dòng)態(tài)的前綴摘投。

我們可以選擇在什么時(shí)候定義我們的前綴。我們可以在兩個(gè)地方中的任意一個(gè)定義前綴:當(dāng)我們實(shí)例化 Blueprint() 類或者當(dāng)我們用 app.register_blueprint() 注冊(cè)它的時(shí)候虹蓄。

# facebook/views/profile.py

from flask import Blueprint, render_template

profile = Blueprint('profile', __name__, url_prefix='/<user_url_slug>')

# [...]
{% endhighlight %}

{% highlight python %}
# facebook/__init__.py

from flask import Flask
from .views.profile import profile

app = Flask(__name__)
app.register_blueprint(profile, url_prefix='/<user_url_slug>')

盡管沒(méi)有任何技術(shù)因素限制任何一種方法犀呼,最好是在注冊(cè)的時(shí)候統(tǒng)一定義可用的前綴。這使得以后修改或者調(diào)整更加容易和方便些薇组。因?yàn)檫@個(gè)原因外臂,我建議在注冊(cè)的時(shí)候設(shè)置 url\_prefix。

我們可以在動(dòng)態(tài)前綴中使用轉(zhuǎn)換器律胀,就像在 route() 調(diào)用中一樣宋光。這個(gè)也包含了我們自定義的轉(zhuǎn)換器貌矿。當(dāng)使用了轉(zhuǎn)換器,我們可以在把前綴交給視圖之前進(jìn)行預(yù)處理罪佳。在這個(gè)例子中我們要基于傳入到我們用戶資料藍(lán)圖的 URL 中的 user\_url\_slug 來(lái)獲取用戶對(duì)象逛漫。這里我們需要使用 url\_value\_preprocessor() 裝飾一個(gè)函數(shù)來(lái)完成這個(gè)需求。

# facebook/views/profile.py

from flask import Blueprint, render_template, g

from ..models import User

# The prefix is defined on registration in facebook/\\_\\_init\\_\\_.py.
profile = Blueprint('profile', \\_\\_name\\_\\_)

@profile.url_value_preprocessor
def get_profile_owner(endpoint, values):
    query = User.query.filter_by(url_slug=values.pop('user_url_slug'))
    g.profile_owner = query.first_or_404()

@profile.route('/')
def timeline():
    return render_template('profile/timeline.html')

@profile.route('/photos')
def photos():
    return render_template('profile/photos.html')

@profile.route('/about')
def about():
    return render_template('profile/about.html')

我們使用 g 對(duì)象來(lái)存儲(chǔ)用戶對(duì)象并且 g 可以在 Jinja2 模板中使用赘艳。這就意味著對(duì)于實(shí)現(xiàn)一個(gè)極其簡(jiǎn)單的系統(tǒng)的話酌毡,我們現(xiàn)在要做的就是在視圖中渲染模板。

{% facebook/templates/profile/photos.html %}

{% extends "profile/layout.html" %}
{% for photo in g.profile_owner.photos.all() %}
    <img src="{{ photo.source_url }}" alt="{{ photo.alt_text }}" />
{% endfor %}

使用動(dòng)態(tài)的子域(subdomain)

許多 SaaS(軟件即服務(wù))的應(yīng)用程序目前提供用戶一個(gè)子域蕾管,用戶可以使用這個(gè)子域來(lái)訪問(wèn)他們的軟件枷踏。例如,Harvest 是一個(gè)時(shí)間追蹤管理應(yīng)用程序娇掏,它允許你從 yourname.harvestapp.com 訪問(wèn)你的控制面板呕寝。這里我將向你展示如何使用 Flask 處理像 Harvest 一樣自動(dòng)生成的子域。

對(duì)于這一部分婴梧,我們將要使用允許用戶創(chuàng)建他們自己的網(wǎng)站的應(yīng)用程序示例下梢。假設(shè)我們的應(yīng)用程序有三個(gè)藍(lán)圖,它們分別用于用戶登錄的主頁(yè)塞蹭,用戶構(gòu)建他們的網(wǎng)站的用戶管理面板以及用戶的網(wǎng)站孽江。由于這三部分是不相關(guān)的,我們用分區(qū)結(jié)構(gòu)來(lái)組織結(jié)構(gòu)番电。

sitemaker/
    __init__.py
    home/
        __init__.py
        views.py
        templates/
            home/
        static/
            home/
    dash/
        __init__.py
        views.py
        templates/
            dash/
        static/
            dash/
    site/
        __init__.py
        views.py
        templates/
            site/
        static/
            site/
    models.py

下面的描述展示了本應(yīng)用程序中所有的藍(lán)圖岗屏。

  • URL: sitemaker.com,Route: sitemaker/home漱办,描述: 只是一個(gè)普通的藍(lán)圖这刷。圍繞 index.html,about.html 以及 pricing.html 的視圖娩井,模板以及靜態(tài)文件暇屋。
  • URL: bigdaddy.sitemaker.com,Route:sitemaker/site洞辣,描述:這個(gè)藍(lán)圖使用一個(gè)動(dòng)態(tài)的子域并且包含用戶網(wǎng)站的元素咐刨。 我們會(huì)在下面介紹一些用于實(shí)現(xiàn)這個(gè)藍(lán)圖的代碼。
  • URL:bigdaddy.sitemaker.com/admin扬霜,Route: sitemaker/dash定鸟,描述:這個(gè)藍(lán)圖使用了一個(gè)動(dòng)態(tài)的子域和一個(gè) URL 前綴。

我們可以用定義我們 URL 前綴同樣的方式來(lái)定義我們的動(dòng)態(tài)子域著瓶。兩個(gè)選擇:在藍(lán)圖文件夾或者在頂層的 init.py 中都是可用的联予,但是我們堅(jiān)持再一次把它定義在 sitemaker/\\init.py\\ 中。

# sitemaker/\\_\\_init\\_\\_.py

from flask import Flask
from .site import site

app = Flask(\\_\\_name\\_\\_)
app.register_blueprint(site, subdomain='<site_subdomain>')

因?yàn)槲覀兪褂昧朔謱咏Y(jié)構(gòu),我們會(huì)在 sitema-ker/site/\\init\\.py 中定義藍(lán)圖躯泰。

# sitemaker/site/\\_\\_init\\_\\_py

from flask import Blueprint

from ..models import Site

# Note that the capitalized Site and the lowercase site
# are two completely separate variables. Site is a model
# and site is a blueprint.

site = Blueprint('site', __name__)

@site.url_value_preprocessor
def get_site(endpoint, values):
    query = Site.query.filter_by(subdomain=values.pop('site_subdomain'))
    g.site = query.first_or_404()

# Import the views after site has been defined. The views
# module will needto import 'site' so we need to make
# sure that we import views after site has been defined.
import .views

現(xiàn)在我們從數(shù)據(jù)庫(kù)中獲取了站點(diǎn)信息谭羔,我們將會(huì)把用戶的站點(diǎn)展示給正在請(qǐng)求他們子域的訪問(wèn)者。

為了讓 Flask 能和子域一起工作麦向,我們將需要指定 SERVER_NAME 配置變量瘟裸。

# config.py

SERVER_NAME = 'sitemaker.com'

使用藍(lán)圖重構(gòu)小的應(yīng)用程序

我們將會(huì)介紹把一個(gè)應(yīng)用程序重構(gòu)成使用藍(lán)圖的步驟。我們選擇一個(gè)很典型的 Flask 應(yīng)用程序并且重構(gòu)它诵竭。

config.txt
requirements.txt
run.py
U2FtIEJsYWNr/
  __init__.py
  views.py
  models.py
  templates/
  static/
tests/

views.py 文件已經(jīng)增長(zhǎng)到 10,000 行的代碼话告!我們一直在拖延重構(gòu)它的時(shí)間,但是現(xiàn)在是時(shí)候重構(gòu)卵慰。views.py 文件包含我們網(wǎng)站每一部分的視圖沙郭。這些部分分別是主頁(yè),用戶控制面板裳朋,管理控制面板病线,API 和公司的博客。

步驟 1:分區(qū)或者功能鲤嫡?

這個(gè)應(yīng)用是有完全不同的部分組成送挑。例如,用戶控制面板和公司博客之間的模板和靜態(tài)文件是完全不共享的暖眼。我們將選擇分區(qū)結(jié)構(gòu)惕耕。

步驟 2:移動(dòng)一些文件

下一步我們將繼續(xù)前進(jìn),并且為我們新的應(yīng)用程序創(chuàng)建目錄樹(shù)诫肠。我們可以在一個(gè)包目錄里為每一個(gè)藍(lán)圖創(chuàng)建一個(gè)文件夾司澎。接著我們將完整地復(fù)制 views.py,static/ 和 templates/ 到每個(gè)藍(lán)圖目錄栋豫。最后挤安,我們可以從頂層包目錄中刪除它們(views.py,static/ 和 templates/)丧鸯。

config.txt
requirements.txt
run.py
U2FtIEJsYWNr/
  __init__.py
  home/
    views.py
    static/
    templates/
  dash/
    views.py
    static/
    templates/
  admin/
    views.py
    static/
    templates/
  api/
    views.py
    static/
    templates/
  blog/
    views.py
    static/
    templates/
  models.py
tests/

步驟 3:廢話少說(shuō)

現(xiàn)在我們可以到每一個(gè)藍(lán)圖目錄中去刪除那些不屬于該藍(lán)圖的視圖漱受,靜態(tài)文件和模板。你如何做這一步很大程度上取決你的應(yīng)用程序是如何組織結(jié)構(gòu)的骡送。

最終的結(jié)果就是每一個(gè)藍(lán)圖只有一個(gè) views.py 文件,并且 views.py 文件內(nèi)的函數(shù)只適用于本藍(lán)圖絮记。沒(méi)有兩個(gè)藍(lán)圖會(huì)為同一個(gè)路由定義一個(gè)視圖摔踱。每一個(gè) templates/ 目錄只包含在本藍(lán)圖的視圖中使用的模板。每一個(gè) static/ 目錄應(yīng)該只包含有本藍(lán)圖使用的靜態(tài)文件怨愤。

步驟 4:藍(lán)圖

這是我們把我們的目錄轉(zhuǎn)變成為藍(lán)圖的關(guān)鍵一步派敷。關(guān)鍵就是在 init.py 文件。首先,我們看看 API 藍(lán)圖的定義篮愉。

# U2FtIEJsYWNr/api/__init__.py

from flask import Blueprint

api = Blueprint(
    'site',
    __name__,
    template_folder='templates',
    static_folder='static'
)

import .views

接下來(lái)我們?cè)?U2FtIEJsYWNr 包頂層 init.py 文件里注冊(cè)這個(gè)藍(lán)圖腐芍。

# U2FtIEJsYWNr/__init__.py

from flask import Flask
from .api import api

app = Flask(__name__)

# Puts the API blueprint on api.U2FtIEJsYWNr.com.
app.register_blueprint(api, subdomain='api')

確保路由是注冊(cè)到藍(lán)圖上而不是應(yīng)用程序(app)對(duì)象上。

# U2FtIEJsYWNr/views.py

from . import app

@app.route('/search', subdomain='api')
def api_search():
    pass
# U2FtIEJsYWNr/api/views.py

from . import api

@api.route('/search')
def search():
    pass

步驟 5:享受

現(xiàn)在我們應(yīng)用程序比起它原來(lái)一個(gè)龐大的 views.py 文件已經(jīng)是大大地模塊化了试躏。路由的定義十分簡(jiǎn)單猪勇,因?yàn)槲覀兛梢栽诿恳粋€(gè)藍(lán)圖里面單獨(dú)定義并且可以為每個(gè)藍(lán)圖像子域和 URL 前綴一樣配置。

  • 一個(gè)藍(lán)圖定義了視圖颠蕴,模板泣刹,靜態(tài)文件以及可以用于應(yīng)用程序的其它元素的集合。
  • 藍(lán)圖是組織你的應(yīng)用程序的一種很好的方式犀被。
  • 在分區(qū)結(jié)構(gòu)中椅您,每一個(gè)藍(lán)圖是一個(gè)視圖,模板寡键,靜態(tài)文件的集合掀泳,它們構(gòu)成了應(yīng)用程序的一部分。
  • 在功能結(jié)構(gòu)中西轩,每一個(gè)藍(lán)圖只是視圖的集合员舵。所有的模板放在一起,靜態(tài)文件也一樣遭商。
  • 要使用一個(gè)藍(lán)圖固灵,你首先需要定義它,接著通過(guò)調(diào)用 Flask.register\\_blueprint() 來(lái)注冊(cè)它劫流。
  • 你可以定義一個(gè)動(dòng)態(tài)的 URL 前綴巫玻,它能夠用于在一個(gè)藍(lán)圖里所有的路由。
  • 你也可以定義一個(gè)動(dòng)態(tài)的子域祠汇,它能夠用于一個(gè)藍(lán)圖里所有的路由仍秤。
  • 使用藍(lán)圖重構(gòu)一個(gè)越來(lái)越大的應(yīng)用程序能夠用 5 個(gè)小步驟來(lái)完成。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末可很,一起剝皮案震驚了整個(gè)濱河市诗力,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌我抠,老刑警劉巖苇本,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異菜拓,居然都是意外死亡瓣窄,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)纳鼎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)俺夕,“玉大人裳凸,你說(shuō)我怎么就攤上這事∪懊常” “怎么了姨谷?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)映九。 經(jīng)常有香客問(wèn)我梦湘,道長(zhǎng),這世上最難降的妖魔是什么氯迂? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任践叠,我火速辦了婚禮,結(jié)果婚禮上嚼蚀,老公的妹妹穿的比我還像新娘禁灼。我一直安慰自己,他們只是感情好轿曙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布弄捕。 她就那樣靜靜地躺著,像睡著了一般导帝。 火紅的嫁衣襯著肌膚如雪守谓。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天您单,我揣著相機(jī)與錄音斋荞,去河邊找鬼。 笑死虐秦,一個(gè)胖子當(dāng)著我的面吹牛平酿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悦陋,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蜈彼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了俺驶?” 一聲冷哼從身側(cè)響起幸逆,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎暮现,沒(méi)想到半個(gè)月后还绘,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡栖袋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年蚕甥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片栋荸。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出晌块,到底是詐尸還是另有隱情爱沟,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布匆背,位于F島的核電站呼伸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏钝尸。R本人自食惡果不足惜括享,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望珍促。 院中可真熱鬧铃辖,春花似錦、人聲如沸猪叙。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)穴翩。三九已至犬第,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間芒帕,已是汗流浹背歉嗓。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留背蟆,地道東北人鉴分。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像淆储,于是被迫代替她去往敵國(guó)和親冠场。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理本砰,服務(wù)發(fā)現(xiàn)碴裙,斷路器,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • 解釋1: 允許將應(yīng)用組織為模塊点额,每個(gè)模塊有自洽的 MVC舔株,開(kāi)發(fā)者做些工作可以使模塊間依賴盡可能少,必要時(shí)可以按 b...
    大詩(shī)兄_zl閱讀 2,207評(píng)論 1 1
  • Flask藍(lán)圖提供了模塊化管理程序路由的功能还棱,使程序結(jié)構(gòu)清晰载慈、簡(jiǎn)單易懂。下面分析藍(lán)圖的使用方法 假如說(shuō)我們要為某所...
    楓林夕陽(yáng)閱讀 27,128評(píng)論 3 13
  • 22年12月更新:個(gè)人網(wǎng)站關(guān)停珍手,如果仍舊對(duì)舊教程有興趣參考 Github 的markdown內(nèi)容[https://...
    tangyefei閱讀 35,181評(píng)論 22 257
  • 1办铡、為使項(xiàng)目結(jié)構(gòu)模塊化辞做,更加清晰,把相同模塊的視圖函數(shù)放在同一個(gè)藍(lán)圖中寡具,同一個(gè)文件中 2秤茅、創(chuàng)建藍(lán)圖1、新建一個(gè)py...
    小船撐不起大帆閱讀 533評(píng)論 0 0