Как создать объектно-ориентированные классы отдыха - PullRequest
0 голосов
/ 09 октября 2019

Я начинаю разрабатывать свой первый 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 #?

...