1.Bootstrap
我的理解是,Twitter开发了一个名为Bootstrap的框架,要在flask中使用这个框架,要通过Flask-Bootstrap。这个框架的作用,是使我们的HTML模板可以继承这个框架内部的格式。因此它是一个客户端框架,主要用于网页显示。使用这个框架之前需要在hello.py文件当中进行初始化:
from flask.ext.bootstrap import Bootstrap
#...
bootstrap = Bootstrap(app) #app是我们的Flask实例,这样做之后我们在app实例中就可以使用bootstrap当中的基模板
基模板的使用仍然和前面模板的继承方式一致:
{% extends "bootstrap/base.html" %} <!--继承-->
{% block title %}Flasky{% endblock %} <!--可更改的块-->
......
需要注意的是,如果程序需要向已经有内容的块中添加新内容,必须使用Jinja2提供的super()函数。例如:
{% block scripts %}
{{ super() }}
<script type="text/javascript" src="my-script.js"></scripts>
{% endblock %}
2.自定义错误页面
对于浏览器中输入的不可用路由,需要返回错误页面。最常见的错误代码有两个:404,客户端请求未知页面或路由器时显示;500,有未处理的异常时显示。在hello.py文件中定义这两个响应函数:
@app.errorhandler(404)
def page_not_found(e):
return render_template('404.html'), 404
@app.errorhandler(500)
def internal_server_error(e):
return render_template('500.html'), 500
其模板仍然使用继承方式:
{% extends "base.html" %} <!--此时文件夹中有一个base.html文件,这个文件本身也是继承了bootstrap-->
{% block title %}Flasky - Page Not Found{% endblock %}
{% block page_content %}
<div class="page-header">
<h1>Not Found</h1>
</div>
{% endblock %}
3.链接的理解
先回顾一下路由,路由就是处理用户提交的URL和所需函数之间关系的程序。现阶段我们的hello.py文件中有两个路由,分别链接两个两个页面(index.html和user.html)。如果我们把URL直接写在模板中供用户链接,对于简单的URL,如 index.html 页面的URL,则这样做是可行的。但对于动态路由,其中包含变量,如 user.html 中的 name ,URL写起来就很困难。Flask提供了url_for()辅助函数,以试图函数的名称为参数,使用程序URL映射中保存的信息生成URL。我所不能理解的是,链接的整个实现过程。按我自己的理解,用户输入一个URL,然后路由收到这个URL,这时应该将URL映射为路由视图函数名,从而处理这个URL,而不是把视图函数名映射为URL。希望有小伙伴可以帮我解答这个问题。
@app.route('/')
def index():
return render_template('index.html')
@app.route('/user/<name>')
def user(name):
return render_template('user.html', name=name)
4.静态文件
通常静态文件也是web的一部分,URL中含有静态文件的请求时,这个请求通过static这个专门处理静态文件映射的路由处理。Flask在程序根目录下的static目录中寻找静态文件。
5.本地化日期和时间
问题来源:web程序可能被世界各地不同时区的使用者使用,因此服务器需要统一时间单位,通常使用协调世界时间UTC,但UTC的格式跟用户当地时间格式不一样,因此要将UTC时间转换为用户当地时间。
解决方案:把UTC时间发送给web浏览器,转换为当地时间,然后渲染(这里应该就是指用当地时间替换UTC时间)。之所以能这么做是因为浏览器可以获取电脑中的时区和区域设置。
渲染工作可以使用一个名为Flask-Moment的Flask扩展程序来实现。