【Flask】二、Flask 路由机制

目录

什么是路由?

Flask中的路由

基本路由

动态路由

路由中的HTTP方法

路由函数返回


在Web开发中,路由是将URL映射到相应的处理函数的过程。Flask是一个轻量级的Web应用框架,提供了简单而强大的路由机制,使得开发者能够轻松地将用户请求的URL映射到Python函数。

什么是路由?

在Web应用中,路由决定了用户请求的URL应该由哪个函数来处理。当用户在浏览器中输入一个URL或者点击一个链接时,Web服务器需要知道如何处理这个请求,这就是路由的作用。

Flask中的路由

Flask使用装饰器@app.route()来定义路由。这个装饰器告诉Flask哪个URL应该触发对应的函数。

基本路由

最基本的路由是将URL直接映射到函数。

python 复制代码
from flask import Flask
app = Flask(__name__)

@app.route('/')
def home():
    return 'Hello, Flask!'

if __name__ == '__main__':
    app.run(debug=True)

在上面这个例子中,我们定义了一个路由/,当用户访问应用的根目录时,会触发home函数,并返回字符串"Hello, Flask!"。

动态路由

Flask还允许我们定义动态路由,即URL中包含变量的部分。

python 复制代码
@app.route('/user/<username>')
def show_user_profile(username):
    return f'User {username}'

@app.route('/post/<int:post_id>')
def show_post(post_id):
    return f'Post {post_id}'

在这两个例子中,<username><int:post_id>是动态部分,Flask会将URL中对应的部分作为参数传递给函数。<username>可以匹配任何字符串,而<int:post_id>则限制只能匹配整数。

测试结果如下

路由规则支持不同类型的参数和匹配规则,post_id前的int为路由规则的类型,以下为常见的路由规则:

  • 字符串(默认): 匹配任意字符串。
  • 整数(<int:name>): 匹配整数值。
  • 浮点数(<float:value>): 匹配浮点数值。
  • 路径(<path:name>): 匹配任意字符,包括斜杠 /

路由中的HTTP方法

默认情况下,路由只响应GET请求。Flask允许我们指定路由响应特定的HTTP方法。

python 复制代码
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return do_the_login()
    else:
        return show_the_login_form()

上面的例子中,/login路由可以响应GET和POST请求。根据请求的方法,执行不同的函数。测试结果如下。

路由函数返回

视图函数可以返回多种类型的响应:

  • 字符串:返回纯文本响应。
  • HTML:返回 HTML 页面。
  • JSON:返回 JSON 数据。
  • Response 对象:自定义响应。

附全篇所有代码,以供测试使用

python 复制代码
from flask import Flask, request, jsonify, Response

app = Flask(__name__)


@app.route('/')
def home():
    return 'Hello, Flask!'


@app.route('/user/<username>')
def show_user_profile(username):
    return f'User {username}'


@app.route('/post/<int:post_id>')
def show_post(post_id):
    return f'Post {post_id}'


@app.route('/json')
def json_response():
    data = {'key': 'value'}
    return jsonify(data)


@app.route('/custom')
def custom_response():
    response = Response('Custom response with headers', status=200)
    response.headers['X-Custom-Header'] = 'Value'
    return response


def do_the_login():
    return f'post请求,进行登录'


def show_the_login_form():
    return f'get请求,展示登录表单'


@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return do_the_login()
    else:
        return show_the_login_form()


if __name__ == '__main__':
    app.run(debug=True)

测试结果如下

相关推荐
陈随易21 分钟前
前端大咖mizchi不满Rust、TypeScript却爱上MoonBit
前端·后端·程序员
雨中飘荡的记忆2 小时前
Multi-Agent + Skills + Spring AI 构建自主决策智能体
后端·spring
我叫黑大帅2 小时前
Go 语言并发编程的 “工具箱”
后端·面试·go
用户8356290780513 小时前
Python 实现 PowerPoint 形状动画设置
后端·python
用户908324602733 小时前
Spring Boot 缓存架构:一行配置切换 Caffeine 与 Redis,透明支持多租户隔离
后端
tyung3 小时前
zhenyi-base 开源 | Go 高性能基础库:TCP 77万 QPS,无锁队列 16ns/op
后端·go
子兮曰4 小时前
Humanizer-zh 实战:把 AI 初稿改成“能发布”的技术文章
前端·javascript·后端
桦说编程4 小时前
你的函数什么颜色?—— 深入理解异步编程的本质问题(上)
后端·性能优化·编程语言
ponponon4 小时前
时代的眼泪,nameko 和 eventlet 停止维护后的项目自救,升级和替代之路
python
Flittly4 小时前
【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(5)Skills (技能加载)
python·agent