對Flask提問題(1) ---> app = Flask(__name__)

標(biāo)簽: python flask web


 引言:
    用了半年多flask百姓,趁現(xiàn)在項目比較穩(wěn)定耍贾,好好研究一下
    主要是一個提問題的思路:
        1. 發(fā)現(xiàn)問題
        2. 提出問題
        3. 回答問題
    希望能給各位看官講明白爆价。

本章問題:app = Flask(__ name__)

每位使用flask開發(fā)的朋友尿褪,都肯定看到過這么一個最簡單的樣例

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()

程序很簡單光绕,差不多就是一個flask的最小程序。
但是募狂,各位客觀有沒有思考過

app = Flask(__name__)

這一行是干嘛的呢办素?

那我首先想搞 __ name__是用來干嘛的

問題1: __ name__是什么

定義:

__name__是一個python內(nèi)建的系統(tǒng)變量。

用途:
我們嘗試使用

>>> print("__name__是個啥: {}".format(__name__))
__name__是個啥: __ main__

控制臺告訴我們這個是__ main__
這就尷尬了 --||
那這個__ main__又是個啥祸穷?
通過查看python官方文檔性穿,我們得知:

__main__是頂層代碼執(zhí)行的作用域的名稱。

簡單來說雷滚,就是運行的入口模塊的標(biāo)識需曾,它代表了入口模塊名。
這么一看揭措,__ name__就是入口模塊名的表示變量了

ps:
  1. 如果a = b胯舷,那么a = b為賦值語句,a為標(biāo)識符绊含,b為值桑嘶。a稱為b的表示變量, b為a的值
  2. Python 模塊(Module)躬充,是一個 Python 文件逃顶,以 .py 結(jié)尾讨便,包含了 Python 對象定義和Python語句。

我們又發(fā)現(xiàn)我們的代碼都寫在一個模塊里以政,那我們再做一個測試霸褒,把代碼放在兩個程序中運行:

#  t1.py
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    print("t1的__name__: {}".format(__name__))
    app.run()

# t2.py
from flask import Flask

app = Flask(__name__)
print("t2的__name__: {}".format(__name__))

# 輸出
t2的__name__: test.t2
t1的__name__: __main__

誒,大家發(fā)現(xiàn)了沒有盈蛮,__ name__在t2中代表的是test.t2這個模塊名废菱,那我們可以進一步總結(jié)了

__name__代表了當(dāng)前的模塊名

結(jié)論1:Flask(name)接收模塊名作為參數(shù)

問題2:接收這個模塊名有啥用呢?

我們進到函數(shù)里看看

class Flask(_PackageBoundObject):
    def __init__(
        self,
        import_name,
        static_url_path=None,
        static_folder='static',
        static_host=None,
        host_matching=False,
        subdomain_matching=False,
        template_folder='templates',
        instance_path=None,
        instance_relative_config=False,
        root_path=None
    ):
        _PackageBoundObject.__init__(
            self,
            import_name,
            template_folder=template_folder,
            root_path=root_path
        )
        ...

name被復(fù)制給了import_name抖誉,然后我們通過全局搜索import_name發(fā)現(xiàn)殊轴,它是在這個函數(shù)下被使用

def get_root_path(import_name):
    """Returns the path to a package or cwd if that cannot be found.  This
    returns the path of a package or the folder that contains a module.
    Not to be confused with the package path returned by :func:`find_package`.
    """
    # Module already imported and has a file attribute.  Use that first.
    mod = sys.modules.get(import_name)
    if mod is not None and hasattr(mod, '__file__'):
        return os.path.dirname(os.path.abspath(mod.__file__))

    # Next attempt: check the loader.
    loader = pkgutil.get_loader(import_name)

    # Loader does not exist or we're referring to an unloaded main module
    # or a main module without path (interactive sessions), go with the
    # current working directory.
    if loader is None or import_name == '__main__':
        return os.getcwd()

    # For .egg, zipimporter does not have get_filename until Python 2.7.
    # Some other loaders might exhibit the same behavior.
    if hasattr(loader, 'get_filename'):
        filepath = loader.get_filename(import_name)
    else:
        # Fall back to imports.
        __import__(import_name)
        mod = sys.modules[import_name]
        filepath = getattr(mod, '__file__', None)

        # If we don't have a filepath it might be because we are a
        # namespace package.  In this case we pick the root path from the
        # first module that is contained in our package.
        if filepath is None:
            raise RuntimeError('No root path can be found for the provided '
                            'module "%s".  This can happen because the '
                            'module came from an import hook that does '
                            'not provide file name information or because '
                            'it\'s a namespace package.  In this case '
                            'the root path needs to be explicitly '
                            'provided.' % import_name)

    # filepath is import_name.py for a module, or __init__.py for a package.
    return os.path.dirname(os.path.abspath(filepath))

這個函數(shù)的注釋也說的比較清晰,代碼也相對簡單袒炉,總結(jié)一下就是旁理,通過這個import_name確定Flask這個核心對象被創(chuàng)建的根目錄,以獲得靜態(tài)文件和模板文件的目錄我磁。

想想也是孽文,我們在使用靜態(tài)文件的時候也是沒有添加過目錄,原來是Flask框架在這里幫我們做了夺艰。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末芋哭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子郁副,更是在濱河造成了極大的恐慌楷掉,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件霞势,死亡現(xiàn)場離奇詭異,居然都是意外死亡斑鸦,警方通過查閱死者的電腦和手機愕贡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來巷屿,“玉大人固以,你說我怎么就攤上這事≈鼋恚” “怎么了憨琳?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長旬昭。 經(jīng)常有香客問我篙螟,道長,這世上最難降的妖魔是什么问拘? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任遍略,我火速辦了婚禮惧所,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绪杏。我一直安慰自己下愈,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布蕾久。 她就那樣靜靜地躺著势似,像睡著了一般。 火紅的嫁衣襯著肌膚如雪僧著。 梳的紋絲不亂的頭發(fā)上履因,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機與錄音霹抛,去河邊找鬼搓逾。 笑死,一個胖子當(dāng)著我的面吹牛杯拐,可吹牛的內(nèi)容都是我干的霞篡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼端逼,長吁一口氣:“原來是場噩夢啊……” “哼朗兵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起顶滩,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤余掖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后礁鲁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盐欺,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年仅醇,在試婚紗的時候發(fā)現(xiàn)自己被綠了冗美。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡析二,死狀恐怖粉洼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情叶摄,我是刑警寧澤属韧,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站蛤吓,受9級特大地震影響宵喂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜会傲,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一樊破、第九天 我趴在偏房一處隱蔽的房頂上張望愉棱。 院中可真熱鬧,春花似錦哲戚、人聲如沸奔滑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽朋其。三九已至,卻和暖如春脆炎,著一層夾襖步出監(jiān)牢的瞬間梅猿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工秒裕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留袱蚓,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓几蜻,卻偏偏與公主長得像喇潘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子梭稚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

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