路由参数
路由基础用法
@routes.route('/')
def index():
return 'Hello, World!'
这段代码定义了一个基本的路由,当用户访问应用的根URL(”/”)时,index
函数会被调用并返回”Hello, World!”。这里routes.route('/')
指定了URL路径与处理函数之间的映射关系。
路由参数
@routes.route('/user/<username>')
def user_profile(username):
return f'Hello, {username}!'
路由中可以包含变量部分,以便捕获URL中动态变化的部分。在这个例子中,<username>
是一个动态部分,它可以匹配任何非斜杠字符序列。当这个路由被访问时,比如通过/user/john
,john
就会作为参数传递给user_profile
函数,并在响应中显示出来。
路由默认值及参数类型
@routes.route('/post/<int:post_id>')
def show_post(post_id):
return f'Post {post_id}'
Flask允许为路由参数指定类型,这有助于自动类型转换和验证。例如,<int:post_id>
表示post_id
应该被解析为一个整数。如果URL中这部分不是整数,Flask会返回一个404错误。其他可用的类型包括string
(默认)、float
、path
、uuid
和any
。这样的设计提高了代码的安全性和健壮性。
参数类型 | 描述 |
string |
默认类型,匹配除了斜杠(/)之外的任何字符串。 |
int |
匹配一个整数。自动转换为int类型,并且如果URL部分不能转换为整数,会引发404错误。 |
float |
匹配一个浮点数。类似于int,但匹配的是小数。如果不能转换为浮点数,也会引发404错误。 |
path |
类似于string,但同时也匹配斜杠(/)。这对于需要匹配包含路径分隔符的URL部分非常有用,例如文件路径。 |
uuid |
匹配一个UUID字符串。确保传入的字符串符合UUID的格式,否则返回404错误。 |
any |
匹配任何字符串,包括空字符串。这个类型很少直接使用,因为默认的string类型几乎等效,除非你需要明确表示可以是空值。 |
请求方法
@routes.route('/login', methods=['GET', 'POST', 'PUT', 'DELETE'])
def login():
if request.method == 'POST':
return 'POST'
elif request.method == 'GET':
return 'GET'
elif request.method == 'PUT':
return 'PUT'
elif request.method == 'DELETE':
return 'DELETE'
HTTP协议定义了多种请求方法,如GET、POST等,用于表示客户端向服务器发送的不同类型的请求。通过在route
装饰器中指定methods
参数,你可以限制该路由只接受特定类型的请求。在这个例子中,/login
路径可以响应GET、POST、PUT和DELETE请求,根据请求方法的不同返回不同的消息。request.method
属性用于检测当前请求的方法。
request
请求
工具
请求测试工具我使用的是Postman,或者创建后缀名为.http
的文件。
Postman安装包路径:
网盘路径: https://pan.xunlei.com/s/VNxJbqhA5OencgUXmmdD3Rg3A1
提取码:8295
Flask 请求详解笔记
基本概念
在 Flask 中,request
对象用于处理来自客户端的所有请求信息。它封装了关于请求的各种细节,使开发者能够轻松访问请求相关的数据。以下是一些关键属性和方法的详细说明:
-
• request.method:表示 HTTP 请求的方法,常见的有
'GET'
,'POST'
等。 -
• request.path:返回请求的路径部分,不包含查询字符串,例如
/user/profile
。 -
• request.full_path:提供请求的完整路径,包含查询字符串,如
/user/profile?search=query
。 -
• request.args:一个字典,用于存储查询字符串中的参数,例如
?key=value&another=value2
。 -
• request.form:当请求方法为
'POST'
且内容类型为'application/x-www-form-urlencoded'
或'multipart/form-data'
时,用于存储表单数据的字典。 -
• request.files:处理上传文件的字典对象,每个键对应一个上传的文件。
-
• request.headers:一个字典对象,包含所有 HTTP 请求头信息。
-
• request.cookies:一个字典,存储了请求中的所有 cookies。
-
• request.data:请求的原始数据,适用于非表单数据,如直接发送的 JSON 数据。
-
• request.json:如果请求的内容类型是
'application/json'
,此属性会自动解析并返回 JSON 数据。 -
• request.remote_addr:客户端的 IP 地址。
-
• request.user_agent:客户端的 User-Agent 字符串,可以用来识别浏览器或爬虫等。
-
• request.url:完整的请求 URL,包括协议、域名、路径及查询字符串。
-
• request.scheme:请求使用的协议,如
'http'
或'https'
。 -
• request.host:请求的主机名加端口号。
示例代码解析
GET 请求处理
@routes.route('/get/search')
def search():
# 从查询字符串中获取 'q' 参数
q = request.args.get('q')
# 返回搜索结果的提示信息
return f'Search for: {q}'
# data.http请求文件:写 GET http://localhost:5000/get/search?q=apple
此例展示了如何从 GET 请求的查询字符串中获取参数,并返回一个简单的响应。data.http
文件每次写完一个请求后用三个###
用来分割。比如:
GET http://localhost:5000/get/search?q=apple
###
POST http://localhost:5000/post/search
Content-Type: application/json
{
"user":"艾则麦提",
"age":20
}
POST 请求处理
@routes.route("/post/search", methods=["POST"])
def search_post():
# 从 POST 请求的表单数据中获取 'user' 和 'age'
user = request.json.get("user")
age = request.json.get("age")
# 返回用户年龄信息
return f"{user}今年{age}岁了!"
这段代码展示了如何处理表单提交的 POST 请求,提取表单字段值并构造响应。
data.http
POST http://localhost:5000/post/search
Content-Type: application/json
{
"user":"艾则麦提",
"age":20
}
获取请求头和其它信息
@routes.route("/head/data")
def get_header_data():
# 返回请求头,获取指定的标头,request.headers.get('标头名')
headers = request.headers
# 获取ip
ip = request.remote_addr
# 获取请求方式
method = request.method
# 获取请求路径
path = request.path
# 获取请求地址
url = request.url
# 获取请求协议
scheme = request.scheme
# 获取请求主机
host = request.host
# 组合信息并返回
log_message = (
f"客户端IP: {ip}n"
f"请求方法: {method}n"
f"请求路径: {path}n"
f"完整URL: {url}n"
f"协议类型: {scheme}n"
f"主机信息: {host}n"
f"请求头详情:n{headers}n"
)
return log_message
响应
直接返回字符串
在 Flask 中,最简单的响应方式是直接从视图函数返回一个字符串。Flask 会自动将这个字符串转换为 HTML 响应。
@routes.route('/response')
def get_response():
return 'This is a response'
在这个例子中,当用户访问 /response
路径时,get_response
函数会被调用,并返回字符串 'This is a response'
。Flask 会创建一个包含这个字符串的 HTML 响应,并发送给客户端。
使用 flask.make_response
创建响应对象
如果你需要更细粒度的控制响应,可以使用 flask.make_response
函数来创建一个响应对象。
@routes.route('/response2')
def get_response2():
response = make_response('This is a response')
response.headers['Content-Type'] = 'text/plain'
return response
在这个例子中,我们使用 make_response
函数创建了一个响应对象,并设置了 Content-Type
头为 'text/plain'
,这样客户端就会知道返回的内容是纯文本。
使用 flask.Response
创建响应对象
flask.Response
类是创建响应对象的另一种方式。它提供了更多的灵活性,允许你设置状态码、响应头等。
@routes.route('/json-response')
def json_response():
data = {'key': 'value'}
response = Response(json.dumps(data), content_type='application/json')
return response
在这个例子中,我们创建了一个 JSON 响应。首先,我们使用 json.dumps
将 Python 字典转换为 JSON 字符串,然后创建一个 Response
对象,并设置 content_type
为 'application/json'
。
JSON响应
Flask 提供了一个便捷的函数 jsonify
来创建 JSON 响应。
@routes.route('/json-response2')
def json_response2():
data = {'key': 'value'}
return jsonify(data)
在这个例子中,我们使用 jsonify
函数将 Python 字典转换为 JSON 响应。jsonify
会自动设置 Content-Type
头为 'application/json'
。
错误处理与自定义错误响应
Flask 允许你自定义错误页面,通过使用 errorhandler
装饰器。
@routes.errorhandler(404)
def page_not_found(e):
return jsonify(error='Not found'), 404
在这个例子中,我们定义了一个处理 404 错误的函数。当用户请求一个不存在的页面时,这个函数会被调用,并返回一个自定义的 JSON 错误响应,状态码为 404。
设置状态码
你可以通过在视图函数中返回一个元组来设置响应的状态码。
@routes.route('/status-code')
def status_code():
return 'This is a response', 401
在这个例子中,我们返回了一个元组,其中第一个元素是响应内容,第二个元素是状态码。这将返回一个状态码为 401 的响应。
重定向
你可以使用 redirect
函数来重定向用户到另一个 URL。
@routes.route('/redirect')
def redirect_example():
return redirect('https://www.baidu.com')
在这个例子中,用户会被重定向到 https://www.baidu.com
。
文件下载
Flask 允许你发送文件给客户端,实现文件下载功能。
@routes.route('/download')
def download_file():
file_path = 'static/Flask入门--路由.md'
return send_file(file_path, as_attachment=True)
在这个例子中,我们使用 send_file
函数发送一个文件给客户端,并设置 as_attachment
参数为 True
,这样浏览器就会提示用户下载文件。
项目资料与代码
git clone https://gitee.com/ezemeti/FlaskLearn.git
原文始发于微信公众号(索隆程序员):Flask入门–路由请求响应
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/289361.html