在 Python Flask 应用程序中使用 app.route() 和 api.add_resource() 配置端点有什么区别?
What is the difference in configuring the end points using app.route() and api.add_resource() in a Python Flask application?
我正在学习 Python-Flask,发现有两种方法可以在应用程序中创建端点。
1. app.routing(/endpoint)
2. api.add_resource(CLASSNAME, endpoint)
使用 app.routing()
我们可以在方法上添加一个端点并调用它。使用 api.add_resource()
我们需要注册 class 名称和终点。
如果您使用 api.add_resource()
,我已经看到方法名称被指定为 get() & put()
例如:
app = Flask(__name__)
api = Api(app)
vehicles = []
class VehicleData(Resource):
parser = reqparse.RequestParser()
parser.add_argument('vehicle', type=str, required=True, help='name cannot be empty')
parser.add_argument('type', type=str, required=True, help='vehicle type cannot be empty')
parser.add_argument('wheels', type=int, required=True, help='number of wheels cannot be empty')
parser.add_argument('suv', type=bool, required=False, help='SUV or not can be empty')
def get(self, name):
vehicle = next(filter(lambda x: x['name'] == name, vehicles), None)
return {'vehicle': vehicle}, 200 if vehicle else 404
def post(self, name):
# data = request.get_json()
# sport.append({'sportname': data['sport_name'], 'team_size':data['team_size'], 'popularity':data['popularity']})
if next(filter(lambda x: x['name'] == name, vehicles), None) is not None:
print("in the IF BLOCK")
return {'message': 'The vehicle {n} already exists in the database'.format(n=name)}, 404
v_data = VehicleData.parser.parse_args()
vehicle = {'name': name, 'type':v_data['type'], 'vehicle': v_data['vehicle'], 'suv': v_data['suv'], 'wheels': v_data['wheels']}
vehicles.append(vehicle)
return vehicle, 201
def getallvehicles(self):
return {'vehicles': vehicles}
api.add_resource(VehicleData, '/addvehicle/<string:name>', '/getvehicle/<string:name>')
app.run(port=5000, debug=True)
如果我通过 GET http 调用提交 API http://127.0.0.1:5000/getvehicle
,我将按照代码中给出的逻辑正确获取数据。在代码中,我只有一个 GET & POST 方法。因此,当我使用 GET 请求提交 http://127.0.0.1:5000/getvehicle/<name>
时,Flask 会自动调用 get()
。
如果我的方法名称不是 get()/post()/put()
怎么办?
例如,如果我有一个方法 getallvehicles()
returns 所有车辆,即 returns 列表 vehicles
,我如何在 api.register()
中注册它?
例如,我试过这个:
api.add_resource(VehicleData, '/addvehicle/<string:name>', '/getvehicle/<string:name>', '/getallvehicles')
并提交了带有 GET 请求的 API 调用 'http://127.0.0.1:5000/getallvehicles`,我遇到了一个错误:
File "/Users/bobby/PyCharmProjects/FlaskAPI/venv/lib/python3.7/site-packages/flask_restful/__init__.py", line 583, in dispatch_request
resp = meth(*args, **kwargs)
TypeError: get() missing 1 required positional argument: 'name'
谁能告诉我我在这里犯了什么错误以及如何在下面的行中为 getallvehicles()
提供端点并将其映射到 GET
http 请求:
api.add_resource(VehicleData, '/addvehicle/<string:name>', '/getvehicle/<string:name>', '/getallvehicles')
两种不同方式的区别在于:
这是一种“原生”flask 方法,您可以使用它来包装您的函数。
@app.routing('/endpoint')
这个是 restfull_flask 包的一部分,它以不同于原生 flask 的方式做事。
api.add_resource(CLASSNAME, endpoint)
你可以用两种方法做同样的事情,但如果你使用 rest_framework,那么你应该使用第二种方法:)
对于您剩下的问题,我相信您会在本文档中找到答案:
https://flask-restful.readthedocs.io/en/latest/
我正在学习 Python-Flask,发现有两种方法可以在应用程序中创建端点。
1. app.routing(/endpoint)
2. api.add_resource(CLASSNAME, endpoint)
使用 app.routing()
我们可以在方法上添加一个端点并调用它。使用 api.add_resource()
我们需要注册 class 名称和终点。
如果您使用 api.add_resource()
,我已经看到方法名称被指定为 get() & put()
例如:
app = Flask(__name__)
api = Api(app)
vehicles = []
class VehicleData(Resource):
parser = reqparse.RequestParser()
parser.add_argument('vehicle', type=str, required=True, help='name cannot be empty')
parser.add_argument('type', type=str, required=True, help='vehicle type cannot be empty')
parser.add_argument('wheels', type=int, required=True, help='number of wheels cannot be empty')
parser.add_argument('suv', type=bool, required=False, help='SUV or not can be empty')
def get(self, name):
vehicle = next(filter(lambda x: x['name'] == name, vehicles), None)
return {'vehicle': vehicle}, 200 if vehicle else 404
def post(self, name):
# data = request.get_json()
# sport.append({'sportname': data['sport_name'], 'team_size':data['team_size'], 'popularity':data['popularity']})
if next(filter(lambda x: x['name'] == name, vehicles), None) is not None:
print("in the IF BLOCK")
return {'message': 'The vehicle {n} already exists in the database'.format(n=name)}, 404
v_data = VehicleData.parser.parse_args()
vehicle = {'name': name, 'type':v_data['type'], 'vehicle': v_data['vehicle'], 'suv': v_data['suv'], 'wheels': v_data['wheels']}
vehicles.append(vehicle)
return vehicle, 201
def getallvehicles(self):
return {'vehicles': vehicles}
api.add_resource(VehicleData, '/addvehicle/<string:name>', '/getvehicle/<string:name>')
app.run(port=5000, debug=True)
如果我通过 GET http 调用提交 API http://127.0.0.1:5000/getvehicle
,我将按照代码中给出的逻辑正确获取数据。在代码中,我只有一个 GET & POST 方法。因此,当我使用 GET 请求提交 http://127.0.0.1:5000/getvehicle/<name>
时,Flask 会自动调用 get()
。
如果我的方法名称不是 get()/post()/put()
怎么办?
例如,如果我有一个方法 getallvehicles()
returns 所有车辆,即 returns 列表 vehicles
,我如何在 api.register()
中注册它?
例如,我试过这个:
api.add_resource(VehicleData, '/addvehicle/<string:name>', '/getvehicle/<string:name>', '/getallvehicles')
并提交了带有 GET 请求的 API 调用 'http://127.0.0.1:5000/getallvehicles`,我遇到了一个错误:
File "/Users/bobby/PyCharmProjects/FlaskAPI/venv/lib/python3.7/site-packages/flask_restful/__init__.py", line 583, in dispatch_request
resp = meth(*args, **kwargs)
TypeError: get() missing 1 required positional argument: 'name'
谁能告诉我我在这里犯了什么错误以及如何在下面的行中为 getallvehicles()
提供端点并将其映射到 GET
http 请求:
api.add_resource(VehicleData, '/addvehicle/<string:name>', '/getvehicle/<string:name>', '/getallvehicles')
两种不同方式的区别在于:
这是一种“原生”flask 方法,您可以使用它来包装您的函数。
@app.routing('/endpoint')
这个是 restfull_flask 包的一部分,它以不同于原生 flask 的方式做事。
api.add_resource(CLASSNAME, endpoint)
你可以用两种方法做同样的事情,但如果你使用 rest_framework,那么你应该使用第二种方法:)
对于您剩下的问题,我相信您会在本文档中找到答案: https://flask-restful.readthedocs.io/en/latest/