Как заставить TurboGears обрабатывать "%2F" иначе, чем "/" при маршрутизации?

У меня есть простой скрипт TurboGears 2 с именем app.py:

#!/usr/bin/env python3

from wsgiref.simple_server import make_server
from tg import expose, TGController, AppConfig

class RootController(TGController):
    @expose()
    def lookup(self, name):
        return name

config = AppConfig(minimal=True, root_controller=RootController())

print("Serving on port 5000...")
httpd = make_server('', 5000, config.make_wsgi_app())
httpd.serve_forever()

Когда я запускаю app.py и захожу на http://localhost:5000/lookup/dave, я вижу "dave", как и ожидалось. Но когда я http://localhost:5000/lookup/dave%2Fdavid, я получаю ошибку 404 вместо "dave/david". Похоже, что TurboGears разделяет 'dave%2Fdavid' на два отдельных аргумента.

Как я могу заставить TurboGears учесть, что экранированный слеш отличается от слэша без экранирования?

2 ответа

Решение

Невозможно отличить / от %2F в стандартных приложениях WSGI. В 2008 году было много споров по этому поводу, но авторы спецификаций WSGI решили, что совместимость с CGI- которая не различает и то и другое - важнее, чем позволить программисту решить, как интерпретировать %2F,

В итоге я решил переоборудовать / в %252F при строительстве дорожек, а затем запустить replace('%2F', '/') на каждую переменную я получаю из пути. Это не очень элегантное решение, но, если авторы WSGI не изменят свое мнение, лучшего варианта я не увижу.

Для вашего конкретного примера вы можете обойти это, добавив *args к вашему поиску и присоедините имя, основанное на них:

class RootController(TGController):
    @expose()
    def lookup(self, *args):
        name = '/'.join(args)
        return name
Другие вопросы по тегам