Python flask模块接口开发学习总结

本文介绍了使用Python的Flask框架进行Web服务接口开发的基本步骤,包括GET、POST等请求方法,获取JSON请求体,处理动态URL参数,以及自定义响应头和状态码。通过实例代码展示了Flask构建API接口的灵活性和实用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言

Flask 是一个简单且十分强大的Python web 框架。它被称为微框架,“微”并不是意味着把整个Web应用放入到一个Python文件,微框架中的“微”是指Flask旨在保持代码简洁且易于扩展,Flask框架的主要特征是核心构成比较简单,但具有很强的扩展性和兼容性,程序员可以使用Python语言快速实现一个网站或 Web服务。因此flask能很方便构建一个web服务,给外部也可以叫做客户端提供web服务,针对flask框架这种特点我们可以很容易构建API接口,供客户端访问。

Flask接口开发示例

首先安装需要的Flask模块,如果你的环境已经安装了pip则键入:pip install flask即可安装完成

1.1 构建GET请求方法的接口

在Pycharm中新建py文件,编辑如下代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

# -*- coding: utf-8 -*-

import flask,json

import time

 

server = flask.Flask(__name__)   # 创建一个服务,把当前这个python文件当做一个服务

 

@server.route('/VIID/System/Time', methods=['get'])  # @server.route()可以将普通函数转变为服务、接口的路径、请求方式,如果不写methods则默认get方法

def Time():

    '''查询字符串:无,消息体:无,返回结果:SystemTime'''

    response_data = {

                "SystemTimeObject": {

                    "VIIDServerID""123",

                    "TimeMode""1",          

                    "LocalTime": time.strftime('%Y%m%d%H%M%S', time.localtime(time.time())),

                }

            }

    return json.dumps(response_data, ensure_ascii=False)

 

if __name__ == '__main__':

    server.run(debug=True, port=5000, host='10.82.25.11')  #  指定访问端口、host

 然后运行该py文件,则该文件运行在本地就是一个web服务,用浏览器或者postman尝试访问该服务的URL即可

浏览器访问:

postman发请求访问:

浏览器或者postman请求完成后,在Pycharm的输出栏会输出如下:

其它的请求如POST、PUT、DELETE等方法,在methods参数中指明即可,不过POST、PUT、DELETE等方法不能由浏览器直接访问,因为浏览器默认访问时是get方法,可以用postman按指定的方法发请求

1.2 获取带json格式请求体的接口

有时客户端发送的请求是带json格式的,这时需要获取请求的json,编辑代码如下:

1

2

3

4

5

6

7

8

9

10

@server.route('/data',methods=['post'])

def post_json():

    if flask.request.is_json:

        print(flask.request.json)

        name = flask.request.json.get('name')            # 获取json请求体的第一个参数的值

        age = flask.request.json.get('age')             # 获取json请求体的第二个参数的值

        data = {'name':name,'age':age}

        return json.dumps(data,ensure_ascii=False)

    else:

        return json.dumps({'msg':'请传json格式参数'},ensure_ascii=False)

 使用postman作为客户端发送带json请求体的请求,如下图:

1.3 获取get请求中发送的参数

flask提供的方法是:

1

value = flask.request.args.get('name')           # 获取get请求参数name的值

1.4 构建动态URL以及响应体的重定向

很多时候,客户端请求的url是变化的,也就是带有动态参数的,flask也是可以轻松的构建提供动态参数的url资源服务并重定向响应体,代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

# -*- coding: utf-8 -*-

import flask,json

from flask import url_for,redirect

 

server = flask.Flask(__name__)   # 创建一个服务,把当前这个python文件当做一个服务

 

@server.route('/data')

def data():                       #  返回data

    data = {

                'VideoSliceInfoObject': {

                    'VideoID''esse elit',

                    'AudioCodeFormat''commodo'

                }

    }

    return json.dumps(data, ensure_ascii=False)

 

@server.route('/data/<ID>/Info', methods=['post'])

def data_redirect(ID):

    return redirect(url_for('data', guest=ID))

 

