Flask框架 入门版

109 阅读4分钟

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>&copy; 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块,定义页面的主要内容区域。通过模板继承,可以避免重复编写通用的布局代码,提高开发效率。