Flask框架路由与视图函数详解:参数、转换器及配置加载
本文深入解析Flask框架中的路由映射与视图函数机制。涵盖Flask对象初始化参数、run方法调试模式,以及@app.route装饰器的多种用法,包括动态参数类型、自定义正则转换器实现、指定HTTP请求方法。同时详细讲解视图函数的返回值形式(响应体、状态码、JSON、重定向与反解析),异常处理机制(abort与errorhandler),以及从类、配置文件和环境变量加载配置的三种方式,帮助开发者掌握Flask核心功能。
本文通过具体实例详细解析Flask框架中路由与视图函数的核心用法,旨在为读者提供清晰的参考指南。
构建基础Flask应用程序
#1.导入Flask类
from flask import Flask
#2.创建Flask对象接收一个参数__name__,它会指向程序所在的包
app = Flask(__name__)
#3.装饰器的作用是将路由映射到视图函数index
@app.route('/')
def index():
return 'Hello World'
#4.Flask应用程序实例的run方法,启动WEB服务器
if __name__ == '__main__':
app.run()
首先需了解Flask对象初始化时的关键参数设置。
| 参数 | 描述 |
|---|---|
| name | (必写)代表程序主函数__main__ |
| static_folder | 静态资源文件夹(默认static) |
| static_url_path | 静态资源路径(默认/static) |
| template_folder | 模板文件夹(默认templates) |
其次,掌握app.run()方法中各参数的具体含义与配置方式。
| 参数 | 描述 |
|---|---|
| ip | IP地址 |
| port | 端口 |
| debug | 默认为False,更改为True可以不重启服务器进行服务器修改(ctrl+s保存即可), 并且报错后会有相应提示 |
其中debug参数默认值为False;若将其设为True,服务器在代码修改后无需重启即可生效(保存Ctrl+S即可),且在发生错误时会提供详细的错误提示。
路由与视图函数的映射机制
使用@app.route("/路径")装饰器可将特定URL路径映射到对应的视图函数。通过访问app.url_map属性,可以查看当前应用中所有已注册的路由及其对应的函数关系。
支持动态参数传递,语法格式为@app.route("/路径/<类型:变量名>"),允许在URL中嵌入可变部分。
Flask内置了多种常用的URL转换器类型,用于自动校验和转换URL参数。
| 类型 | 描述 |
|---|---|
| int | 整型 |
| float | 浮点型 |
| path | 字符串型 |
除了内置类型,开发者还可以根据需求定义自定义转换器。
实现自定义转换器的步骤如下: (1) 创建一个新类并继承BaseConverter基类; (2) 在该类中编写__init__初始化方法; (3) 在初始化方法中调用父类构造函数并保存子类所需的变量(如正则表达式规则); (4) 将该自定义转换器注册到Flask应用默认的转换器列表中,以便在路由中使用。
以下是一个具体的自定义转换器实现示例。
from flask import Flask
from werkzeug.routing import BaseConverter
#1.自定义类,继承自BaseConverter
class MyRegexConverter(BaseConverter):
# 2.编写方法, init
def __init__(self,map,regex):
# 3.初始化, 父类, 子类变量
super(MyRegexConverter, self).__init__(map)
self.regex = regex
app = Flask(__name__)
# 4.将自定义转换器添加到,系统默认的转换列表中
app.url_map.converters["re"] = MyRegexConverter
print(app.url_map.converters)
# 接收三位整数
# 通过re调用的init方法, 参数1[默认]: app.url_map, 参数2: 自己定义的规则
@app.route('/<re("\d{3}"):number>')
def hello_world(number):
return "the re number is %s"%number
# 接收四位整数
@app.route('/<re("\d{4}"):number>')
def get_four_number(number):
return "the four number is %s"%number
# 接收手机号
@app.route('/<re("1[3456789]\d{9}"):mobile>')
def get_mobile_number(mobile):
return "the mobile number is %s"%mobile
if __name__ == '__main__':
app.run()
此外,可以在路由装饰器中通过methods参数明确指定允许访问该视图的HTTP请求方法。
@app.route("/路径",methods=["⽅式1","方式2"])
Flask支持多种HTTP请求方式,包括GET(默认)、POST、PUT和DELETE等。
视图函数的返回值决定了发送给客户端的响应内容,其形式可以多样化。
最简单的方式是直接返回响应体字符串。
此时返回值可以是一个元组,依次包含响应体内容、HTTP状态码以及响应头字典,分别设置返回内容、状态码及自定义响应头信息。
return "hello","666",{"name":"zhangsan"}
另一种方式是手动创建Response对象来构建响应。
response = make_response("响应体")
response.status = "状态码 状态码描述"
response.headers = {响应头键值对}
(response.headers["Content-Type"] = "application/json")
return response
若需返回JSON格式数据,可使用Flask提供的工具函数。
jsonify(dict)
jsonify(key=value,key2=value2)
对于页面跳转需求,可以使用重定向功能。
重定向通过redirect("路径")函数实现;而url_for("函数名", key=value)用于反解析,即根据视图函数名生成对应的URL地址。两者结合使用,可以在重定向时携带参数,实现更灵活的路由跳转。
以下是重定向与url_for配合使用的完整代码示例。
"""
url_for, 反解析,根据视图函数名称找到,视图函数的路径地址,可以携带参数
格式: url_for('函数名',key=value), 返回的是一个地址(字符串)
"""""
from flask import Flask,url_for,redirect
app = Flask(__name__)
# 京东, 代号111
@app.route('/jingdong')
def jingdong():
#print(url_for("taobao")) #/taobao
# print(url_for("taobao",token=111)) #/taobao/111
response = redirect(url_for("taobao",token=111))
return response
#易迅, 代号222
@app.route('/yixun')
def yixun():
response = redirect(url_for("taobao",token=222))
return response
@app.route('/other')
def other():
response = redirect(url_for("taobao",token=888))
return response
# 淘宝
@app.route('/taobao/<int:token>')
def taobao(token):
#判断哪个平台过来的用户
if(token == 111):
return "欢迎京东用户,光临淘宝,给你打9折"
elif(token == 222):
return "欢迎易迅用户,光临淘宝,给你打5折"
else:
return "其他用户"
if __name__ == '__main__':
app.run()
在Flask应用中,还可以对异常情况进行专门处理。
可以通过abort函数主动抛出HTTP异常。
abort(code)
abort函数接收一个参数code,该参数对应标准的HTTP错误状态码(如404、500等)。
另一种处理方式是使用@app.errorhandler(code)装饰器注册异常处理函数,当指定状态码的异常发生时,执行对应的处理逻辑。
code为HTTP错误状态码
@app.errorhandler(code)
def fun():
…
Flask应用的配置信息可以通过多种方式加载到app.config中。
第一种方式是从Python类中加载配置。
以下示例展示了如何从自定义配置类中加载配置信息。
class Config(object):
#调试模式
DEBUG=True
app.config.from_object(Config)
第二种方式是从外部配置文件中加载。
以下示例演示了如何从指定的配置文件中加载配置。
app.config.from_pyfile("config.ini")
第三种方式(了解即可)是从环境变量中加载配置。
app.config.from_envvar()
希望上述关于Flask框架路由和视图函数的解析,能对读者进行Python Web程序设计提供实质性帮助。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









