Flask
第一个flask程序及运行过程
1.当客户端想要获取资源时,一般会通过浏览器发起http请求
2.此时,Web服务器会把来自客户端的所有请求都交给Flask程序实例
3.程序实例使用Werkzeug来做路由分发(URL请求和视图函数之间的对应关系)
4.根据每个URL请求,找到具体的视图函数并进行调用
在Flask程序中,路由的实现一般是通过程序实例的装饰器实现
5.Flask调用视图函数后,可以返回两种内容:
1.字符串内容:将视图函数的返回值作为响应的内容,返回给客户端
2.HTML模板内容:获取到数据后,把数据传入HTML模板文件中,模板引擎(Jinja2)负责渲染HTTP响应数据,然后返回响应数据给客户端
# -*- coding:utf-8 -*- # 1.导入Flask扩展 from flask import Flask # 2.创建Flask应用程序实例 # 需要传入__name__,作用是为了确定资源所在路径 app = Flask(__name__) # 3.定义路由及视图函数 # Flask中定义路由是通过装饰器实现的,路由默认只支持GET,如果需要增加,需要自行指定 @app.route('/',methods=['GET','POST']) def hello_world(): return 'Hello Flask' # 4.启动程序 if __name__ == '__main__': # 执行了app.run()就会将Flask程序运行在一个简易的服务器(Flask提供的,用于测试的)上 app.run()
路由定义的基本方式
默认路由只支持GET请求,但是可以通过methods指定http请求的方式
如:@app.route('/',methods=['GET','POST'])
给路由传参示例
有时候我们需要将同一类URL映射到同一个视图函数处理,比如使用同一个视图函数来显示不同用户的订单信息
路由传递的参数默当做string:
# -*- coding:utf-8 -*- # 1.导入Flask扩展 from flask import Flask # 2.创建Flask应用程序实例 # 需要传入__name__,作用是为了确定资源所在路径 app = Flask(__name__) # 3.定义路由及视图函数 # Flask中定义路由是通过装饰器实现的 @app.route('/') def hello_world(): return 'Hello Flask' # 使用同一个视图函数,来显示不同用户的订单信息,<>定义路由的参数,<>内需要起一个名字 @app.route('/orders/<int:order_id>')# 参数默认类型为字符串,通过int:强制转换,如果转换失败无法匹配该路由,现在参数为int类型 def get_order_id(order_id): # 需要在视图函数的()内填入参数名,那么后面的代码才能去使用 return 'order_id: %s' % order_id # 4.启动程序 if __name__ == '__main__': # 执行了app.run()就会将Flask程序运行在一个简易的服务器(Flask提供的,用于测试的)上 app.run()
Jinja2模板引擎
使用模板的好处
1.视图函数只负责业务逻辑和数据处理(业务逻辑方面)
2.而模板则取到视图函数的数据结果进行展示(视图展示方面)
3.代码结构清晰,耦合度低
两个概念
1.Jinja2:是python下一个被广泛应用的模板引擎,是由python实现的模板语言,他的设计思想来源于Django的模板引擎,并扩展了其他语法和一系列强大的功能,其是Flask内置的模板语言
2.模板语言:是一种被设计来自动生成文档的简单文本格式,在模板语言中,一般都会把一些变量传给模板,替换模板的特定位置上预先定义好的占位变量名.
比如:render_template('index.html', 模板中要使用的变量名=视图函数中的变量)
模板渲染函数
Flask提供的render_template函数封装了该模板引擎
render_template函数的第一个参数是模板的文件名(需要放在templates目录下面),后面的参数都是键值对,表示模板中变量对应的真是值
模板语言的使用
1.使用{# #}进行注释
2.变量代码块
{{}}来表示变量名,这种{{}}语法叫做变量代码块
3.Jinja2模板中的变量代码可以是Python类型或者对象,只要它能够被python的str()方法转换为一个字符串就可以
控制代码块
用{%%}定义的控制代码块,可以实现一些语言层次的功能,比如循环或if语句
{% if user %}
{{user}}
{% else %}
{% for index in indexs%}
{{index}}
{% endfor %}
过滤器
过滤器的本质就是函数,有时候我们不仅仅只是需要输出变量的值,我们还需要修改变量的显示,甚至格式化,运算等,而在模板中是不能直接调用python中的某些方法,那么就用到了过滤器
使用方式:
过滤器的使用方式为:变量名|过滤器
{{variable | filter_name(*args)}}
如果没有任何参数传递给过滤器,则可以把括号省略掉
{{variable | filter_name}}
链式调用
{{variable | filter_name1 | filter_name2}}
from flask import Flask, render_template app = Flask(__name__) # 1.返回一个网页(模板) # 2.给模板填充数据 @app.route('/') def index(): url_str = 'www.baidu.com' my_list = [1,3,5,7] # html文件需要放在templates目录下 return render_template('index.html', tem_url=url_str, my_list=my_list) if __name__ == '__main__': app.run(debug=True)
<!DOCTYPE html> <html lang='en'> <head> <meta charset='UTF-8'> <title>Flask</title> </head> <body> {#这是模板 #} 这是首页<br> 百度网址:{{tem_url}} <hr> {%for num in my_list%} {% if num >=3 %} {{num}}<br> {% endif %} {% endfor%} {#过滤器#} {{tem_url | upper}} </body> </html>
Web表单
在Flask中,为了处理web表单,一般使用Flask-WTF扩展,它封装了WTForms,并且它有验证表单数据的功能