2012-11-29 3 views
2

Я работаю над REST API, который реагирует на запросы GET и PUT.Обработка всех ресурсов на витой веб-сервере

По ряду причин этот API будет написан на Python и Twisted. Тем не менее, скрученная сеть, похоже, является ресурсом, основанным на всех примерах, которые я нашел.

Это, на мой взгляд, я должен настроить отдельные ресурсы и определить обработчики для GET и POST для каждого.

Что я хочу сделать, это настроить обработчики GET и POST, которые называются запросами любого ресурса.

В псевдокоде:

import *the appropriate modules* 

class Callback(resource.Resource): 
    def render_GET(self,request): 
     print "GET!" 
    def render_POST(self,request): 
     print "POST!" 

def main(): 
    *magic* 
    reactor.listenTCP(settings.port,factory) 
    reactor.run() 
    print "Started callback server on port %d" % settings.port 

if __name__ == '__main__': 
    main() 

К сожалению, мой интернет-поиск примеров не подвернулся никакого способа сделать это.

Любые вводные данные о том, как либо установить ресурс «всякий», либо использовать разные типы реакторов для обработки этого, наиболее ценятся.

ответ

6

Этот вопрос (и, возможно, другие, что у вас есть), отвечают в серии документации Twisted Web in 60 Seconds.

В частности, вы спрашиваете о так называемой «динамической отправке URL-адресов» в Twisted Web. Похоже, вы уже нашли API Resource.putChild, который позволяет обрабатывать статические URL-адреса. При динамической отправке URL-адресов вам не нужно настраивать обработчики для всех URL-адресов, которые вы хотите обработать заранее. Вместо этого вы переопределяете getChild, чтобы реализовать свою собственную логику для создания ресурса по требованию.

См dynamic dispatch документа для получения более подробной информации, но суть:

class Calendar(Resource): 
    def getChild(self, name, request): 
     return YearPage(int(name)) 

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

+0

Perfect. Спасибо! – 0x90

+2

У вас есть рекомендации по продвижению более 1 ресурса? Например, я пытаюсь выяснить способ не только «календарь/2013», но также «календарь/2013/месяц/июль/день/1». В основном пытается понять, как структурировать ресурсы и вспомогательные ресурсы. –

+0

Это старый вопрос, но мне удалось сгладить дерево каталогов, получив getChild recurse. Поэтому моя страница 'Resource' имеет функцию' getChild', которая выглядит так: 'def getChild (self, name, request):' 'self.name + =" /% s "% name'' return self' Это просто вызывает тот же класс рекурсивно и обновляет член 'self.name' до тех пор, пока он не достигнет конца дочернего пути, а затем в этот момент вызовет' render_GET'. Там должно быть * возможно, быть некоторой защитой для продувки стека, но это может быть до пользователя. 'return self' –

Смежные вопросы