静态文件访问原理
app文件夹下新建文件夹static,放入一张图片demo.jpg,然后访问服务器启动默认地址127.0.0.1:81/static/demo.jpg就可以访问到这张图片。
问:为什么Flask可以在任何代码不编写的情况下自动读取到static目录下的图片文件?
答:因为Flask对于静态文件是有默认值设置的,默认情况下,Flask认为静态文件夹的名字就叫ststic,并且位于应用程序的根目录下的,也就是app文件夹目录下。
问:为什么应用程序根目录是app目录而不是app上边的flaskDemo目录?
答:因为在实例化Flask核心对象是传入了一个参数,如下代码:
def create_app():
app = Flask(__name__)
app.config.from_object('app.secure')
app.config.from_object('app.setting')
register_blueprint(app)
db.init_app(app)
db.create_all(app=app)
return app
__name__
这个参数决定了我们应用程序的根目录是app目录。
如果不想使用默认的static作为静态文件存储路径,可以通过更改配置来访问,
app = Flask(__name__, static_folder='web/img')
更改成为这个路径,就要这样访问:127.0.0.1:81/img/demo.jpg,
还可以这么改:
app = Flask(__name__, static_folder='web/img', static_path='')
但是我们一般还是使用Flask默认设置即可,如果确实有需求,具体使用详情请查阅官方文档。
静态文件放到蓝图中
之前说过,Flask里有两个层级:
- Flask核心对象:应用程序级别
- 蓝图
对于静态文件,也有两个级别:
- 应用程序static
- 蓝图static
如果你认为你的静态文件是针对你的蓝图的话,那么你其实是可以把静态文件注册到蓝图上边,而不是注册到应用程序上边。
蓝图的相关方法其实几乎就是复制了Flask核心对象的api,基本参数都是一致的。
蓝图注册静态文件夹:
from flask import Blueprint
# 蓝图
web = Blueprint("web", __name__, static_folder='', static_url_path='')
模板文件
模板就是html,但是和普通html不同,模板是没有数据的,它等待填充数据。
app文件夹下新建文件夹templates,新建html文件:test.html:
同上边提到的static文件夹一样,我们可以自定义templates文件夹的位置,通过更改template_folder=
参数来自定义templates文件夹的位置,例如,把templates文件夹移动到web文件夹下后需改动:
两种更改方法:
- Flask核心对象上更改:
app = Flask(__name__, template_folder='web/templates')
- 在蓝图对象上更改:
web = Blueprint("web", __name__, template_folder='templates')
现在要把视图函数中返回的数据填充到模板test.html中,使用Flask内置的方法:render_template()
from flask import render_template
@web.route('/test')
def test():
r = {
"name": "allen",
'age': 24
}
r1 = {
"name": "zhao",
"age": 12
}
return render_template('test.html', data=r, data1=r1)
模板语言 Jinja2
如何在模板中组织、解析相关数据
编辑test.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>demo</h1>
{{data.age}}
{{data1.age}}
</body>
</html>
运行代码,浏览器输入127.0.0.1:8000/test
可以看到,之前我们写在视图函数中的数据已经展示到页面了。
Flask为了让我们很好的在模板解析和展示数据,它引入了一个模板引擎,叫做Jinja2。
Jinja2有自己的语法,例如注释代码:{#hello word#},这里就把hello word注释掉了。
我们的pycharm默认是不会像写python代码一样智能提示Jinja2的语法,但是,更改设置即可:
Jinja2也叫做模板语言,
Flask官方推荐我们使用Jinja2,大家也可以自己使用其他的模板语言。