bottle .py: глобально изменить (переписать) путь запроса для тестирования веб-приложения? - PullRequest
0 голосов
/ 19 февраля 2020

Я настраиваю bottle .py с uWSGI и $ uwsgi --http :1024 --wsgi-file app.py. app.py содержит значение по умолчанию:

import bottle
application = bottle.default_app()

и множество декораторов маршрута и функций, таких как:

@bottle.route('/<A>/<B>')
def somedef():
    return bottle.template(...)

Временно обслуживается с http://example.com/secret_URL/ Это, конечно, заставляет <A> всегда анализироваться как «secret_URL».

Как можно изменить URL («переписать», убрать «secret_URL /») так, чтобы веб-приложение, то есть bottle не "видит" это?

Я нашел add_hook, но до сих пор не смог изменить путь запроса :

@bottle.hook('before_request')
def test():
    bottle.request.url = bottle.request.url.replace("secret_URL/","")

Причина становится понятной:

Класс Request охватывает среду WSGI и предоставляет полезные методы для анализа и доступа к данным формы, файлам cookie, загрузкам файлов и другим метаданным. Большинство атрибутов доступны только для чтения .

В документах также указывается:

Добавление новых атрибутов в запрос фактически добавляет их в среду словарь (как 'bottle .request.ext.'). Это рекомендуемый способ хранения и доступа к указанным в запросе c данным.

и

environment

Словарь обернутых WSGI-окружений. Это единственный настоящий атрибут. Все остальные атрибуты на самом деле являются свойствами только для чтения.

bottle.request.environ содержит, среди прочего, REQUEST_URI, PATH_INFO, bottle.raw_path, bottle.request, bottle.request.urlparts и некоторые объекты.

Какие из них могут быть записаны и должны быть написано для желаемого эффекта?

Это также ставит вопрос о том, как обрабатывать такие ссылки на стороне клиента HTML без изменения каждого href.

1 Ответ

0 голосов
/ 19 февраля 2020

Методом проб и ошибок:

@bottle.hook('before_request')
def test():
    bottle.request.environ['PATH_INFO'] = bottle.request.environ['PATH_INFO'].replace("secret_URL/","")

Для клиента:

  • относительные URL-адреса могут быть решением, но они могут сломать пользовательские копии (если браузер не заменит их) и приложению необходимо отслеживать уровень пути
  • URL-адреса, относящиеся к источнику, могут работать с <base> (ссылка ниже)

Связано:

Из https://bottlepy.org/docs/stable/recipes.html?highlight=cache#ignore -trailing-slashes :

или добавить промежуточное программное обеспечение WSGI, которое удаляет завершающие косые черты со всех URL-адресов:

class StripPathMiddleware(object):
  def __init__(self, app):
    self.app = app
  def __call__(self, e, h):
    e['PATH_INFO'] = e['PATH_INFO'].rstrip('/')
    return self.app(e,h)

app = bottle.app()
myapp = StripPathMiddleware(app)
bottle.run(app=myapp)
...