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 | # register the static folder for the application. Do that even |
这里我们看到了add_url_rule
注册路由,路由是self.static_url_path
加上文件名,我们看下它的源码。
1 | def _get_static_url_path(self): |
如何制定_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 | def send_static_file(self, filename): |
2. 模板文件的位置和修改方案
我们知道了静态文件的默认位置,这个小节我们看下模板文件的位置。
默认情况下模板文件的位置是在应用程序的根目录下新建一个templates
文件夹,里面存放我们需要的模板文件,然后在视图函数中直接使用返回。
如何修改这些默认值呢?
同样是在实例化flask
核心对象的时候进行指定的
1 | app = Flask(__name__, template_folder='somepath') |
上面的模板是针对于应用级别的,我们也可以在蓝图级别设置模板。
1 | web = Blueprint('web', __name__, template_folder='templates') |
同样上面传入的路径都是相对路径(相对于程序根目录或者蓝图根目录)
我们在实际编程中,如果存在多个蓝图建议使用蓝图模式。
当你的模板文件在代码中显示异常的时候,可以手动将其设为模板文件。
3. 模板引擎jinja2
我们可以手动指定模板渲染引擎为jinja2
,这样会有一些颜色提示
jinja2
的文档:http://docs.jinkan.org/docs/jinja2/templates.html
在jinja2
中访问字典的两种方式
1 | {{ 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
使用消息闪现需要增加一个密钥,之所以需要一个密钥是因为客户端是不安全的,容易发生数据篡改。