本篇接着第二篇继续讲解Flask的请求及响应,文件上传等相关内容
1 唯一url/重定向行为
这里补充两条url规则,观看下面两条规则的不同之处:
@app.route('/projects/')
def projects():
return 'The project page'
@app.route('/about')
def about():
return 'The about page'
第一个路由加上了尾斜杠,类似于文件系统的文件夹,如果访问的地址只输入了/projects
那么,flask会重定向到有尾斜杠的路由/projects/
第二个规则,路由没有尾斜杠,类似于文件的路径名,如果你访问地址带上了尾斜杠 (/about/
)就会404找不到路由
这两条规则会保证资源的唯一性,有助于搜索引擎避免对同一页面进行两次索引
2 请求和响应
get请求及相应
from flask import Flask, jsonify, request
app = Flask(__name__)
# 示例数据,模拟存储在数据库中的用户信息
users = [
{"id": 1, "name": "John Doe"},
{"id": 2, "name": "Jane Doe"}
]
# 定义一个简单的路由,用于获取所有用户信息
@app.route('/users', methods=['GET'])
def get_users():
return jsonify(users)
# 定义路由,用于获取特定用户的信息
@app.route('/users/<int:user_id>', methods=['GET'])
def get_user(user_id):
user = next((user for user in users if user['id'] == user_id), None)
if user:
return jsonify(user)
else:
return jsonify({"error": "User not found"}), 404

post请求
# 定义路由,用于创建新用户
@app.route('/users', methods=['POST'])
def create_user():
data = request.get_json()
if 'name' in data:
new_user = {
'id': len(users) + 1,
'name': data['name']
}
users.append(new_user)
return jsonify(new_user), 201
else:
return jsonify({"error": "Name is required"}), 400
通过postman请求接口如下:

前面我们响应请求,只是通过return直接返回了结果,而无法对HTTP状态码和头部信息进行设置和修改,如果要指定响应的状态码、内容体和头部信息,并对响应进行自定义配置那么可以使用函数make response
from flask import Flask, make_response, jsonify
app = Flask(__name__)
@app.route('/custom_response')
def custom_response():
# 创建一个空的响应对象
response = make_response()
# 设置响应的内容
response.data = "This is a custom response."
# 设置响应的状态码
response.status_code = 200
# 设置响应的头部
response.headers['Content-Type'] = 'text/plain'
return response
3 文件上传
上传文件也是个老问题,flask也能轻松处理,看示例代码
import os
from flask import Flask, flash, request, redirect, url_for,render_template
from werkzeug.utils import secure_filename
UPLOAD_FOLDER = '/path/to/the/uploads'
ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'}
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
def allowed_file(filename):
return '.' in filename and
filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
@app.route('/', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
# check if the post request has the file part
if 'file' not in request.files:
flash('No file part')
return redirect(request.url)
file = request.files['file']
# If the user does not select a file, the browser submits an
# empty file without a filename.
if file.filename == '':
flash('No selected file')
return redirect(request.url)
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
return redirect(url_for('download_file', name=filename))
return render_template('upload.html')
upload.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>上传文件</title>
</head>
<body>
<form method=post enctype=multipart/form-data>
<input type=file name=file>
<input type=submit value=Upload>
</form>
</body>
</html>

扫描二维码关注阿尘blog,一起交流学习
原文始发于微信公众号(阿尘blog):Python Web之路:Flask第三篇
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/188308.html