Flask框架基础认知
Flask是一个用Python编写的Web应用程序框架。Flask基于Werkzeug WSGI工具包和Jinja2模板引擎。
核心依赖库:
Werkzeug:Flask的底层库,提供了WSGI接口、HTTP请求与响应处理、路由等核心功能,是Flask实现Web请求处理的基础。
Jinja2:功能强大的模板引擎,用于动态生成HTML页面,能够将Python数据与HTML模板相结合,实现页面的动态渲染。
WSGI:Web服务器网关接口(Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。
示例
安装
pip install flask
首个应用搭建
app.py
from flask import Flask
# 创建flask应用实例
app = Flask(__name__)
# 定义路由
@app.route('/')
def hello_world(): # 定义视图函数
return 'Hello World!'
if __name__ == '__main__':
# 启动服务
app.run(debug=True)
浏览器访问:127.0.0.1:5000 就能进入到我们搭建的web页面中。
代码详细解析
-
app = Flask(name) :创建Flask实例,__name__参数用于告知Flask当前模块的名称
-
@app.route('/') : 路由装饰器,用于定义路由和试图函数的映射关系。"/"代表根路径,用户访问根URL时(127.0.0.1:5000/)时,Flask会调用与之关联的hello_world() 视图函数。
-
return 'Hello World!' :视图函数的作用是处理用户请求并返回响应,示例中是一个简单的返回,返回一个字符串'Hello World!',Flask会将该字符串作为HTTP响应返回给客户端。
-
app.run(debug=True) : 用于启动Flask服务器,debug=True表示启动调试模式,在调试模式下,开发过程中应用会自动重载,即修改代码后,无需手动启停服务器,会自动更新,同时发生错误时,会显示详细的错误信息,便于调试。如果端口冲突,还可以指定host和port:app.run(host="127.0.0.1",port=5003,debug=True)
-
运行Flask应用:python app.py
Flask路由
路由基本概念
Flask的核心功能之一是路由系统,它的作用是将用户访问的URL与对应的视图函数建立连接。Flask通过装饰器@app.route()来定义路由,视图函数则负责处理用户的请求并返回相应的响应。
动态路由
基本概念
动态路由允许在URL中包含动态参数,通过这些参数可以在URL中获取数据,并将其传递给视图函数。
代码示例
@app.route('/greet/<name>')
def greet(name):
return f'Hello, {name}!'
代码解析
:这是动态参数的定义方式,Flask会从URL中提取该部分的值,并将其传递给视图函数greet,当用户访问127.0.0.1:5003/greet/andy时,URL中的andy会被提取出来,赋值给name,视图函数返回响应为:'Hello, andy!'
动态参数指定类型
定义动态参数时,可以指定参数的类型,常见的类型包括:
-
string(默认类型,匹配除斜杠外的任意字符串)
-
int(匹配整数)
-
float(匹配浮点数)
-
path(匹配包含斜杠的字符串)
-
uuid(匹配 UUID 字符串)
@app.route('/user/int:user_id')
def get_user(user_id):
return f'用户的id为: {user_id}'
访问:127.0.0.1:5003/user/77641时,user_id会被解析为整数型77641
支持多种HTTP请求方法
Flask支持GET、 POST、PUT、DELETE等场景的HTTP请求方法。可以通过methods参数来指定路由允许的请求方法。
@app.route('/submit', methods=['POST'])
def submit():
return "提交成功"
如果通过get请求访问:http://127.0.0.1:5003/submit ,会报错:Method Not Allowed。
处理多种请求方法
在视图函数中,通过request.method获取请求方法,从而针对不同的请求方法执行不同的处理逻辑。
@app.route('/data', methods=['POST','GET'])
def handle_data():
if request.method == 'POST':
return "这是一个POST请求"
elif request.method == 'GET':
return "这是一个GET请求"
return "不支持的请求方式"
Jinja2模板引擎的应用
模板引擎的基本作用
Jinja2模板引擎用于生成动态的HTML页面,它能够将HTML文件与python代码分离,使应用结构更加清晰,便于维护和开发。在Flask中,模板文件默认存放在templates文件中。
模板示例:
greet.html
<!DOCTYPE html>
<html>
<head>
<title>
Flask Example
</title>
</head>
<body>
<h1>
hello,{{name}}!
</h1>
<h2>
今天是{{current_date}}
</h2>
</body>
</html>
app.py
@app.route('/greet/<name>')
def greet(name):
current_date = time.strftime("%Y年%m月%d日", time.localtime())
print(current_date)
return render_template('greet.html',name=name,current_date=current_date)
代码解析:
render_template('greet.html',name=name,current_date=current_date):Flask 会自动从templates文件夹中加载greet.html模板文件,并将视图函数中的name,current_date变量传递给模板。在模板中,{{ name }},{{current_date}}会被替换为实际传递的值。例如,当用户访问/greet/Alice时,页面会显示 Hello, Alice! 和 今天是2025年11月14日。
模板继承与块
基础模块 base.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>
{% block title %}My website{% endblock %}
</title>
</head>
<body>
<h1>welcome to My website</h1>
<div>
{% block content %} {% endblock %}
</div>
</body>
<footer>
<p>© 2025 My Website</p>
</footer>
</html>
基础模板定义了页面的通用布局结构,其中使用{% block %}标签定义了可覆盖的块,如title块和content块。
子模块 index.html
{% extends "base.html" %}
{% block title %} home {% endblock %}
{% block content %} welcome to homepage {% endblock %}
代码解析:
{% extends "base.html" %}:表示子模板继承自base.html基础模板。
{% block title %}Home{% endblock %}:覆盖基础模板中的title块,将页面标题设置为 “Home”。
{% block content %}{% endblock %}:覆盖基础模板中的content块,定义页面的主要内容区域。通过模板继承,可以避免重复编写通用的布局代码,提高开发效率。