if __name__ == '__main__':

    server.run(debug=True, port=5000, host='10.82.25.11')  #  指定访问端口、host

 后面无论postman或者客户端发送的url中的ID参数是啥,都可以响应

1.5 重新构建响应头和响应状态码

有时在与第三方系统对接时,需要返回携带响应头消息和指定的响应状态码,在flask中也是可以构建自定义的响应消息的

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

# -*- coding: utf-8 -*-

import flask,json

 

server = flask.Flask(__name__)   # 创建一个服务,把当前这个python文件当做一个服务

 

@server.route('/data',methods=['post'])

def post_json():

    if flask.request.is_json:

        print(flask.request.json)

        name = flask.request.json.get('name')            # 获取json请求体的第一个参数的值

        age = flask.request.json.get('age')             # 获取json请求体的第二个参数的值

        data = {'name':name,'age':age}

        # 构建响应头域和状态码

        resp = flask.make_response(json.dumps(data, ensure_ascii=False))

        resp.status = "666"

        resp.headers[

            "python"= "python flask"

        return resp

    else:

        return json.dumps({'msg':'请传json格式参数'},ensure_ascii=False)

 

if __name__ == '__main__':

    server.run(debug=True, port=5000, host='10.82.25.11')  #  指定访问端口、host

 运行该py文件,在postman中发送请求,查看响应信息,如下图,变成的我们自定义设置的响应头和状态码

这样我们就完全自定义了响应的头和状态码

<think>好的,我现在需要帮助用户学习如何使用Python Flask开发API接口的最佳实践。首先,我要回想一下用户的问题,他们想了解最佳实践,所以需要涵盖从环境搭建到部署的各个方面。 首先,我应该确定用户可能已经了解的基础知识,比如Flask的基本用法,但考虑到是学习最佳实践,可能需要从基础开始梳理。不过用户明确提到最佳实践,所以重点应该在高效、可靠和安全方面。 接下来,我需要参考提供的引用内容。引用1提到使用Flask框架、Swagger规范、异常处理、JWT认证等。引用2和3也提到了框架选择、API结构设计、ORM集成等。引用4给出了一个简单的Flask示例代码,并提到路由和HTTP方法的使用。 那么,我应该将这些引用内容整合起来,分步骤介绍最佳实践。可能需要分为几个部分:环境配置、项目结构、路由设计、请求处理、认证授权、数据库集成、文档生成、测试、部署优化等。 然后,每个部分需要详细说明。例如,在项目结构部分,需要建议使用蓝图来组织代码,避免将所有路由放在一个文件中。在请求处理中,需要提到使用Flask-RESTful或Flask-RESTx来简化开发,同时处理数据验证和序列化。 认证部分,JWT是常用的,可以结合Flask-JWT-Extended库来实现。数据库集成方面,使用SQLAlchemy作为ORM,确保模型定义和管理迁移(比如用Alembic)。 文档生成方面,Swagger/OpenAPI规范很重要,可以使用Flask-RESTx自动生成文档。测试部分需要强调单元测试和集成测试,使用pytest和Flask的测试客户端。 部署优化需要考虑生产环境的配置,比如使用Gunicorn或uWSGI,以及启用调试模式和日志记录。 另外,错误处理也是关键,需要统一的错误响应格式,使用HTTP状态码,并处理全局异常。 可能需要检查是否有遗漏的部分,比如中间件、请求钩子、配置管理(开发、测试、生产环境的不同配置),还有安全性,如CORS配置,防止SQL注入和XSS攻击。 然后,示例代码部分需要展示一个完整的例子,包含上述提到的各个部分,比如使用蓝图、ORM、认证、错误处理等。但用户提供的引用4中的示例非常简单,可能需要更复杂的例子来展示最佳实践。 最后,生成的相关问题需要围绕用户可能进一步想了解的内容,比如如何扩展API、如何处理高并发、如何进行性能优化、如何实现版本控制等。 需要确保回答符合系统级指令,比如行内数学公式使用$...$,但在这个问题中可能用不上数学公式。不过用户的问题是关于API开发的,所以可能不需要数学表达式,但需要遵循其他格式要求,如独立代码块、引用标识等。 总结一下,回答的结构应该是分步骤介绍每个最佳实践,每个步骤下有详细的说明和代码示例,最后给出相关问题。需要确保引用正确,比如在提到Swagger时引用[^3],提到Flask示例时引用[^4]等。</think>### 使用 Python Flask 开发 API 接口的最佳实践 以下是基于 Flask 框架开发高效、安全、可维护的 API 接口的关键步骤和最佳实践: --- #### **1. 环境与项目配置** - **虚拟环境**:使用 `venv` 或 `pipenv` 隔离依赖。 ```bash python -m venv myenv && source myenv/bin/activate ``` - **依赖管理**:通过 `requirements.txt` 或 `pipenv` 管理依赖包,例如: ```text Flask==2.0.3 Flask-SQLAlchemy==3.0.2 Flask-JWT-Extended==4.4.0 ``` --- #### **2. 项目结构规范化** 采用模块化设计,避免代码冗余: ``` myapi/ ├── app/ │ ├── __init__.py │ ├── routes/ │ │ ├── auth.py # 认证相关路由 │ │ └── users.py # 用户管理路由 │ ├── models.py # 数据库模型 │ └── utils.py # 工具函数 ├── config.py # 配置文件(开发/生产环境) └── run.py # 启动入口 ``` --- #### **3. 请求处理与路由设计** - **使用 Flask-RESTful/Flask-RESTx**:简化资源路由定义和数据验证。 ```python from flask_restx import Api, Resource api = Api(app) @api.route('/users') class UserList(Resource): def get(self): return {"users": ["Alice", "Bob"]}, 200 ``` - **HTTP 方法规范**:遵循 RESTful 原则,例如 `GET /users` 获取列表,`POST /users` 创建新用户。 --- #### **4. 认证与授权** - **JWT 认证**:使用 `Flask-JWT-Extended` 实现 Token 机制。 ```python from flask_jwt_extended import JWTManager, create_access_token app.config["JWT_SECRET_KEY"] = "super-secret" jwt = JWTManager(app) @app.route("/login", methods=["POST"]) def login(): # 验证用户并生成 Token access_token = create_access_token(identity=username) return {"access_token": access_token} ``` --- #### **5. 数据库集成与 ORM** - **SQLAlchemy 集成**:通过 `Flask-SQLAlchemy` 管理数据库模型和迁移。 ```python from flask_sqlalchemy import SQLAlchemy app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///mydb.sqlite" db = SQLAlchemy(app) class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True) ``` - **迁移工具**:使用 `Alembic` 管理数据库变更[^3]。 --- #### **6. 错误处理与响应格式** - **统一错误响应**:自定义错误处理中间件。 ```python @app.errorhandler(404) def handle_404(error): return {"error": "Resource not found"}, 404 ``` - **数据验证**:使用 `marshmallow` 库进行请求参数和响应数据的序列化/反序列化。 --- #### **7. 文档生成与测试** - **Swagger/OpenAPI 支持**:通过 Flask-RESTx 自动生成 API 文档。 ```python api = Api(app, doc="/swagger/", title="My API") ``` - **单元测试**:使用 `pytest` 和 Flask 测试客户端。 ```python def test_get_users(client): response = client.get("/users") assert response.status_code == 200 ``` --- #### **8. 部署与优化** - **生产服务器**:使用 `Gunicorn` 或 `uWSGI` 替代 Flask 内置服务器。 ```bash gunicorn -w 4 run:app ``` - **配置管理**:通过环境变量区分开发和生产配置[^1]。 --- ### **示例代码** ```python from flask import Flask from flask_restx import Api, Resource app = Flask(__name__) api = Api(app) @api.route('/hello') class HelloWorld(Resource): def get(self): return {"message": "Hello, World!"}, 200 if __name__ == '__main__': app.run(debug=False) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值