Python:Flask请求参数和响应探究

简介: Python:Flask请求参数和响应探究

一、参数传递

测试代码


# -*- coding: utf-8 -*-
from flask import Flask, request
app = Flask(__name__)
@app.route("/", methods=['POST', 'GET'])
def index():
    print(request.args)
    print(request.form)
    print(request.values)
    print(request.data)
    print(request.json)
    return "ok"
if __name__ == '__main__':
    app.run(debug=True)

请求测试

1、发送json数据


POST http://127.0.0.1:5000/?age=12
Content-Type: application/json
{
"name": "Tom"
}

收到的数据如下

request.args   [('age', '12')]
request.form   []
request.values [('age', '12')]
request.data   b'{\n"name": "Tom"\n}'
request.json   {'name': 'Tom'}

2、发送form数据

POST http://127.0.0.1:5000/?age=12
Content-Type: application/x-www-form-urlencoded
name=Tom

收到的数据如下


request.args  [('age', '12')]
request.form  [('name', 'Tom')]
request.values  [('age', '12'), ('name', 'Tom')]
request.data  b''
request.json  None

如果request.args 和 request.form 数据相同,会优先取request.args 中的数据


二、升级参数接收

通过测试发现,如果前端没有传递正确的json数据,request.json 会返回一个None ,如果直接取数据会报错,目前主流的传参方式是json数据,我们改装一下:


# -*- coding: utf-8 -*-
from flask import Flask, request, Request
class MyRequest(Request):
    @property
    def json(self):
        """避免json数据未传递而返回 None"""
        try:
            data = self.get_json()
        except Exception as e:
            data = None
        return data or {}
    @property
    def params(self):
        """
        将参数全都放入一个变量
        参数获取顺序 args > form > json
        :return: {dict}
        """
        data = {}
        for key, value in self.args.items():
            data.setdefault(key, value)
        for key, value in self.form.items():
            data.setdefault(key, value)
        for key, value in self.json.items():
            data.setdefault(key, value)
        return data
app = Flask(__name__)
app.request_class = MyRequest
@app.route("/", methods=['POST', 'GET'])
def index():
    print(request.args)
    print(request.form)
    print(request.values)
    print(request.data)
    print(request.json)
    print(request.params)
    return request.params
if __name__ == '__main__':
    app.run(debug=True)

MyRequest 类 修改了 json 方法,捕获了异常,避免返回 None 报错,添加了params 方法,将所有参数都封装到里边,简化参数获取,不过不能准确获取参数


三、返回参数

视图函数不能直接返回 list 参数,所以改造一下


# -*- coding: utf-8 -*-
from flask import Flask, request, Request, jsonify
class MyRequest(Request):
    @property
    def json(self):
        """避免json数据未传递而返回 None"""
        try:
            data = self.get_json()
        except Exception as e:
            data = None
        return data or {}
    @property
    def params(self):
        """
        将参数全都放入一个变量
        处理参数顺序 args > form > json
        :return: {dict}
        """
        data = {}
        for key, value in self.args.items():
            data.setdefault(key, value)
        for key, value in self.form.items():
            data.setdefault(key, value)
        for key, value in self.json.items():
            data.setdefault(key, value)
        return data
class MyFlask(Flask):
    request_class = MyRequest
    def make_response(self, rv):
        """视图函数可以直接返回list 或者 dict"""
        if isinstance(rv, (list, dict)):
            return jsonify(rv)
        return super().make_response(rv)
    def post(self, rule, **options):
        """便于书写post方法"""
        options.setdefault('methods', ['POST'])
        return self.route(rule, **options)
app = MyFlask(__name__)
@app.post("/")
def index():
    return ['cat', 'pig']
if __name__ == '__main__':
    app.run(debug=True)

额外添加了post方法,便于书写post请求

相关文章
|
8天前
|
JSON API 数据格式
如何使用Python和Flask构建一个简单的RESTful API。Flask是一个轻量级的Web框架
本文介绍了如何使用Python和Flask构建一个简单的RESTful API。Flask是一个轻量级的Web框架,适合小型项目和微服务。文章从环境准备、创建基本Flask应用、定义资源和路由、请求和响应处理、错误处理等方面进行了详细说明,并提供了示例代码。通过这些步骤,读者可以快速上手构建自己的RESTful API。
20 2
|
10天前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
Python Web框架比较:Django vs Flask vs Pyramid
22 1
|
10天前
|
JSON API 数据格式
构建RESTful APIs:使用Python和Flask
构建RESTful APIs:使用Python和Flask
22 1
|
21天前
|
JSON API 数据格式
使用Python和Flask构建简单的RESTful API
【10月更文挑战第12天】使用Python和Flask构建简单的RESTful API
41 1
|
21天前
|
API 网络架构 Python
使用Python和Flask构建简单的RESTful API
【10月更文挑战第12天】使用Python和Flask构建简单的RESTful API
32 0
|
14天前
|
安全 数据处理 开发者
Python中的多线程编程:从入门到精通
本文将深入探讨Python中的多线程编程,包括其基本原理、应用场景、实现方法以及常见问题和解决方案。通过本文的学习,读者将对Python多线程编程有一个全面的认识,能够在实际项目中灵活运用。
|
8天前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
1天前
|
存储 人工智能 数据挖掘
从零起步,揭秘Python编程如何带你从新手村迈向高手殿堂
【10月更文挑战第32天】Python,诞生于1991年的高级编程语言,以其简洁明了的语法成为众多程序员的入门首选。从基础的变量类型、控制流到列表、字典等数据结构,再到函数定义与调用及面向对象编程,Python提供了丰富的功能和强大的库支持,适用于Web开发、数据分析、人工智能等多个领域。学习Python不仅是掌握一门语言,更是加入一个充满活力的技术社区,开启探索未知世界的旅程。
10 5
|
2天前
|
人工智能 数据挖掘 开发者
探索Python编程:从基础到进阶
【10月更文挑战第32天】本文旨在通过浅显易懂的语言,带领读者从零开始学习Python编程。我们将一起探索Python的基础语法,了解如何编写简单的程序,并逐步深入到更复杂的编程概念。文章将通过实际的代码示例,帮助读者加深理解,并在结尾处提供练习题以巩固所学知识。无论你是编程新手还是希望提升编程技能的开发者,这篇文章都将为你的学习之旅提供宝贵的指导和启发。
|
14天前
|
弹性计算 安全 小程序
编程之美:Python让你领略浪漫星空下的流星雨奇观
这段代码使用 Python 的 `turtle` 库实现了一个流星雨动画。程序通过创建 `Meteor` 类来生成具有随机属性的流星,包括大小、颜色、位置和速度。在无限循环中,流星不断移动并重新绘制,营造出流星雨的效果。环境需求为 Python 3.11.4 和 PyCharm 2023.2.5。