Переопределить все ресурсы / ответы по умолчанию из Twisted.web - PullRequest
1 голос
/ 29 ноября 2010

Для сверхосновного http витого интерфейса. Как я могу убедиться, что html никогда не будет записан обратно, если я не скажу это.

Итак, мой / зоопарк URL ниже. Для любых трассировок или ответов «Нет такого ресурса» я хочу просто разорвать соединение или вернуть пустой ответ.

Я думаю, что это очень просто, но не могу понять это :) Я знаю, что мог бы сделать это, не имея своего конкретного дочернего пути, но хочу сделать его эффективным, просто хотел бы отбросить его как можно раньше. Может быть, не использовать Resource?

class HttpApi(resource.Resource):
    isLeaf = True
    def render_POST(self, request):
        return "post..."


application = service.Application("serv")

json_api = resource.Resource()
json_api.putChild("zoo", HttpApi())
web_site = server.Site(json_api)
internet.TCPServer(8001, web_site).setServiceParent(application)

1 Ответ

2 голосов
/ 29 ноября 2010

Сначала некоторые основы

Способ работы twisted.web:

Существует класс с именем Site , который является фабрикой HTTP. Это вызывается для каждого запроса. Фактически, вызывается функция getResourceFor для получения соответствующего ресурса, который будет обслуживать этот запрос. Этот класс сайта инициализируется с корневым ресурсом. А функция Site.getResourceFor вызывает resource.getChildForRequest на корневом ресурсе

Поток вызовов:

Site.getResourceFor -> resource.getChildForRequest (корневой ресурс)

Теперь пришло время взглянуть на getChildForRequest:

def getChildForRequest(resource, request):
    """
    Traverse resource tree to find who will handle the request.
    """
    while request.postpath and not resource.isLeaf:
        pathElement = request.postpath.pop(0)
        request.prepath.append(pathElement)
        resource = resource.getChildWithDefault(pathElement, request)
    return resource

Что происходит, когда ресурсы регистрируются в putChild (path), они становятся дочерними ресурсами этого ресурса. Пример:

root_resource
|
|------------ resource r1 (path = 'help')
|----resource r2 (path = 'login')  |
|                                  |----- resource r3 (path = 'registeration')
|                                  |----- resource r4 (path = 'deregistration')

Некоторые отражения:

  1. Теперь r1 будет запрашивать у сервера путь http: //../help/
  2. Теперь r3 будет запрашивать у сервера путь http: //../help/registration/
  3. Теперь r4 будет запрашивать у сервера путь http: //../help/deregistration/

Но

  1. r3 запросит сервер с путем http: //../help/registration/xxx/
  2. r3 запросит сервер с путем http: //../help/registration/yyy/

Для решения:

Вам нужно будет создать подкласс Site для

  1. проверить, совпадает ли путь с ресурсом, возвращенным с пустым pathElement, и только затем обрабатывать его или
  2. возвращает ресурс, который будет вашим обработчиком для обработки других аспектов

Вам нужно будет создать собственный ресурс

def render(self, request):
    request.setResponseCode(...)
    return ""
...