【PythonWeb开发】Flask请求中传递参数到视图函数的方法总结。

在Flask中,传入参数主要有两种常见的方式,即通过GET请求和POST请求。

一、GET请求传递参数

(1)URL路径中获取

这种类型的参数通常称为路径参数或路由参数,它们是URL路径的一部分,通过尖括号**<parameter_name>**定义在路由规则中。

python 复制代码
@app.route('/user/<username>/post/<int:post_id>')
def show_post(username, post_id):
    # 这里可以直接通过函数参数获取路径中的变量
    return f"Username: {username}, Post ID: {post_id}"

如果你需要更复杂的路径参数处理,或者在处理请求之后动态获取路径参数,可以使用**request.view_args**,它是一个字典,包含了所有通过URL路径传递的参数。

python 复制代码
@app.route('/some/route/<path:custom_path>')
def handle_custom_path(custom_path):
    # 除了直接作为参数,你也可以通过view_args获取
    print(request.view_args)  # 输出: {'custom_path': 'the/path/from/url'}
    return f"The custom path is: {custom_path}"

(2)请求参数中获取

GET请求通常将参数附加在URL后面,通过问号**?** 分隔URL和参数,多个参数之间使用**&**连接。这种方式适用于请求不会改变服务器上的资源,且参数长度有限制(因为参数直接出现在URL中)。

http://example.com/api/data?key1=value1&key2=value2

使用**request.args**字典对象来获取GET参数。有三种使用方法:

  • get方法,如果该参数不存在,则可以提供一个默认值,避免抛出异常。
  • get_list方法,当一个参数可能在同一请求中有多个值时,返回一个包含所有值的列表。
  • 中括号,这种方式与普通字典访问类似,取不到会抛出异常。
python 复制代码
from flask import request

@app.route('/api/data')
def get_data():
    key1 = request.args.get('key1')  # 获取key1的值,如果不存在则返回None
    key2 = request.args['key2']      # 直接通过键访问,如果不存在会抛出KeyError
    key3 = request.args.get_list('key3')  # 取出存在同名key的所有值
    return f"Key1: {key1}, Key2: {key2}, Key3: {key3}"

二、POST请求传递参数

POST请求通常用于提交表单或发送可能改变服务器状态的数据。参数不在URL中显示,而是放在请求体中。POST请求可以承载更大的数据量,且对数据类型的支持更灵活。

POST请求有两种常见的编码格式:

  • application/x-www-form-urlencoded:表单数据,类似于GET请求的查询字符串格式。
  • multipart/form-data:用于文件上传,也可以包含普通字段。

(1)上传表单数据

对于表单使用**request.form**

  • 中括号方式
  • get方法

(2)上传JSON数据

对于JSON格式的数据(当Content-Type为**application/json** 时),使用**request.get_json()**

python 复制代码
from flask import request, jsonify

@app.route('/api/data', methods=['POST'])
def post_data():
    if request.is_json:  # is_json属性可以判断返回的是否是json数据
        data = request.get_json()          # 获取JSON格式的POST数据
        key1 = data.get('key1')           # 如果数据是JSON对象,则这样获取
    else:
        key1 = request.form.get('key1')    # 获取表单形式的POST数据
    return jsonify({"received_key1": key1})

(3)上传视频数据

使用**request.files**来取出上传的文件。

python 复制代码
@app.route('/upload_video', methods=['POST'])
def upload_video():
    video_file = request.files['video']  # 假设表单中文件字段名为'video'
    
    if video_file.filename == '':
        return "No video selected", 400
    
    # 可以在这里添加额外的验证,比如检查文件大小、视频格式等
    if video_file and allowed_file(video_file.filename, video_extensions):  # 假设allowed_file检查文件类型和大小
        filename = secure_filename(video_file.filename)
        video_file.save(os.path.join(app.config['VIDEO_UPLOAD_FOLDER'], filename))
        return "Video uploaded successfully"
    else:
        return "Invalid video file or other error", 400

(4)上传图片数据

使用**request.files**来取出上传的文件。上传图片数据的过程与上述视频上传相似,只是可能在验证阶段会特别检查图片的格式。

python 复制代码
def allowed_file(filename):
    """检查文件扩展名是否允许上传"""
    ALLOWED_EXTENSIONS = { 'jpg', 'jpeg', 'png', 'gif'}
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
python 复制代码
@app.route('/upload_image', methods=['POST'])
def upload_image():
    image_file = request.files['image']  # 假设表单中文件字段名为'image'
    
    if image_file.filename == '':
        return "No image selected", 400
    
    # 验证图片格式等
    if image_file and allowed_file(image_file.filename, image_extensions):  # 使用适合的图片扩展名集合
        filename = secure_filename(image_file.filename)
        image_file.save(os.path.join(app.config['IMAGE_UPLOAD_FOLDER'], filename))
        return "Image uploaded successfully"
    else:
        return "Invalid image file or other error", 400
相关推荐
程序员黄同学14 小时前
如何使用 Flask 框架创建简单的 Web 应用?
前端·python·flask
hnmpf1 天前
flask-admin+Flask-WTF 实现实现增删改查
后端·python·flask
hnmpf1 天前
flask-admin的modelview 实现list列表视图中某个列字段值翻译
后端·python·flask
jjw_zyfx1 天前
flask before_request 请求拦截器返回无值则放行,有值则拦截
后端·python·flask
盼兮*1 天前
Python调用星火认知大模型API(流式传输)
开发语言·python·flask·request
hnmpf1 天前
wtforms+flask_sqlalchemy在flask-admin视图下实现日期的修改与更新
后端·python·flask
jjw_zyfx3 天前
flask flask-socketio创建一个网页聊天应用
后端·python·flask
TenniCC3 天前
python 中使用pip操作flask离线下载(包含依赖包下载)和安装
python·flask·pip
jjw_zyfx3 天前
flask_socketio 以继承 Namespace方式实现一个网页聊天应用
后端·python·flask
唐家小妹3 天前
如何从0构建一个flask项目,直接上实操!!!
前端·后端·python·flask