在Web开发中,请求和响应是两个核心概念。简单来说,请求是客户端(比如浏览器)发给Flask应用的数据,而响应是Flask应用返回给客户端的结果。理解这两个对象,是掌握Flask开发的基础。
一、请求对象:从客户端获取数据¶
当用户在浏览器中访问一个Flask路由时,浏览器会向Flask应用发送一个请求。Flask通过request对象来封装这些请求数据,我们可以通过它获取用户输入、请求方法、URL参数等信息。
1. 导入请求对象¶
要使用request对象,首先需要从flask模块中导入它:
from flask import Flask, request
2. 请求对象的核心属性¶
request对象包含了客户端发送的几乎所有信息,常用的核心属性如下:
| 属性/方法 | 作用描述 |
|---|---|
request.method |
获取请求方法(如GET、POST、PUT等),大写字符串 |
request.args |
获取URL参数(对应GET请求,如http://example.com/?name=test中的name) |
request.form |
获取表单数据(对应POST请求,如HTML表单提交的数据) |
request.cookies |
获取客户端发送的Cookie信息 |
request.headers |
获取请求头信息(如User-Agent、Content-Type等) |
3. 示例:处理GET和POST请求¶
app = Flask(__name__)
@app.route('/')
def index():
# 处理GET请求(URL参数)
name = request.args.get('name', 'Guest') # 获取name参数,默认值为'Guest'
return f"Hello, {name}!这是GET请求的响应"
@app.route('/submit', methods=['POST'])
def submit():
# 处理POST请求(表单数据)
username = request.form.get('username')
password = request.form.get('password')
if username and password:
return f"提交成功!用户名:{username}"
else:
return "用户名或密码不能为空", 400 # 返回400状态码(参数错误)
if __name__ == '__main__':
app.run(debug=True)
测试方式:
- 访问http://localhost:5000/?name=小明,会返回“Hello, 小明!这是GET请求的响应”
- 通过POST表单提交数据(如用Postman或HTML表单),发送username=test和password=123,会返回“提交成功!用户名:test”
二、响应对象:给客户端返回结果¶
当Flask处理完请求后,需要通过响应对象将结果返回给客户端。Flask的响应对象可以是字符串、HTML页面、JSON数据、重定向等。
1. 直接返回字符串¶
最简单的响应方式,Flask会自动将字符串封装为状态码为200(成功)的响应:
@app.route('/hello')
def hello():
return "Hello, Flask!" # 状态码默认200
2. 返回HTML页面¶
如果需要返回HTML页面,需使用render_template函数(需先创建templates文件夹存放HTML文件):
from flask import render_template
@app.route('/page')
def page():
# 渲染templates文件夹下的index.html
return render_template('index.html', title="首页")
示例templates/index.html:
<!DOCTYPE html>
<html>
<head>
<title>{{ title }}</title>
</head>
<body>
<h1>这是一个HTML页面</h1>
</body>
</html>
3. 返回JSON数据¶
如果需要返回JSON格式的数据(如API接口),使用jsonify函数(自动设置Content-Type: application/json):
from flask import jsonify
@app.route('/api/user')
def get_user():
user = {
"name": "小红",
"age": 20,
"hobby": "编程"
}
return jsonify(user) # 返回JSON数据,状态码200
4. 重定向¶
如果需要跳转到其他页面(如登录后跳转首页),使用redirect函数:
from flask import redirect, url_for
@app.route('/login')
def login():
# 重定向到首页(url_for自动解析路由函数对应的URL)
return redirect(url_for('index'))
5. 自定义状态码¶
通过在返回值中添加状态码,可以明确告诉客户端请求结果(如404、500等):
@app.route('/not_found')
def not_found():
return "页面不存在", 404 # 状态码404:资源不存在
三、综合示例:一个简单的表单交互¶
下面通过一个完整示例,展示请求和响应的结合使用:
from flask import Flask, request, render_template, redirect, url_for, jsonify
app = Flask(__name__)
# 首页:显示表单(GET请求)
@app.route('/')
def index():
return render_template('form.html') # 渲染templates/form.html
# 处理表单提交(POST请求)
@app.route('/submit', methods=['POST'])
def submit():
# 获取表单数据
username = request.form.get('username')
email = request.form.get('email')
# 简单验证
if not username or not email:
return "用户名和邮箱不能为空!", 400 # 返回错误信息和400状态码
# 模拟处理数据(如存入数据库)
print(f"收到用户数据:{username}, {email}")
# 返回JSON响应(也可重定向到成功页)
return jsonify({
"status": "success",
"message": f"欢迎 {username}!数据已接收"
})
if __name__ == '__main__':
app.run(debug=True)
templates/form.html(需在项目根目录创建templates文件夹):
<!DOCTYPE html>
<html>
<head>
<title>用户表单</title>
</head>
<body>
<h1>请填写信息</h1>
<form method="POST" action="/submit">
<input type="text" name="username" placeholder="用户名" required><br><br>
<input type="email" name="email" placeholder="邮箱" required><br><br>
<button type="submit">提交</button>
</form>
</body>
</html>
四、总结¶
- 请求对象(request):用于获取客户端发送的数据,核心关注
method(请求方法)、args(GET参数)、form(POST表单)。 - 响应对象(response):用于返回结果给客户端,常见方式有字符串、HTML(
render_template)、JSON(jsonify)、重定向(redirect)。 - 关键原则:GET请求用于获取数据(参数放在URL中),POST请求用于提交数据(参数放在请求体中);返回JSON用
jsonify,返回页面用render_template。
通过本文,你应该对Flask的请求和响应对象有了基本了解。接下来可以尝试自己编写简单的Web页面或API接口,加深理解~