Flask 是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器。
使用以下命令安装框架:
#flask的安装命令,没有带版本即安装最新版本
pip install flask
Hello World
创建一份名为flask_test_demo.py的脚本文件,并写入一下python代码段:
# 导入Flask扩展
from flask import Flask, render_template
# 创建Flask应用程序实例
# 需传入__name__,作用是为了确定资源所在的路径
app = Flask(__name__)
# 定义路由及视图函数
# Flask中定义路由是通过装饰器来实现的
@app.route('/')
def hello_world():
return 'hello world'
# 启动程序
if __name__ == '__main__':
#执行app.run就会将Flask程序运行在一个简单的服务器上(Flask提供的,用于测试的)
app.run()
运行程序获得执行输出,服务会在本地5000端口开启访问入口:
/Users/******/******/flask/flask_test_demo.py
* Serving Flask app "flask_test_demo" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
浏览器访问http://127.0.0.1:5000/即可在浏览器中展示:
hello world
模板输出
在与flask_test_demo.py同级的目录下新建文件夹“templates”,并在其文件夹下创建html文件,命名index.html。
index.html文件内容如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
我的第一个Flask网页
</body>
</html>
在flask_test_demo.py文件中这样写,并运行:
#需要引入render_template来获得渲染模板到浏览器的能力
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/', methods=['get'])
def index():
#render_template方法第一个默认参数为html文件名称(全名)
#这里不写templates文件夹(目录),是因为框架默认就从执行文件同级的templates文件夹中获取指定html文件
return render_template("index.html")
if __name__ == '__main__':
app.run()
浏览器访问地址:http://127.0.0.1:5000/,显示页面内容:
路由请求方式限定
请求方式限定, 在装饰器@app.route上添加methods参数,参数值为列表形式传入的具体请求方式名称:
# 路由默认只支持GET,需要添加其他方式,则需要自行指定
@app.route('/', methods=['GET', 'POST'])
def hello_world():
return 'hello world'
路由参数处理
# 尖括号定义路由参数,尖括号内需要取参数名
@app.route('/order/<order_id>')
#需要在视图函数的参数内填入参数名,函数内的代码才能使用传递过来的参数
def get_order_id(order_id):
return 'order_id:%s' % order_id
如果要限制传参的类型,则需要对路由做访问优化,在参数名通过类型加冒号方式进行设置
@app.route('/order/<int:order_id>')
如果参数类型不正确,则无法匹配到该路由
jinja2模板引擎
jingja2是Python下一个被广泛应用的模板引擎,是由Python实现的模板语言,他的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能,其是Flask内置的模板语言。
模板语言:是一种被设计来自动生成的文档的简单文本格式,在模板语言中,一般都会把一些变量传递给模板,替换模板的特定位置上预先定义好的站位变量名。
渲染模板函数
- Flask提供的render_template函数封装了该模板引擎
- render_template函数的第一个参数名是模板的文件名,后面的参数是键值对,表示模板中变量对应的真实值
变量代码块
{{}}来表示变量名,这种{{}}语法叫做变量代码块
{{orer_id}}
如下代码则可以实现后台传值到前端:
后端代码:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
order_id = 88888
return render_template('index.html', order_id=order_id)
if __name__ == '__main__':
app.run()
在index.html文件中写入如下内容:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
后端传递的order_id为:{{order_id}}
</body>
</html>
浏览器展示效果:
- 列表和字典的传参和渲染
后端赋值:
@app.route('/')
def hello_world():
my_list = [2, 4, 6, 8, 10]
my_dict = {'name': "方建康", 'age': 35, '性别': '男'}
return render_template('index.html', my_list=my_list, my_dict=my_dict)
前端取值:
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{my_list}}<br>
{{my_list[2]}}<br>
{{my_dict}}<br>
{{my_dict['name']}}<br>
</body>
</html>
网页输出:
控制代码块
以{{%%}}的方式来编写控制语句,注{# #}表示前端注释
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{# for循环的使用 #}
{% for item in my_list %}
{# if判断的使用 #}
{% if item > 3 %}
{{item}} <br>
{% endif %}
{% endfor %}
</body>
</html>
网页输出:
过滤器
过滤器的本质就是函数,有时候我们不仅仅只是需要输出变量的值,我们还需要改变变量的显示,甚至格式化、运算等等,在模板中是不能直接调用python中的某些方法,那么就会用了过滤器。
使用方式:
{{ variable | filter_name(*args) }}
如果没有任何参数传给过滤器,则可以把括号省掉
{{ variable | filter_name }}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{# 字符串转大写-过滤器 #}
{{"hello world" | upper}}
<br>
{# 字符串翻转-过滤器 #}
{{"hello world" | reverse}}
<br>
{# 链式调用过滤器 #}
{{"hello world" | upper | reverse}}
</body>
</html>
html展示效果:
常用的过滤器,点击链接进行查看 常用过滤器
Web表单
在Flask中,为了处理Web表单一般使用Flask-WTF扩展,它封装了WTForms,并且它有验证表单数据的功能。
from flask import Flask, render_template, request, flash
app = Flask(__name__)
app.secret_key = 'fjk' # 设置加密文本
@app.route('/', methods=['POST', 'GET'])
def index():
# 判断请求方式,若是POST请求则获取请求参数进一步处理,此处需要用的request的method方法
if request.method == 'POST':
# 获取请求参数
username = request.form.get('username')
passwd = request.form.get('password')
if not all([username, passwd]):
flash('参数不完整') # 可以将后台的文本,闪现到页面,但需要进行加密
else:
flash('success')
# 若不是POST请求则返回页面
return render_template('index.html')
if __name__ == '__main__':
app.run()
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post">
<lable>用户名:</lable>
<input type="text" name="username"><br>
<lable>密码:</lable>
<input type="password" name="password"><br>
<input type="submit" value="提交"><br>
{#使用遍历方式,获取闪现消息并显示在页面上#}
{% for messgae in get_flashed_messages() %}
{{ messgae }}
{% endfor %}
</form>
</body>
</html>