python基于flask写后端实操笔记

一、基于flask写后端接口

1.1、接口可以调用其他类成员示例

from flask import Flask

app = Flask(__name__)

class Database:
    def __init__(self):
        self.data = []

    def add_item(self, item):
        self.data.append(item)

    def get_items(self):
        return self.data

db = Database()

@app.route('/api/add_item/<item>', methods=['POST'])
def add_item(item):
    db.add_item(item)
    return 'Item added successfully.'

@app.route('/api/get_items', methods=['GET'])
def get_items():
    items = db.get_items()
    return ', '.join(items)

if __name__ == '__main__':
    app.run(debug=True)

1.2、接口的入参是多个的示例

from flask import Flask

app = Flask(__name__)

@app.route('/api/user/<username>/profile/<int:age>', methods=['GET'])
def get_user_profile(username, age):
    # 使用username和age进行相关操作
    return 'Username: {}, Age: {}'.format(username, age)

if __name__ == '__main__':
    app.run(debug=True)

1.3、接口的入参是路径的示例

from flask import Flask, request

app = Flask(__name__)

@app.route('/api/user', methods=['GET'])
def get_user():
    path = request.args.get('path')
    # 使用path进行相关操作
    return 'Path: {}'.format(path)

if __name__ == '__main__':
    app.run(debug=True)

调用方法:

curl -X GET "http://localhost:5000/api/user?path=/your/path"

1.4、接口的入参是数组的示例

from flask import Flask, request

app = Flask(__name__)

@app.route('/api/user', methods=['GET'])
def get_user():
    ids = request.args.getlist('ids')
    # 使用ids数组进行相关操作
    return 'IDs: {}'.format(ids)

if __name__ == '__main__':
    app.run(debug=True)

调用方法:

curl -X GET "http://localhost:5000/api/user?ids=1&ids=2&ids=3"

1.5、接口的入参是list的示例

from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/process_data', methods=['POST'])
def process_data():
    # 从请求中获取 JSON 数据
    request_data = request.json
    
    # 假设请求数据是一个包含数字的列表
    data_list = request_data.get('data', [])
    
    # 对列表中的数据进行加倍处理
    doubled_data = [x * 2 for x in data_list]
    
    # 返回处理后的数据
    response_data = {'doubled_data': doubled_data}
    return jsonify(response_data)

if __name__ == '__main__':
    app.run(debug=True)

调用方法:

curl -H "Content-Type: application/json" -H "Data_Type:msg" -X POST -d '{"data":[1, 2, 3, 4, 5]}' http://localhost:5000/process_data

响应:

{
    "doubled_data": [2, 4, 6, 8, 10]
}

二、调用类型GET、POST、DELETE之间的区别

在基于Flask编写后端接口时,关键字GET、POST和DELETE是HTTP请求方法,用于指定客户端对服务器端资源的操作方式。它们有以下区别:

  1. GET:GET方法用于从服务器端获取资源,通常用于读取数据而不对数据进行修改。使用GET方法,客户端可以通过URL参数将数据传递给服务器,然后服务器返回所请求的资源。GET请求是幂等的,即多次相同的GET请求返回的结果应该是一样的,不应该对服务器端数据产生副作用。

  2. POST:POST方法用于向服务器端提交数据,通常用于创建新资源或修改现有资源。使用POST方法,客户端可以通过请求体将数据传递给服务器,然后服务器根据请求体中的数据执行相应的操作。POST请求不是幂等的,即多次相同的POST请求可能会导致服务器端数据的变化或副作用。

  3. DELETE:DELETE方法用于从服务器端删除资源。使用DELETE方法,客户端可以指示服务器删除指定的资源。DELETE请求应该是幂等的,即多次相同的DELETE请求对服务器端数据的状态应该是一致的,即使资源已经被删除。

三、跨域设置

当你的后端服务启动并监听指定的端口后,如果前端无法调用后端服务,可能有以下几个原因:

  1. 网络连接问题:确保前端应用能够访问后端服务所在的服务器。检查服务器的网络配置、防火墙设置等,并确保前端应用能够正确访问服务器的IP地址和端口。

  2. 跨域资源共享(CORS)问题:如果前端应用和后端服务不在同一个域名下(例如,前端应用在http://localhost:3000,后端服务在http://localhost:5000),浏览器的同源策略可能导致请求被阻止。在后端服务中添加适当的CORS头信息,允许跨域请求。

    在Flask中添加CORS头信息的示例代码如下:

    from flask import Flask
    from flask_cors import CORS
    
    app = Flask(__name__)
    CORS(app)
    
    # 定义路由和处理逻辑...
    
    if __name__ == '__main__':
        app.run()
    

    使用flask_cors库中的CORS对象,可以为Flask应用添加CORS支持,允许跨域请求。

  3. 请求路径错误:确保前端应用使用正确的请求路径来调用后端服务。检查请求的URL和路由定义是否匹配。

  4. 请求方法不匹配:确保前端应用使用与后端服务路由定义相匹配的请求方法(GET、POST、PUT、DELETE等)。检查前端应用代码中的请求方法和后端服务中路由的定义是否一致。

  5. 服务未正确启动:确保后端服务已经正确启动,并且监听指定的端口。检查后端服务的日志输出,查看是否有错误或异常信息。

通过检查上述问题,你可以逐步定位并解决前端无法调用后端服务的原因。

四、接收数据的方式以及请求

方式一:放文件路径上

路径:/api/this_api?path=“****”
代码里:

path = request.args.get('path')

请求方式:curl -X POST “http://ip:port/api/this_api?path=*****”

方式二:form data

路径:/api/this_api
代码里:

path = request.form.get('path')

请求方式:curl -X POST -d “path=*****” http://ip:port/api/this_api

五、如果后端返回的数据前端接收不到

因为没有返回信息头校验权限

return 内容, 200, {"Access-Control-Allow-Credentials": "true"}

六、调用说明

  • 启动docker

docker run的时候带的选项要注意一下加上-p ip(外部访问的地址):5000(主机端口):5000(容器端口) 比如:

docker run -p 192.168.0.1:5000:5000 XXXX

注意以上docker命令不完整,完整的docker命令详细版请参考基于NVIDIA的dockerfile实操

  • 写服务时
if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5000)
  • 调用时

举个栗子:

curl -X POST "http://192.168.0.1:5000/api/this_api?path=*****"

七、返回中文编码问题

参考:https://blog.51cto.com/qzcsbj/5016619

如此返回即可:

res = {"ret": 0, "msg": "ok", "res":"我要返回中文"}
return json.dumps(res, ensure_ascii=False)
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Thomas_Cai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值