Flask基础学习-静态文件篇

1. 静态文件访问原理

我们在访问由flask的服务时候,如果想访问静态文件,例如图片的时候,默认情况下我们在app文件下面创建一个static文件,将各类静态文件放到该文件夹下。我们在浏览器中输入http://IP:port/static/some.jpg就可以访问到对应的照片。

应用程序的根目录是根据实例化Flask核心对象 我们传入的 __name__来定的

为什么是这样呢?

因为flask默认静态文件夹的名字是static,并且在应用程序的根目录下。

如何更改默认值呢?

我们可以在实例化flask核心对象的时候修改静态文件的位置。

1
app = Flask(__name__, static_folder='/somepath/statics')

传入的路径为静态路径,是相对于程序的根目录的。我们指定了somepath/statics作为静态文件的目录,这时我们应该修改访问路径,

我们看下源码,来看看原理。

1
2
3
4
5
6
7
8
9
# register the static folder for the application.  Do that even
# if the folder does not exist. First of all it might be created
# while the server is running (usually happens during development)
# but also because google appengine stores static files somewhere
# else when mapped with the .yml file.
if self.has_static_folder:
self.add_url_rule(self.static_url_path + '/<path:filename>',
endpoint='static',
view_func=self.send_static_file)

这里我们看到了add_url_rule注册路由,路由是self.static_url_path加上文件名,我们看下它的源码。

1
2
3
4
5
6
7
8
def _get_static_url_path(self):
if self._static_url_path is None:
if self.static_folder is None:
return None
# 如果静态文件路径不为空 则是最后一个文件夹作为路径返回
return '/' + os.path.basename(self.static_folder)
# 如果我们制定了_static_url_path 则是直接使用我们指定的
return self._static_url_path

如何制定_static_url_path 呢?

同样是在实例化flask的核心对象的时候

1
app = Flask(__name__, static_url_path='statics')

静态文件有两个层级,一个是应用程序的级别,一个是蓝图的级别,蓝图的静态文件和应用程序的方法一致。

1
web = Blueprint('web', __name__, static_folder='', static_url_path='')

我们在实际编程中,建议使用默认值。

我们看下注册路由中的view_func,这个是在文件访问前执行的,我们可以在这个函数中做一些操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
def send_static_file(self, filename):
"""Function used internally to send static files from the static
folder to the browser.

.. versionadded:: 0.5
"""
if not self.has_static_folder:
raise RuntimeError('No static folder for this object')
# Ensure get_send_file_max_age is called in all cases.
# Here, we ensure get_send_file_max_age is called for Blueprints.
cache_timeout = self.get_send_file_max_age(filename)
return send_from_directory(self.static_folder, filename,
cache_timeout=cache_timeout)
2. 模板文件的位置和修改方案

我们知道了静态文件的默认位置,这个小节我们看下模板文件的位置。

默认情况下模板文件的位置是在应用程序的根目录下新建一个templates文件夹,里面存放我们需要的模板文件,然后在视图函数中直接使用返回。

如何修改这些默认值呢?

同样是在实例化flask核心对象的时候进行指定的

1
app = Flask(__name__, template_folder='somepath')

上面的模板是针对于应用级别的,我们也可以在蓝图级别设置模板。

1
web = Blueprint('web', __name__, template_folder='templates')

同样上面传入的路径都是相对路径(相对于程序根目录或者蓝图根目录)

我们在实际编程中,如果存在多个蓝图建议使用蓝图模式。

当你的模板文件在代码中显示异常的时候,可以手动将其设为模板文件。

3. 模板引擎jinja2

我们可以手动指定模板渲染引擎为jinja2,这样会有一些颜色提示

image-20180814152913796

jinja2的文档:http://docs.jinkan.org/docs/jinja2/templates.html

jinja2中访问字典的两种方式

1
2
3
{{ data.age }}

{{ data['age'] }}

对于一个对象Object,它的访问方式和字典一样,模板语言模糊了字典和对象的操作方式。

如果我们访问一个不存在的属性可以设置默认值

1
{{ book.pages | default('')}}

如果我们访问一个存在的属性,但是值为空的时候

1
{{ book.pages | default('', true)}}
4. 反向构建URL

我们可以使用url_for简化一些访问

例如我们访问一个静态文件夹下的css文件

1
<link rel="styesheet" href="{{ url_for('static', filename='some.css')}}">
5. 消息闪现

消息闪现:http://docs.jinkan.org/docs/flask/patterns/flashing.html

使用消息闪现需要增加一个密钥,之所以需要一个密钥是因为客户端是不安全的,容易发生数据篡改。

知识就是财富
如果您觉得文章对您有帮助, 欢迎请我喝杯水!