1. 程式人生 > >flask原始碼筆記:二,Flask原始碼目錄結構

flask原始碼筆記:二,Flask原始碼目錄結構

在目錄下執行ls命令可以瞭解到,Flask原始碼目錄的大致結構,如果需要以樹狀顯示目錄結構,可以使用命令tree。


(venv)[[email protected] flask]# ls
app.py          config.pyc        exthook.pyc   json.py      sessions.pyc    testsuite
app.pyc         ctx.py            globals.py    json.pyc     signals.py      views.py
blueprints.py   ctx.pyc           globals.pyc   logging.py   signals.pyc     views.pyc
blueprints.pyc  debughelpers.py   helpers.py    logging.pyc  templating.py   wrappers.py
_compat.py      debughelpers.pyc  helpers.pyc   module.py    templating.pyc  wrappers.pyc
_compat.pyc     ext               __init__.py   module.pyc   testing.py
config.py       exthook.py        __init__.pyc  sessions.py  testing.pyc


值得了解的是,pyc字尾的是執行後的二進位制編譯檔案,可以忽略。粗體字是目錄,內容需要進一步瞭解


(venv)[
[email protected]
flask]# ls ext
__init__.py  __init__.pyc


ext目錄是一箇中規中矩的python包


(venv)[[email protected] flask]# ls testsuite/
appctx.py       config.py         ext.py        regression.py   static           test_apps
appctx.pyc      config.pyc        ext.pyc       regression.pyc  subclassing.py   testing.py
basic.py        deprecations.py   helpers.py    reqctx.py       subclassing.pyc  testing.pyc
basic.pyc       deprecations.pyc  helpers.pyc   reqctx.pyc      templates        views.py
blueprints.py   examples.py       __init__.py   signals.py      templating.py    views.pyc
blueprints.pyc  examples.pyc      __init__.pyc  signals.pyc     templating.pyc


testsuite目錄也是一個python包,但是其中的檔案結構居然和Flask原始碼的檔案結構大同小異,特別是檔名,由此推斷:testsuite可能是一個基於測試套件的Flask子框架。


瞭解一個Python包,首先看其__init__.py檔案。
所以,我們可以把__init__.py檔案,看做是包的整體部分,而非其下的檔案和目錄部分。在編輯器中檢視檔案如下:


(venv)[
[email protected]
flask]# cat __init__.py
# -*- coding: utf-8 -*-
"""
    flask
    ~~~~~


    A microframework based on Werkzeug.  It's extensively documented
    and follows best practice patterns.


    :copyright: (c) 2011 by Armin Ronacher.
    :license: BSD, see LICENSE for more details.
"""


__version__ = '0.10.1'


# utilities we import from Werkzeug and Jinja2 that are unused
# in the module but are exported as public interface.
from werkzeug.exceptions import abort
from werkzeug.utils import redirect
from jinja2 import Markup, escape


from .app import Flask, Request, Response
from .config import Config
from .helpers import url_for, flash, send_file, send_from_directory, \
    get_flashed_messages, get_template_attribute, make_response, safe_join, \
    stream_with_context
from .globals import current_app, g, request, session, _request_ctx_stack, \
     _app_ctx_stack
from .ctx import has_request_context, has_app_context, \
     after_this_request, copy_current_request_context
from .module import Module
from .blueprints import Blueprint
from .templating import render_template, render_template_string


# the signals
from .signals import signals_available, template_rendered, request_started, \
     request_finished, got_request_exception, request_tearing_down, \
     appcontext_tearing_down, appcontext_pushed, \
     appcontext_popped, message_flashed


# We're not exposing the actual json module but a convenient wrapper around
# it.
from . import json


# This was the only thing that flask used to export at one point and it had
# a more generic name.
jsonify = json.jsonify


# backwards compat, goes away in 1.0
from .sessions import SecureCookieSession as Session
json_available = True


1,模組描述介紹了flask模組的簡單資訊。
2,版本資訊的變數設定
3,匯入第三方庫werkzeug、jinja2中的四個函式
4,匯入自定義模組中的物件
5,增設兩個變數


分析
所有的設定的變數和匯入的函式等物件,都是作為Flask包對外的介面存在。從這些物件中,我們可以找到建立flask例項常用的一些物件:Flask,url_for,current_app等。
從不同模組匯入的物件具有不同的種類的功能,由此,我們可以推斷不同模組的實現的功能大致是什麼。


from .app import Flask, Request, Response
app.py主要提供建立flask例項和對請求、響應進行處理的功能。


from .config import Config
config.py主要提供配置檔案的功能


from .helpers import url_for, flash, send_file, send_from_directory, \
    get_flashed_messages, get_template_attribute, make_response, safe_join, \
    stream_with_context
helpers.py主要提供諸多輔助功能


from .globals import current_app, g, request, session, _request_ctx_stack, \
     _app_ctx_stack
globals.py主要提供全域性變數,區域性變數和上下文管理器的例項


from .ctx import has_request_context, has_app_context, \
     after_this_request, copy_current_request_context
ctx.py主要定義了上下文管理器的類


from .module import Module
module.py主要提供模組功能,已被bluprint替代


from .blueprints import Blueprint
blueprints.py提供藍本功能


from .templating import render_template, render_template_string
templating.py主要提供模板渲染功能


from .signals import signals_available, template_rendered, request_started, \
     request_finished, got_request_exception, request_tearing_down, \
     appcontext_tearing_down, appcontext_pushed, \
     appcontext_popped, message_flashed
signals.py主要提供不同機制的訊號例項


from . import json
json.py主要提供json格式資料的解析功能


另外的諸如:
ext目錄:提供flask.ext.副檔名的方式來匯入“flask_副檔名”和“flaskext.副檔名”的功能
sessions.py :提供session的類定義,他包含了cookie機制
testing.py:定義用於測試而非生產的一些基類、函式等
views.py:提供另一種以類來定義檢視函式的方式,不常用
wrappers.py:定義了對請求和響應的封裝類
logging:定義了日誌管理器的類和建立函式
exthook.py:提供了ext目錄需要用到的類,即匯入鉤子的類
debughelpers.py:定義了各種debug模式的錯誤型別
_compat.py :定義了對py2和py3的相容,涉及到不同版本的物件,先在該檔案中進行校驗處理。
到此,我們對Flask原始碼目錄也有一個大致瞭解了。