跳到主要内容

请求与响应

Flask 提供了强大的工具来处理 HTTP 请求和构建响应。

请求对象

获取请求数据

from flask import request

@app.route('/login', methods=['POST'])
def login():
# 表单数据
username = request.form.get('username')
password = request.form.get('password')

# JSON 数据
data = request.get_json()

# URL 参数
page = request.args.get('page', default=1, type=int)

return f'用户名: {username}'

请求属性

@app.route('/info')
def info():
return {
'method': request.method, # GET
'url': request.url, # 完整 URL
'path': request.path, # 路径
'headers': dict(request.headers), # 请求头
'cookies': request.cookies, # Cookies
'remote_addr': request.remote_addr # 客户端 IP
}

文件上传

@app.route('/upload', methods=['POST'])
def upload():
if 'file' not in request.files:
return '没有文件'

file = request.files['file']
if file.filename == '':
return '未选择文件'

if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
return '上传成功'

响应对象

基本响应

from flask import make_response, jsonify

@app.route('/simple')
def simple():
return '简单响应'

@app.route('/tuple')
def tuple_response():
return '响应内容', 200, {'Content-Type': 'text/plain'}

@app.route('/json')
def json_response():
return jsonify({'name': 'John', 'age': 30})

自定义响应

@app.route('/custom')
def custom():
response = make_response('自定义响应', 200)
response.headers['X-Custom-Header'] = 'Value'
response.set_cookie('session', 'abc123')
return response

模板渲染

from flask import render_template

@app.route('/hello/<name>')
def hello(name):
return render_template('hello.html', name=name, items=[1, 2, 3])

重定向和错误

from flask import redirect, url_for, abort

@app.route('/redirect')
def do_redirect():
return redirect(url_for('index'))

@app.route('/external')
def external():
return redirect('https://example.com')

@app.route('/user/<int:id>')
def get_user(id):
user = User.query.get(id)
if user is None:
abort(404)
return render_template('user.html', user=user)

会话管理

from flask import session

@app.route('/login', methods=['POST'])
def login():
session['user_id'] = user.id
session.permanent = True # 延长会话时间
return '登录成功'

@app.route('/logout')
def logout():
session.pop('user_id', None)
return '退出登录'

@app.route('/profile')
def profile():
if 'user_id' not in session:
return redirect(url_for('login'))
return '个人资料'

配置会话密钥:

app.secret_key = 'your-secret-key-here'
@app.route('/set-cookie')
def set_cookie():
response = make_response('Cookie 已设置')
response.set_cookie('username', 'john', max_age=3600)
return response

@app.route('/get-cookie')
def get_cookie():
username = request.cookies.get('username')
return f'用户名: {username}'

@app.route('/delete-cookie')
def delete_cookie():
response = make_response('Cookie 已删除')
response.delete_cookie('username')
return response

闪存消息

from flask import flash, get_flashed_messages

@app.route('/login', methods=['POST'])
def login():
# 验证登录...
flash('登录成功!', 'success')
return redirect(url_for('index'))

@app.route('/')
def index():
messages = get_flashed_messages(with_categories=True)
return render_template('index.html', messages=messages)

模板中使用:

{% with messages = get_flashed_messages(with_categories=true) %}
{% if messages %}
{% for category, message in messages %}
<div class="alert alert-{{ category }}">{{ message }}</div>
{% endfor %}
{% endif %}
{% endwith %}

请求钩子

@app.before_request
def before_request():
print('每个请求前执行')

@app.after_request
def after_request(response):
print('每个请求后执行')
return response

@app.teardown_request
def teardown_request(exception):
print('请求结束时执行,即使有异常')

@app.before_first_request
def before_first_request():
print('第一个请求前执行')

下一步

学习 Jinja2 模板引擎,创建动态 HTML 页面。