Какие символы TurboGears заменяет в URL?
У меня есть простой скрипт 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 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, я вижу "Hello world!" как и ожидалось. Но эти URL также работают:
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/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
И так далее...
Какой полный список символов можно заменить подчеркиванием в URL-адресах TurboGears?
Кроме того, можно ли ограничить эту функцию только заменой определенных символов? В идеале я хочу, чтобы 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)
В случае, если у вас есть потребности в нестандартной маршрутизации, я предлагаю вам рассмотреть https://github.com/TurboGears/tgext.routes которая может помочь вам в более сложных случаях через @route
декоратор.