Я только начал работать с Flask после разработки API отдыха в django. Я хочу начать использовать Flask и создать API JSONRPC. Я использую python 3.4, и мне интересно, как (и если) я могу реализовать API с использованием классов вместо того, как описано в руководствах, которые я видел до сих пор.

Например:

@jsonrpc.method('app.index')
def index(a):
    return 'hello {a}'.format(a=a)

Могу я сделать что-нибудь вроде:

class Index()
   def mymethod(self, a)
       return 'hello {a}'.format(a=a)

Может ли кто-нибудь указать мне правильное направление, если такая конструкция вообще возможна?

Дело в том, что я хочу реализовать аутентификацию, например, для всех моих конечных точек API, и при использовании классов я мог бы создать класс аутентификации и использовать

class Index(Auth, SomeOtherBehaviour):
   def mymethod(self,a)
        return 'a'

Правильно ли я смотрю на это (исходя из Django, это кажется знакомым) или есть другой / лучший способ, как это сделать во Flask?

1
Robin van Leeuwen 18 Фев 2016 в 21:18

2 ответа

Лучший ответ

Это зависит от цели API.

Если вы пытаетесь разрешить клиентам:
- Получить информацию об объекте
- Создать и сохранить новый объект
- Обновить старый объект
- Удалить существующий объект

Затем вы создаете API (ресурс = экземпляр объекта) на основе ресурсов, и вы должны использовать RESTful api, например flask-Restful. Если вы создаете веб-сайт и пытаетесь организовать эти ресурсы, хранить их в базе данных, отображать их и взаимодействовать с ними через API, вам следует использовать Django, потому что все эти проблемы уже решены с помощью ORM Django.

Если вы пытаетесь разрешить клиентам:
- Дистанционная передача функций, таких как команды, серверу на основе параметров

Затем вы создаете RPC API и должны использовать что-то вроде flask-jsonrpc.

Удачи с проектом.

2
spencer.pinegar 1 Авг 2018 в 16:05

Взгляните на Flask-Restful. Он предоставляет вам представления на основе классов, которые связаны с HTTP-глаголами, и избавляет от проблем с маршрутизацией. Фреймворк обеспечивает вышеупомянутую маршрутизацию команд, проверку ввода и маршалинг JSON.

class FooResource(Resource):  
     def get(self, name):  
         return 'hello {0}'.format(name)

     def post(self):
         # save data or pass data to DjangoAPI
         return 201

РЕДАКТИРОВАТЬ: Вы можете использовать конечные точки на основе классов Flask-Restful и просто использовать их в качестве конечных точек RPC, если вас действительно интересует функция на основе классов (я не знаком с Django), вы также можете посмотреть blueprints. Flask-Restful просто дает вам возможность написать RESTful API, но не делает вас.

Что касается аутентификации, то, что мы сделали в нашем приложении Flask, - это написали декоратор, который проверяет токен аутентификации и проверяет его при поступлении запроса. Итак, что-то вроде этого:

def authenticate(func=None, *, roles=None):
    if func is None:
        return partial(authenticate, roles=roles)

    @wraps(func)
    def wrapper(*args, **kwargs):
        try:
            if authorization_check():
                result = func(*args, **kwargs)
            else:
                result = flask.abort(401)
        except ResourceNotFoundException:
            result = flask.abort(404)

        return result
    return wrapper

И тогда вашей конечной точке просто нужен декоратор @authenticate.

1
mmcclannahan 20 Фев 2016 в 22:37