flask包调用中的的路径问题

前言

这篇短文写在我的腾讯一面搞砸之后,这次面试让我深刻认识到我一直是一个很功利的人。总结了一下一共有几个要点:

  • 看需求办事,有什么需求谷歌什么,查看文档相关部分,而其他的部分置之不理,全然没有深入学习的决心
  • 对一个框架没有深入了解,仅仅止步于工具化,也没有对框架有更深层的了解,这让我很惭愧
  • 做事没有从工程层面来思考问题,仅仅从个人角度思考问题

flask包调用过程中的路径问题

假设有如下情况,my_app是封装为包的一个flask app,app声明在my_app/__init__.py文件中,h.py是包内的一个辅助模块,在run_app.py中调用my_app这个包的flask app进行运行

  • my_app
    • static
    • templates
    • __init__.py
    • h.py
  • run_app.py

###在辅助模块h.py中加载static中的静态文件###
当情况是运行run_app.py,而h.py需要加载static中静态文件的时候,在h.py中使用的路径可以是两种情况:

  • 绝对路径
  • 相对路径 ./my_app/static/file_name

注意包调用情况下,如果包内非__init__模块要加载static内静态文件,需要使用从包外路径开始定位


###html内加载静态文件###
当情况是运行run_app.py,html内需要加载静态文件,路径必须是相对路径,形式为:/static/file_name


###实例文件夹###
flask除了提供 app.static_folder和app.template_folder之外
image_1c8h30e029l51fi92jdv9f1rbt9.png-7.8kB
flask还提供了instance_path
image_1c8h31ai6r1hidf187l10fo6q6m.png-4.3kB
instance_path也可以用来存放静态文件,但是要注意的是instance_path所在的位置

flask文档对instance_path位置的阐述如下:

  • 未安装的模块:
1
2
/myapp.py
/instance
  • 未安装的包
1
2
3
/myapp
/__init__.py
/instance
  • 已安装的包或模块:
1
2
$PREFIX/lib/python2.X/site-packages/myapp
$PREFIX/var/myapp-instance

$PREFIX 是你 Python 安装的前缀。这个前缀可以是 /usr 或者你的 virtualenv 的路径。你可以打印 sys.prefix 的值来查看前缀被设置成了什么

所以上面已经阐述得很清楚了,在我们包调用的情况下,instance_path是跟my_app并列的位置上的,所以可以在my_app/__init__.py内的app使用app.instance_path来加载位于与my_app并列的instance中的静态文件,如下:

  • instance
    • static_file_to_load
  • my_app
  • run.py