Как реализовать запрос к ресурсу с помощью нескольких размеров в flask-restful?

#python-3.x #api #rest #flask-restful

#python-3.x #API #rest #flask-restful

Вопрос:

У меня, как у новичка, только что изучающего flask, есть несколько вопросов.

 class Users(Resource):
    decorators = [...,]

    def get(self, user_id):
        """
        GET /users : all uesers
        GET /users/1 : user where user_id = 1
        """
        # do query user by user_id
 

В реальном бизнесе редко запрашиваются пользователи на основе только одного измерения, вместо этого в большинстве случаев нам нужно запрашивать пользователей на основе нескольких измерений, таких как

  • запрашивать пользователей по имени
  • запрашивать пользователей по адресу электронной почты
  • запрашивайте пользователей по имени и create_time
  • Еще…

Мои вопросы:

Q1: насколько я знаю, в классе ресурсов flask-restful существует только метод on get, как поддерживать так много пользовательских функций запроса в одном методе get? многие из них похожи на это,

 def get(user_id=None, user_email=None, user_create_time=None, user_name=None):
    if user_id is None and user_email is None and user_create_time is None and user_name:
        query_user_by_name
    elif user_id is None and user_email and user_create_time is None and user_name is None:
        query_user_by_email
    ...
    
 

О … ХО …, это вонючий и длинный, действительно катастрофа!

Q2: Я также думаю, что использовать другой ресурс, например:

     class UserNameResource(Resource):
        def get(user_name):
            query_user_by_name

    class UserNameAndCreateTimeResource(Resource):
        def get(user_name, create_time):
            query_user_by_name_and create_time

    ...
 

Это также длинный, уродливый и не соответствует правилам именования restful, это мой второй вопрос.

Q3: используйте post methon вместо get, потому что restful не ограничен использованием метода POST для запроса ресурса. Если это нормально, то возникает мой третий вопрос: как отличить «создать ресурс» от «запросить ресурс» в методе post? Может быть, с моим ограниченным пониманием, вот так?

 class Users(Resource):
    def post(_method, **kwargs):
        if _method == 'QUERY':  # just a flag, could be others, as long as it's agreed in advance
            # query_resource, then query user by diffenent conditions
            
            if query_string in kwargs:
                # query_sring is a dict, could used to ORM query, 
                # so there is only one method for query users resouce, 
                # there is no more other query_users_funcs like 
                # query_user_by_name, query_user_id, 
                # query_user_by_name_and_email ...

               query_user_by_query_string

        if _method == 'CREATE':
            create_resource


 

Я новичок в flask и restful. Выше приведены мои запутанные проблемы и мои собственные мысли, которые могут быть очень незрелыми.
Добро пожаловать, чтобы обсудить и направить меня. Большое вам спасибо.

Комментарии:

1. Я рекомендую задавать ваши три вопроса как три отдельных вопроса.

2. @LajosArpad Спасибо, братан. На самом деле, это одна проблема. Я рассмотрел только три незрелых решения этой проблемы. Тем не менее, я думаю, что каждое решение не очень хорошее, поэтому здесь возникает 3 вопроса. Ожидайте, что кто-то может предложить идеальное решение, тогда этих трех проблем не существует.