文章目录
一、基于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请求方法,用于指定客户端对服务器端资源的操作方式。它们有以下区别:
-
GET:GET方法用于从服务器端获取资源,通常用于读取数据而不对数据进行修改。使用GET方法,客户端可以通过URL参数将数据传递给服务器,然后服务器返回所请求的资源。GET请求是幂等的,即多次相同的GET请求返回的结果应该是一样的,不应该对服务器端数据产生副作用。
-
POST:POST方法用于向服务器端提交数据,通常用于创建新资源或修改现有资源。使用POST方法,客户端可以通过请求体将数据传递给服务器,然后服务器根据请求体中的数据执行相应的操作。POST请求不是幂等的,即多次相同的POST请求可能会导致服务器端数据的变化或副作用。
-
DELETE:DELETE方法用于从服务器端删除资源。使用DELETE方法,客户端可以指示服务器删除指定的资源。DELETE请求应该是幂等的,即多次相同的DELETE请求对服务器端数据的状态应该是一致的,即使资源已经被删除。
三、跨域设置
当你的后端服务启动并监听指定的端口后,如果前端无法调用后端服务,可能有以下几个原因:
-
网络连接问题:确保前端应用能够访问后端服务所在的服务器。检查服务器的网络配置、防火墙设置等,并确保前端应用能够正确访问服务器的IP地址和端口。
-
跨域资源共享(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支持,允许跨域请求。 -
请求路径错误:确保前端应用使用正确的请求路径来调用后端服务。检查请求的URL和路由定义是否匹配。
-
请求方法不匹配:确保前端应用使用与后端服务路由定义相匹配的请求方法(GET、POST、PUT、DELETE等)。检查前端应用代码中的请求方法和后端服务中路由的定义是否一致。
-
服务未正确启动:确保后端服务已经正确启动,并且监听指定的端口。检查后端服务的日志输出,查看是否有错误或异常信息。
通过检查上述问题,你可以逐步定位并解决前端无法调用后端服务的原因。
四、接收数据的方式以及请求
方式一:放文件路径上
路径:/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)