2016-11-18 3 views
1

У меня есть простой Turbogears 2 сценария, названный app.py: "Привет, мир!"Какие символы TurboGears заменяют в URL?

#!/usr/bin/env python3 

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

class RootController(TGController): 
    @expose() 
    def all__things(self): 
     return "Hello world!" 

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/all__things, я вижу как и ожидалось. Но эти URL-адреса также работают:

http://localhost:5000/all--things 
http://localhost:5000/[email protected]@things 
http://localhost:5000/all$$things 
http://localhost:5000/all++things 
http://localhost:5000/all..things 
http://localhost:5000/all,,things 

, а также комбинации:

http://localhost:5000/all-_things 
http://localhost:5000/all_-things 
http://localhost:5000/[email protected] 
http://localhost:5000/[email protected] 
http://localhost:5000/[email protected] 
http://localhost:5000/[email protected]$things 

Et Cetera ...

Что такое полный список символов, которые могут быть заменены подчеркиванием в TurboGears URL-адрес?

Кроме того, может ли эта функция ограничиваться только заменой определенных символов? В идеале я хочу, чтобы URL-адреса с тире (http://localhost:5000/all--things) работали, а URL-адреса с символами подчеркивания (http://localhost:5000/all__things) или любые другие странные символы, которые не работают.

ответ

1

Это управляется path_translator, который может быть сконфигурирован с помощью опции dispatch_path_translator в app_cfg.py. Его можно отключить, передав None или предоставив пользовательскую функцию.

Любая предоставленная функция получит часть обрабатываемого пути и должна вернуть ее нормализованную.

переводчик Путь по умолчанию основан на string.punctuation (см https://github.com/python/cpython/blob/c30098c8c6014f3340a369a31df9c74bdbacc269/Lib/string.py#L31)

В случае, если у вас есть собственные потребности маршрутизации, которые я предлагаю вам рассмотреть https://github.com/TurboGears/tgext.routes, которые могут помочь вам в более сложных случаях через @route декоратора.

+0

Установка 'config.dispatch_path_translator = False' вызывает сбой программы, но работает' config.dispatch_path_translator = None'. В конце концов я решил: 'config.dispatch_path_translator = lambda path_piece: path_piece.replace ('-', '_'), если нет '_' в path_piece else ''' Спасибо за помощь. –

+0

Ах да, извините, это правда/нет/функция Я написал False рефлектором как противоположность True: D Обновленный ответ – amol