Я начинаю разрабатывать свой первый RESTful API (с использованием flask-restful) и хотел бы иметь отдельные классы, чтобы сделать их как можно более модульными и масштабируемыми. Но я не могу понять, как сделать эти классы объектно-ориентированными так, как я думаю.
Страница промежуточного использования указывает, как иметь классы Foo, Bar и Baz,предположительно за пределами app.py, но требует знания того, какие add_resource()
вызовы должны быть сделаны. И выражение говорит о том, что это хорошо,
этот файл оказывается очень ценным как исчерпывающий список всех маршрутов и ресурсов в вашем API.
ВНа мой взгляд, это делает файл app.py монолитным, громоздким и трудно масштабируемым.
Я хотел бы сделать что-то вроде этого:
app.py
from flask import Flask
from flask_restful import Api, Resource
from rest_obj_a import RestObjA
from rest_obj_b import RestObjB
APP = Flask(__name__)
API = Api(APP)
def init():
rest_a = RestObjA(API)
rest_a.add_resources()
rest_b = RestObjB(API)
rest_b.add_resources()
init()
if __name__ == '__main__':
APP.run()
rest_obj_a.py
from flask_restful import Api, Resource
class RestObjA(Resource):
def __init__(self, restful_api):
self.API = restful_api
def add_resources(self):
self.API.add_resource(self, '/v1/obja/')
def get(self):
return {'hello': 'world (ObjectA -- object-oriented!!!!)'}
rest_obj_b.py
from flask_restful import Api, Resource
class RestObjB(Resource):
def __init__(self, restful_api):
self.API = restful_api
def add_resources(self):
self.API.add_resource(self, '/v1/objb/')
def get(self):
return {'hello': 'world (ObjectB -- object-oriented!!!!)'}
Другими словами, я неЯ не хочу знать и добавлять все ресурсы в app.py - два класса RestObjA и RestObjB должны знать свои собственные ресурсы и отвечать за их добавление.
Когда я это делаю, я получаю AttributeError:
AttributeError: 'RestObjA' object has no attribute '__name__'
Я получаю то же самое AttributeError
, если я пытаюсь инициализировать класс RestObj с приложением объекта Flask.
Как я могу переписать мои классы, чтобы получить желаемый одиночный вызовadd_resources () из app.py верхнего уровня? Или я не думаю об этом «питонически», так как я только недавно начал писать python после нескольких лет C ++ и C #?