写在前面
虽然之前学了一些基础,但都是跟着网上的视频做的。主要就是模板使用和连接数据库,再往后的博客、部署服务器根本还没有涉及到。最近刚买了一本书,通过返回去看之前的知识点,又发现了一些新的盲点,在这里记录一下,以查漏补缺。
一、虚拟环境
学习flask最好使用虚拟环境,因为这样可以避免包的冲突,保证运行环境的纯净。
windows操作系统下python3标准库中内置了venv包。首先进入一个文件夹,然后运行
python -m venv venv
-m venv作用是以独立的脚本运行标准库中的venv包,是固定的。最后的venv表示虚拟环境的名称,这里我也取名为venv。
使用虚拟环境之前要先激活,命令如下
venv\Scripts\activate
激活之后就可以开始使用了,比如导入flask等。如果要退出虚拟环境,命令行输入deactivate命令即可。
二、基本结构
1. Web开发服务器
除了在py文件中执行app.run(),还可以通过控制台直接利用flask自带的web服务器启动应用:
set FLASK_APP=hello.py
flask run
flask run这个命令在FLASK_APP对应的环境变量指定的python脚本中寻找应用实例。
如果要以调试模式运行,命令如下:
set FLASK_APP=hello.py
set FLASK_DEBUG=1
flask run
使用调试模式时,由于服务器会加载一个叫重载器的工具,因此每次修改源码后服务器都会自动重启,非常方便。
2. 命令行选项
flask命令行支持很多选项,可以通过命令flask --help查看,之前用过的就一个flask run。对于flask run,有一个参数特别有用,那就是–host,他可以告诉服务器在哪个网络接口上监听客户端发来的连接。如果让服务器监听公共网络上的连接,任何同一网络中的其他计算机发来的连接都可以收到。
flask run --host 0.0.0.0
三、模板
模板主要是把业务逻辑和表现逻辑分开,提高应用的可维护性。
1. 变量
flask使用的是一个名为jinja2的强大的模板引擎。他可以将应用中的参数传入模板,对于那些可变的参数,模板中使用{{ name }}的形式表示。同时变量还可以使用过滤器进行修改,过滤器添加在变量之后,通过竖线"|"分隔。以下是jinja2提供的部分常用过滤器:
过滤器名 | 说明 |
---|---|
safe | 渲染时不转义 |
capitalize | 首字母大写 |
lower | 全小写 |
upper | 全大写 |
title | 每个单词首字母大写 |
trim | 删除首尾空格 |
striptags | 删除html标签 |
对于safe过滤器要说明一下。默认情况下jinja2都会转义所有变量。如果一个变量值为<h1>Hello</h1>
,jinja2会把它渲染成<h1>Hello</h1>
,浏览器可以显示它但是不解释。如果想要在变量中显示HTML代码,就要用safe过滤器。
详细的过滤器的介绍可以查看官方文档
2. 控制结构
jinja2除了支持简单的if,for等条件控制语句,还支持宏,类似python中的函数:
{% macro render_comment(comment) %}
<li>{{ comment }}</li>
{% endmacro %}
{% for comment in comments %}
{{ render_comment(comment) }}
{% endfor %}
除此之外若要重复使用宏,还可以将宏写入单独的文件中,需要使用时再导入:
{% import 'macros.html' as macros %}
<ul>
{% for comment in comments %}
{{ macros.render_comment(comment) }}
{% endfor %}
</ul>
需要多处使用的代码片段,可以统一写入单独文件,再引入所有的模板中:
{% include 'common.html' %}
另一种重复使用代码片段的方式是继承,类似python类的继承。首先应该创建一个名为base.html的基模板:
<html>
<head>
{% block head %}
<title>{% block title %}{% endblock %}My Application</title>
{% endblock %}
</head>
<body>
{% block body %}
{% endblock %}
</body>
</html>
基模板中定义的区块可在衍生模板中覆盖或重定义。jinja2使用block和endblock指令在基模板中定义区块。下面是基模板的衍生模板:
{% extends "base.html" %}
{% block title %}Index{% endblock %}
{% block head %}
{{ super() }}
<style>
</style>
{% endblock%}
{% block body%}
<h1>Hello, World!</h1>
{% endblock %}
可见这和python类非常相似。extends表明继承自base.html,同时衍生模板可以重新定义区块,若想在区块中使用基模板中的内容,调用super()函数。
这种继承模板的方式可以明显加快web前端页面的开发效率,如果已经有了模板,后续只要根据需求进行配置即可。Bootstrap就是一个这样的web框架,他已经预先定义了很多模板,集成了html,css和js。要想在flask中使用Bootstrap,可以使用flask_bootstrap扩展,这个扩展可以直接用pip安装。
但是bootstrap还需进一步学习,因为想要调用基模板中的css/js文件,衍生模板的标签或格式就需要遵循一定的规则,否则无法实现模板中的效果。
3. Flask-Moment
要想在网页中显示时间,一般使用UTC时间。通过把当前UTC时间发送给web浏览器,然后转换成当地时间,再用javascript渲染。Flask-Moment可以完成这一功能,可以通过万能的pip安装:
pip install flask-moment
可以使用Flask-Bootstrap和Flask-Moment实现网页中动态显示时间的效果。
总结
通过这次的学习,成功创建虚拟环境并安装了flask,同时学会用flask自带的web服务器运行程序,通过–host参数可以在公共网络上监听连接;模板中的变量可以通过过滤器修改,且模板最强大的是可以先定义基模板然后继承。Bootstrap就是利用这一点的一个强大的web框架,flask中使用Flask-Bootstrap。