Python Flask开发笔记
- 一、创建flask项目
- 1.开发环境:
- 2.安装Flask
- 3.使用pycharm,创建flask项目
- 二、flask介绍
- 1.介绍初始flask主程序接口文件
- 2.Flask() 类
- 1.Flask参数解释
- 0.sys.modules用于缓存程序导入模块名
- 1.import_name 主程序模块名
- 2.static_url_path 浏览器url访问路径
- 3.static_folder 静态文件存储目录
- 4.static_host 静态文件主机地址
- 5.host_matching
- 6.template_folder 模板存储目录
- 7.instance_path 指定配置文件存储目录
- 8.instance_relative_config
- 9.root_path 项目的根目录
一、创建flask项目
1.开发环境:
操作系统:windows10
python版本:python-3.7.9
flask版本:
2.安装Flask
# 查看python版本 ==》 版本3.7.9
C:\Users\Administrators>python -v
Python 3.7.9 (tags/v3.7.9:13c94747c7, Aug 17 2020, 18:58:18) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
import 'atexit' # <class '_frozen_importlib.BuiltinImporter'>
>>> exit()
# 安装flask
C:\Users\Administrators>python -m pip install flask
3.使用pycharm,创建flask项目
二、flask介绍
1.介绍初始flask主程序接口文件
from flask import Flask # 引用flask架构
app = Flask(__name__) # 创建Flask对象
@app.route('/') # 路由分发
def hello_world(): # 接口函数
return 'Hello World!' # 返回的页面;返回的数据
if __name__ == '__main__':
app.run() # 运行flask
2.Flask() 类
1.Flask参数解释
# 必选参数
import_name: str, # 应用程序包的名称,通过它来拼接静态文件或者模板文件路径
# 可选参数
static_url_path: t.Optional[str] = None,
static_folder: t.Optional[t.Union[str, os.PathLike]] = "static",
static_host: t.Optional[str] = None,
host_matching: bool = False,
subdomain_matching: bool = False,
template_folder: t.Optional[str] = "templates",
instance_path: t.Optional[str] = None,
instance_relative_config: bool = False,
root_path: t.Optional[str] = None,
0.sys.modules用于缓存程序导入模块名
程序在导入某个模块时,会首先查找sys.modules中是否包含此模块名,若存在,则只需将模块的名字加入到当前模块的Local名字空间中;若不存在,则需要从sys.path目录中按照模块名称查找模块文件,
1.import_name 主程序模块名
app = Flask(import_name=__name__)
print('is __name__ %s' % __name__)
print(app.import_name, 'ssss')
输出:
is __name__ app
app ssss
# 通过sys.modules.get(import_name) 获取模块的路径
2.static_url_path 浏览器url访问路径
如果static_url_path=/test/url/
浏览器访问:https://127.0.0.1:8080/test/url/js/index.js
static_url_path=None
浏览器访问:https://127.0.0.1:8080/js/index.js
3.static_folder 静态文件存储目录
如js,css,图片等文件存储目录,浏览器访问时,如果static_url_path 存在,加上该url+文件名,浏览器访问:https://127.0.0.1:8080/static_url_path路径/js/index.js
;
如果static_url_path 不存在 浏览器访问:https://127.0.0.1:8080/js/index.js
4.static_host 静态文件主机地址
指定主机与host_matching=True一起使用才有效
5.host_matching
当host_matching=True时,须指定static_host=主机地址:端口号,默认localhost:5000
6.template_folder 模板存储目录
一般存储.html
等页面文件
7.instance_path 指定配置文件存储目录
instance_path和instance_relative_config是配合来用的、
这两个参数是用来找配置文件的,当用app.config.from_pyfile('settings.py')
这种方式导入配置文件的时候会用到
实例文件夹与默认的跟文件夹分离,降低耦合度。方便后期修改实例的时候不影响到跟文件夹
from flask import Flask
app = Flask(__name__)
print(app.instance_path, 'instance_path')
print(app.root_path, 'root_path')
输出:
D:\PersonalProject\FlaskProject\test01\instance instance_path
D:\PersonalProject\FlaskProject\test01 root_path
# 根目录与实例目录只多了\instance
8.instance_relative_config
与instance_path 一起使用,当为True时,会在instance_path指定的目录中查找配置文件,默认是在根目录下查找
9.root_path 项目的根目录
Flask类root_path: t.Optional[str] = None
Flask继承自Scaffold类,Scaffold类构造函数中root_path, 是调用get_root_path(self.import_name)
;如下代码:
if root_path is None:
root_path = get_root_path(self.import_name)
get_root_path(import_name: str)
def get_root_path(import_name: str) -> str:
mod = sys.modules.get(import_name) #模块路径对象; sys.modules是获取系统modules的路径如:{'app': <module 'app' from 'D:\\PersonalProject\\FlaskProject\\test01\\app.py'>}
if mod is not None and hasattr(mod, "__file__") and mod.__file__ is not None:
return os.path.dirname(os.path.abspath(mod.__file__))
loader = pkgutil.get_loader(import_name)
if loader is None or import_name == "__main__":
return os.getcwd() # 用于返回当前工作目录D:\PersonalProject\FlaskProject\test01
if hasattr(loader, "get_filename"):
filepath = loader.get_filename(import_name) # type: ignore
else:
__import__(import_name)
mod = sys.modules[import_name]
filepath = getattr(mod, "__file__", None)
if filepath is None:
raise RuntimeError(
"No root path can be found for the provided module"
f" {import_name!r}. 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."
)
return os.path.dirname(os.path.abspath(filepath))