书籍:《Flask Web开发:基于Python的Web应用开发实战》
作者代码地址:miguelgrinberg/flasky
书中说:
“视图函数的作用很明确,即生成请求的响应,如第 2 章中的示例所示。对最简单的请求来说,这就足够了,但一般而言,请求会改变程序的状态,而这种变化也会在视图函数中产生。”
“例如,用户在网站中注册了一个新账户。用户在表单中输入电子邮件地址和密码,然后点击提交按钮。 服务器接收到包含用户输入数据的请求,然后 Flask 把请求分发到处理注册请求的视图函数。 这个视图函数需要访问数据库,添加新用户,然后生成响应回送浏览器。这两个过程分别称为业务逻辑和表现逻辑。”
这里我理解的表现逻辑类似于三层开发中的数据访问层,如下是百度百科的解释:
“所谓的三层开发就是将系统的整个业务应用划分为表示层,业务逻辑层和数据访问层,这样有利于系统的开发、维护、部署和扩展。
分层是为了实现“高内聚,低耦合”。采用“分而治之”的思想,把问题划分开来各个解决,易于控制,延展和分配资源。
业务逻辑层负责系统领域业务的处理,负责逻辑性数据的生成、处理及转换。对所输入的逻辑性数据的正确性及有效性负责,但对输出的逻辑性数据及用户性数据的正确性不负责,对数据的呈现样式不负责。”
不过也有可能这里理解有误 OvO 因为标准数据访问层的定义是实现对数据库的各种访问功能,这里又不太一样。
Flask的模版:
模版:是一个包含响应文本的文件。把表现逻辑移到模版中可提高程序的可维护性。
Flask使用Jinja2模型渲染引擎。这里所谓的渲染就是将URL中可变部分的值进行替换然后得到最终的响应字符串。
变量:在模版中使用{{ name }},name即是一个变量,在进行渲染模版时传入这个参数。
Jinja2能够识别所有类型变量,包括列表,字典,甚至是对象。
<p>A value from a dictionary: {{ mydict['key'] }}.</p>
<p>A value from a list: {{ mylist[3] }}.</p>
<p>A value from a list, with a variable index: {{ mylist[myintvar] }}.</p>
<p>A value from an object's method: {{ myobj.somemethod() }}.</p>
上面的第四行即是一个对象的方法。
过滤器:用于修改变量的一个东西。Hello, {{ name|capitalize }},可以将name变量的值以首字母大写的方式显示,其中的capitalize就是一个过滤器名。
控制结构:Jinja2中实现的可以用来改变模版的渲染流程的控制结构,例如:
条件控制语句:
{% if user %}
Hello, {{ user }}!
{% else %}
Hello, Stranger!
{% endif %}
for循环语句:
<ul>
{% for comment in comments %}
<li>{{ comment }}</li>
{% endfor %}
</ul>
模版还可以使用宏,甚至进行模版继承。
自定义错误页面:使用app.errorhandler()装饰器:
@app.errorhandler(404)
def page_not_found(e):
return render_template('404.html'), 404
静态文件:例如HTML中的图片,JavaScript源码文件,CSS都是静态文件。
{% block head %}
{{ super() }}
<link rel="shortcut icon" href="{{ url_for('static', filename = 'favicon.ico') }}"
type="image/x-icon">
<link rel="icon" href="{{ url_for('static', filename = 'favicon.ico') }}"
type="image/x-icon">
{% endblock %}
其中,url_for()函数使用程序URL映射中保存的信息生成URL。这里的作用就是取得静态文件favicon.ico的URL地址。
更多文章与笔记请关注:微信公众号:二进制树