一、前言
本文是基于阅读Flask 1.0.2中文文档,记录自己的实践。主要内容时摘抄文档,仅作为个人的学习笔记。
二、最简单的应用
通过Flask框架,创建最简单的Web应用。
(1)在项目目录中,创建一个hello.py文件。(注意不能保存为flask.py,不然会与Flask本身引起冲突)
(2)编写hello.py的代码,如下:
from falsk import Flask #导入Flask类,是我们的WSGI程序,即网关程序
app = Flask(__name__) #创建一个网关实例,第一个参数是应用模块或者包的名称(单一的模块应使用__name__)
@app.route('/') #通过Flask的route()函数,指定触发函数的URL,返回需要显示在浏览器的信息
def hello_world(): #定义函数
return 'hello world!'
if __name__ == '__main__' #判断脚本是否被python直接执行,而不是作为模块导入
app.run () #运行脚本 若要以调试模式运行,则可加上app.debug = True或app.run(debug=True)
(3)直接执行文件 python hello.py,返回Web地址(默认是 http://127.0.0.1:5000),此时是生产环境。(调试模式打印的信息较详细)
(4)在浏览器访问 http://127.0.0.1:5000 地址,即可看到hello world!的字样。
三、简单应用了解
每个应用程序的包含app.run()函数的,都是程序入口,即服务器的启动文件。
(一)Flask实例对象
每个程序,都需要有一个网关实例,即 app = Flask(指定程序名称)
(二)路由
用于根据请求的URL找到对应的处理函数获得相应数据,因为Web应用的不同路径会有不同的处理函数。
@app.route():就是指定函数对应的访问URL地址;(‘/’)是根URL的根路径。
可分为静态路径和动态路径:
静态路径:字符串指定路径;(例:('/hello'))
动态路径:即在URL中添加变量的部分,该部分会作为命名参数传递到函数中;(变量的格式为 <variable_name>,若要指定变量的转换器,则格式为 <converter : variable_name>)variable_name=变量名,应与函数参数名相同,converter=转换器,即待转换的数据结构,支持如下数据结构:
string:缺省值,接受任何不包含斜杆的文本
int:接受正整数
float:接受正否点数
path:类似string ,但可以包含斜杆
uuid:接受UUID字符串
(1)URL唯一/重定向行为
若我们在路由的定义时,末尾是否添加反斜杠,我们浏览器访问地址时,地址末尾是否有添加反斜杠会有不同结果。
路由定义时有反斜杠,URL访问时没有fan反斜杠,会自动不全(即加上反斜杠),即加不加都能正常访问;
路由定义时有反斜杠,URL访问时加上了反斜杠,会提示404错误。
(2)构造URL
除了上面通过@app.route()方式为函数定义匹配的路由,我们还可以通过Flask的url_for来生成函数的匹配路由(前提是函数有定义路由,即前面提到的)
例子:假如我们的指定的 login()函数的路由为(‘/hello/login’),则 url_for('login') 返回的结果就是‘/hello/login’。
其他例子:
url_for('login') = /hello/login
url_for('login',next='/') = /hello/login?next=/
若 @app.route('/login/<username>') 则 url_for('login',username = 'xiaoma') = /login/xiaoma
构造URL的好处:
1、描述性好,改动时允许一次性修改URL,而不用逐个修改;
2、URL构建会转义特殊字符和Unicode数据,省去转义的麻烦;
3、如果应用不位于URL的根路径,url_for()会妥善处理该问题。
访问静态文件:
静态文件,即存放在项目中的文件,例如图片、视频,样式(css)、静态网页等,Flask的url_for()支持访问该类文件。
方式:在包中或模块所在的目录创建一个名为static的文件夹,则可在通过('/static')访问,例如:url_for('/static',filename='文件名加后缀') 注意:static文件夹必须与Flask实例的创建处于同等级目录。
(3)HTTP访问(需要导入request)
定义函数的访问路由时,若不指定http的访问类型,则默认时Get请求,若要改变请求函数,可以通过route()装饰器的menthods参数改变,mentods = ['GET','POST'] 指定支持的请求方式 (前面指同时支持GET和POST), @app.route('/login',methods=['GET','POST'])
在函数中,通过request.method可以获取当前请求的方式,返回的时字符串。从而根据不同请求方式执行不同操作。
(4)渲染模板
根据模板,生成HTML文件,实现数据与视图的分离(需要导入render_template)。
作用:在python内部生成HTML是笨拙,且需要自己处理HTML的转义,不利于开发。
(1)简单使用
1、创建templates文件夹,需与Flask实例的创建同级,即在同一个目录,类似static;
2、创建模版,实质就是保存在templates文件夹中的html文件;
3、在新建的html文件中,若需要使用获取数据(参数),采用以下形式定义:
{% 条件语句 %} 如 if else ... 使用变量 ,则用双花括号 {{变量名}},详细yued阅读Jinja2文档
4、在python文件中,通过 render_template(‘html文件’,html文件中的变量名 = 值),把数据渲染到html中。
(2)模版继承
作用:可以使每个页面的特定元素(页头、导航和页尾)保持一致。(这是Jinja2框架最有力的部分)
1、在父类定义可被继承重载的模块 {% block 模块名 %}(块的开始) {% endblock %}(块的结束)
2、子类继承父类模版html,格式:{% extends "父类文件" %}
3、重载相应模块:{% block 模块名 %}重载的编码,即嵌入父类相应块中 {% endblock %}
4、子类加载父类的内容,使用{{super()}}使用。
(3)转义过滤器
由于在Jinja2中,自动转义是默认开始的,因此如果数据包含HTML,会被自动转义,如何避免自动转义呢,我们可以选择过滤一些安全的数据(安全视为无需转义)。
过滤的方式:
(1)Markup类标记:使用前需导入Markup类
'tag':Markup('<a href="#">点击</a>') 把内容作为参数放入Markup实例中
(2)|safe过滤器:
在Html中,在相应的数据变量右边加上 |safe ,则相应的变量指定的内容不会转义。