接口路由技术
大家好,今天我们要学习的是接口路由技术,这是 Web 开发中非常重要的一部分,特别是在使用 Flask 构建应用时,路由是与用户交互的一个核心部分。我们一起来看看,如何通过路由来处理用户的请求,并且让应用根据请求的 URL 返回不同的结果。
简介
路由是将 URL 地址与应用程序中的函数相映射的过程。当用户在浏览器中输入特定的 URL 地址时,Flask 会调用与该地址相匹配的函数并返回相应的结果。
首先,我们来看看路由的基本概念。简单来说,路由就是将 URL 地址和应用程序中的函数进行映射的过程。当你在浏览器中输入一个特定的 URL 时,Flask 会找到对应的函数,然后将这个函数的结果返回给用户。比如,你访问一个网站的首页,Flask 会处理根路径 / 的请求,返回一个首页的内容。
路由的应用场景
在 Web 应用程序都通过路由技术使用 URL 链接来控制网页显示的内容,只要知道 URL 链接,即使没有主页导航也可以直接访问所需网页。
那么,路由到底有哪些应用场景呢?在 Web 应用中,路由技术允许我们通过 URL 来控制网页显示的内容。你想要查看某个页面,直接输入对应的 URL,就能访问到这个页面。也就是说,URL 不仅仅是为了标识网页,更是直接影响到你看到的内容。所以,路由的设计对一个 Web 应用的可访问性和用户体验至关重要。
通过 Flask 实现路由
在 Flask 中,可以使用 @app.route()
装饰器来定义路由。路由决定了用户请求的 URL 路径与对应的视图函数之间的关系。
接下来,我们来看一下,Flask 是如何实现路由的。在 Flask 中,我们通过 @app点route 装饰器来定义路由,这个装饰器将一个 URL 路径和对应的视图函数关联起来。当某个 URL 被请求时,Flask 就会执行相应的视图函数并返回结果。比如,当我们访问 / 路径时,Flask 会执行 index 函数,返回首页内容。
路由类型
路由类型 | 实现方式 |
---|---|
基本路由 | @app.route('/') |
动态路由 | @app.route('/user/<username>') |
限定类型 | @app.route('/post/<int:post_id>') |
Flask 支持多种路由类型。这里我们看一下不同类型的路由。基本路由:它是最简单的路由类型,只需要指定一个固定的路径。动态路由:可以在 URL 中使用动态部分,比如用户的名字、ID 等。这样,Flask 就能根据不同的 URL 返回不同的数据。限定类型的路由:可以对动态路由进行类型限制,比如只允许整数、浮点数等,确保传递的数据符合预期。下面我们来分别看一下不同类型的路由是如何实现的。
基本路由
基本路由定义方式为:
from flask import Flask
# 创建 Flask 应用程序实例
app = Flask(__name__)
# 定义基本路由
@app.route("/")
def index():
return "Home Page"
@app.route("/about")
def about():
return "About Page"
# 运行应用程序
if __name__ == '__main__':
app.run()
我们先来看一下基本路由的实现方式。在 Flask 中,基本路由定义起来非常简单。你只需要使用 @app点route() 装饰器来指定路径,并定义一个视图函数返回内容。举个例子,假设你有一个主页和关于页面,你可以通过下面的代码来定义它们。
在上述示例中,@app.route('/')
和 @app.route('/about')
分别定义了根路径 '/'
和 /about
的路由。当用户访问这些路径时,Flask 会调用对应的视图函数并返回相应的内容。
@app.route('/')
访问地址为 http://127.0.0.1:5000/
,@app.route('/about')
访问地址为 http://127.0.0.1:5000/about
。
下面我们来详细解释一下这个例子中的路由是如何定义的。这里我们定义了两个视图函数 index 和 about。其中给 index 使用 @app点route('/') 设置了 / 也就根路由。当你访问 http冒号//127点0点0点1冒号5000/ 时,Flask 会返回首页内容;about 函数使用 @app点route('/about') 设置了 /about 作为路由。当你访问 http冒号//127点0点0点1冒号5000/about 时,Flask 会返回关于页面的内容。
动态路由
URL 中某些地方存在可变部分,为动态的 URL,Flask 支持这种动态 URL。
动态路由是通过尖括号 <>
实现的,放在尖括号里面的部分为动态部分,即在装饰器 route 传入 <>
部分,定义视图函数时,将该 <>
里面的内容作为参数传入到函数里面即可。
比如路由 /user/Harry
后面想要根据不同的用户名,返回不同的数据。这种情况可以用变量来代替名字部分:@app.route('/user/<username>')
。
这时 username 传入不同的值时,比如依次传入 Harry、Ron、Hermione,那么对应的路由就变为:/user/Harry
、/user/Ron
、/user/Hermione
。
接下来再来看看动态路由如何定义。什么时候会需要用到动态路由呢?比如说,你访问的路径会根据不同的值返回不同的结果。比如路由中想要根据不同的用户名返回不同的数据,类似于 /user/Harry、/user/Ron,Flask 支持通过动态路由来实现这一点。在 Flask 中,动态路由的定义很简单,只需要在路径中使用尖括号 来指定动态部分。例如,我们可以通过 /user/尖括号username 来定义一个用户页面,其中 username 就是动态的部分,Flask 会自动将它作为参数传递给对应的视图函数。假设我们访问 http冒号//127点0点0点1冒号5000/user/Ron,Flask 会将 Ron 作为 username 参数传给视图函数,返回 “User Ron is selected info.”。
# 定义动态路由
@app.route("/user/<username>")
def user_info(username):
return f"User {username} is select info."
访问:http://127.0.0.1:5000/user/Ron
,查看服务端日志,会有一条返回信息:User Ron is select info.
。
来看看刚才说的这个场景使用 flask 实现出来的代码。定义好这个是图函数之后,我们启动服务。然后访问一下这个路由,就可以在服务端日志中看到返回信息是 User Ron is select info.。
限定类型
如果希望限定输入的动态字段的类型,可以使用 <类型:变量名>
来实现,例如如果希望某个字段只能是整数,那么可以写为 /user/<int:user_id>
。
Flask 支持在路由上使用的类型有 int、float、string、path。path 类型是字符串的一种,不同的是它可以包含正斜线。
# 限定类型的动态路由
# 类型限定为整型
@app.route("/user/<int:user_id>")
def user_id(user_id):
# 展示给定的用户 ID,ID 为整型
return f"User ID is {user_id}"
# 类型限定为 path(可以包含 /)
@app.route('/path/<path:sub_path>')
def show_subpath(sub_path):
# 展示 path 后的子路由
return f'Subpath is {sub_path}'
如果你希望对动态路由的输入进行限制,Flask 也支持类型限定。比如你希望某个动态部分只能是整数,可以在路由中指定类型。比如 /user/尖括号int:user_id 就表示 user_id 必须是一个整数。如果传入其他类型的值,Flask 会自动返回 404 错误。还可以限定为其他类型,比如浮点数、字符串等,或者是 path 类型,它可以包含路径中的斜杠。在这个例子中,我们用 尖括号int:user_id 限定了 user_id 是整数,而尖括号path:sub_path 允许传入包含 / 的路径。
路由规则
Flask 的 URL 规则基于 Werkzeug 的路由模块。可以确保形成的 URL 是唯一的,并且基于 Apache 规定的先例。
@app.route('/about')
def about():
return 'About Page'
@app.route('/hogwarts/')
def hello_hogwarts():
return 'Hello Hogwarts'
if __name__ == '__main__':
app.run()
下面我们再来了解一下路由规则。路由的规则也是 Flask 中一个非常重要的概念。Flask 使用的 URL 规则来自 Werkzeug 路由模块,确保每个 URL 都是唯一的,并且符合标准的 URL 规范。这里我们定义了两个视图函数 about 和 hello hogwarts。这两个视图的路由大家可以关注一下,写法上是不太一样的。
这两个路由定义的例子看起来类似,其实是不一样的。
在第二个例子中,路由的尾部使用斜杠 (/)。因此,它成为一个规范的URL。这时 Flask 会自动进行重定向。当在浏览器的地址栏中不输入 /
时,会自动在尾部加上一个斜杠。也就是在浏览器的地址栏中输入 /
和不输入 /
的效果是一样的。
而第一个例子中,路由的尾部没有 /
。那么访问的时候,在浏览器的地址栏中不能输入 /
,否则会产生 “Not Found” 的错误。这样可以保持 URL 唯一。
第一个视图函数中路由尾部没有加 /,而第二个视图函数的路由中末尾又加上了一个 /。这两种写法有什么区别呢?其实 Flask 会自动处理 URL 中的斜杠问题。如果你定义的路由是 /about,而用户访问 /about/,也就是在末尾加了一个斜杠,Flask 会自动重定向到 /about,这能保持 URL 的一致性。如果在定义的时候路由最后没有加 /,那在访问这个路由的时候如果加上 / 服务就会识别路由失败。
总结
- 路由的应用场景
- 基本路由
- 动态路由
- 限定类型
- 路由规则
好了,最后我们来总结一下。这个章节我们学习了 Flask 路由的一些基本概念和用法。这些内容都是 Web 开发中非常基础和重要的知识,掌握了它们,你就能够灵活地处理 URL 和路由,进而构建出功能强大的 Web 应用。