標(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框架在這里幫我們做了夺艰。