AppEngine элегантный способ обрабатывать подобные запросы - PullRequest
2 голосов
/ 29 августа 2011

Я делаю сервер, который позволяет клиентам загружать и загружать данные разных моделей.Есть ли какой-нибудь элегантный способ обработки запросов?

Точнее, я не хочу делать что-то подобное,

app = webapp.WSGIApplication([
    ('/my_upload_and_download_url/ModelA/(.*)', MyRequestHandlerForA),
    ('/my_upload_and_download_url/ModelB/(.*)', MyRequestHandlerForB),
    ('/my_upload_and_download_url/ModelC/(.*)', MyRequestHandlerForC),
])
run_wsgi_app(app)

, поскольку то, что я делаю внутри обработчика, будет одинаковым,Например,

class MyRequestHandlerForX(webapp.RequestHandler):
    def get(self, key=None):
        # return the instance with the designated key
    def post(self, key=None):
        # create/get the model instance
        # iterate through the property list of the instance and set the values

единственная разница между обработчиками заключается в создании экземпляра для различных моделей .URL-адреса одинаковы, и обработчики почти одинаковы.

Я проверил этот пост о запросах перенаправления на другие обработчики, и я также прочитал некоторые методы для создания экземпляра с помощьюназвание класса;но я думаю, что ни один из них не является хорошим.

У кого-нибудь есть хорошее решение?

ps Это мой первый пост здесь.Если есть что-то неуместное, пожалуйста, скажите мне, спасибо.

Ответы [ 3 ]

5 голосов
/ 30 августа 2011

То, как вы это сделаете, во многом зависит от деталей вашего кода в обработчике запросов. Вы можете сделать довольно общий, как это:

class ModelHandler(webapp.RequestHandler):
  def get(self, kind, key):
    model = db.class_for_kind(kind)
    instance = model.get(key)
    # Do something with the instance - eg, print it out

  def post(self, kind, key):
    model = db.class_for_kind(kind)
    instance = model.create_from_request(self.request)

application = webapp.WSGIApplication([
    ('/foo/([^/]+)/([^/]+)', ModelHandler),
])

def main():
  run_wsgi_app(application)

if __name__ == '__main__':
  main()

Это предполагает, что вы определяете метод класса 'create_from_request' для каждого класса модели; вы, вероятно, не хотите делать это именно так, так как он тесно связывает определения моделей с формами, используемыми для их ввода; Вместо этого вы, вероятно, захотите сохранить отображение имени или класса вида в функцию-обработчик или выполнить ваши формы и создание полностью автоматически, отражая свойства класса. Поскольку вы не указали, в чем суть этого, в чем вы не уверены, более сложно быть конкретным.

Также обратите внимание на включение main() и других шаблонов выше; хотя он будет работать так, как вы его вставили, добавление основного существенно более эффективно, поскольку позволяет среде выполнения App Engine избегать оценки вашего модуля при каждом запросе.

0 голосов
/ 29 августа 2011

Вы можете разобрать путь URL и посмотреть, как это:

import urlparse

model_lookup = {'ModelA':ModelA,'ModelB':ModelB, 'ModelC':ModelC}

class MyRequestHandler(webapp.RequestHandler):
    def get(self):
        url = urlparse.urlparse(self.request.uri)
        path_model = url.path.replace('/my_upload_and_download_url/','')
        model = model_lookup[path_model]
        ...

Что позволяет использовать один и тот же класс для каждого пути:

app = webapp.WSGIApplication([
    ('/my_upload_and_download_url/ModelA/(.*)', MyRequestHandler),
    ('/my_upload_and_download_url/ModelB/(.*)', MyRequestHandler),
    ('/my_upload_and_download_url/ModelC/(.*)', MyRequestHandler),
])
run_wsgi_app(app)
0 голосов
/ 29 августа 2011

В вашем случае, вероятно, я бы просто использовал все по одному и тому же пути URL и поместил бы специфику в параметры GET, например /my_upload_and_download_url?model=modelA.

Вы также можете использовать webapp2 (http://webapp -improved.appspot.com / guide / app.html ), в котором есть поддержка маршрутизации URL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...