![](/img/trans.png)
[英]KeyError: 'view_class' When trying to add a route using app.route and api.add_resource in flask
[英]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()
即返回列表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()
提供一個端點,並將 map 提供給GET
http 請求:
api.add_resource(VehicleData, '/addvehicle/<string:name>', '/getvehicle/<string:name>', '/getallvehicles')
兩種不同方式之間的區別在於:
這是“本機” flask 方法,您可以使用它來包裝您的函數。
@app.routing('/endpoint')
這是 restfull_flask package 的一部分,它以不同於原生 flask 的方式做事。
api.add_resource(CLASSNAME, endpoint)
你可以用兩種方法做同樣的事情,但是如果你使用 rest_framework,那么你應該使用第二種方法:)
對於您問題的 rest,我相信您會在本文檔中找到答案: https://flask-restful.readthedocs.io/en/latest/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.