在模板渲染字符串时,字符串中有可能包含一些危险的字符,如&、<、>、"、'等。这些字符会破坏原来HTML标签的结构,更严重的可能会发生XSS跨域脚本攻击。因此,遇到这些特殊字符时,应该将其转义成HTML能正确表示这些字符的写法,如<(小于号)在HTML中应该用<来表示。
在使用render_template渲染模板时,Flask会针对以.html、.htm、.xml和.xhtml结尾的文件进行全局转义,但是对于其他类型的文件,则不会开启全局转义。当然针对以.html、.htm、.xml、.xhtml结尾的文件,如果要关闭全局转义,通过设置app.jinja_env.autoescape=False即可关闭。如果要渲染由用户提交上来的字符串,强烈建议开启全局转义。
在没有开启自动转义的情况下,对于一些不信任的字符串,可以通过{{ value|escape }}进行局部转义。在开启了自动转义的情况下,对于一些安全的字符串,可以通过{{ value|safe }}进行局部关闭转义。使用autoescape语法可以将一段代码块整体关闭或开启自动转义。示例代码如下。
{% autoescape false %} <p>这个里面的关闭了自动转义</p> <p>{{ will_not_be_escaped }}</p> {% endautoescape %}
如果将以上代码中的false改成true,将在autoescape代码块中开启自动转义。
一个网页中除了HTML代码以外,还需要CSS、JavaScript和图片文件的综合应用才能更加美观和实用。静态文件默认存放到当前项目的static文件夹中,如果要修改静态文件存放的路径,可以在创建Flask对象时设置static_folder参数,示例代码如下。
app = Flask(__name__,static_folder='C:\static')
在模板文件中,可以通过url_for加载静态文件,示例代码如下。
<link href="{{ url_for('static',filename='about.css') }}">
url_for的第1个参数static是固定的,表示生成一个静态文件的URL;第2个参数filename是可以传递的文件名或者文件路径,路径是相对于static或者static_folder参数自定义的路径。以上代码在被模板渲染后,会被解析成如下形式。
<link href="/static/about.css">
用户在发送一个请求后,网站可能需要给这个用户一些提示,如登录成功提示、登录失败提示,这时可以用闪现消息解决。使用闪现消息,需要先在视图函数中通过flash函数提交消息内容,消息内容可以有多条,然后在模板中再使用get_flashed_messages函数获取视图函数中提交的消息内容。get_flashed_message函数返回的是一个列表,因此需要用for循环或者通过下标取出消息内容。闪现消息的视图函数部分示例代码如下。
@app.route("/flash") def myflash(): flash("我是消息内容1...") flash("我是消息内容2...") return render_template("flash.xhtml")
闪现消息的模板部分示例代码如下。
<ul> {% for message in get_flashed_messages() %} <li>{{ message }}</li> {% endfor %} </ul>
因为闪现消息是存储在session中的,使用session之前必须要在app.config中设置SECRET_KEY,如果读者没有设置SECRET_KEY,那么会出现如图4-9所示的错误信息页。
图4-9 错误信息页
我们可以在app.config中随便设置一个字符串,示例代码如下。
app.config['SECRET_KEY'] = "ewgnlwe&S;(12zd-+"
在刷新浏览器页面后,即可看到闪现消息内容,如图4-10所示。
图4-10 模板中显示闪现消息