Webapp2 извлекает именованные параметры из URL-адреса маршрута (без запроса, только URL-адрес)

Я использую маршрут, подобный следующему, в моем приложении:

Route(r'/thing/<some_id>/foo', handler=ThingFoo, name="thing-foo")

Это используется для создания URL-адреса с использованием uri_for('thing-foo', some_id="something"), который возвращается пользователю, которого они хранят. Затем в другом запросе пользователь отправляет URL-адрес, возвращенный ему ранее, где его необходимо проанализировать.

Я хотел бы извлечь значение шаблона <some_id> из предоставленного URL-адреса аналогично тому, как это делает маршрутизатор, чтобы передать значение методам get/post RequestHandler, но документации по этому вопросу, похоже, не хватает.

Есть ли что-то вроде следующего?

route, some_id = webapp2.extract_uri(the_url)

(Конечно, я мог бы извлечь значение напрямую, используя регулярное выражение, но это не кажется очень СУХИМ).

Вот пример того, что я хочу сделать.

def image_url(request, image_blob_key):
    if image_blob_key:
        return request.url_for('image', resource=image_blob_key, _full=True)
    else:
        return None

def blob_key_from_image_url(image_url):
    # Do something here to calculate the blob_key from the URL.
    return blob_key

В одной части моего приложения image_url вычисляется из blob_key и передается пользователю. Позже, если они (например) захотят удалить изображение, они передают URL-адрес обратно в запросе POST, и я хочу извлечь из него ключ blob_key, чтобы я мог его удалить.


person Dylan    schedule 01.11.2012    source источник


Ответы (2)


Возможно, что-то вроде этого сработает для вас:

import webapp2

# somewhere in a request handler:
route = self.app.router.build_routes.get('my-route-name')
match = route.regex.match(the_url)
args, kwargs = webapp2._get_route_variables(match, route.defaults.copy())

# do something with args and kwargs, e.g. 
# thing = kwargs['thing-foo']

Исходный код: http://webapp-improved.appspot.com/_modules/webapp2.html#Route

Честно говоря, я бы просто передал blob_key в шаблон, где пользователи могут удалить изображение, чтобы я мог заранее создать URL-адрес, например.

uri_for('delete-image', image_key=some_blob_key)
person alex    schedule 02.11.2012
comment
Спасибо, это именно то, что я искал. Передача клиенту как URL-адреса для получения изображения, так и URL-адреса для удаления не идеальна - я бы предпочел иметь одну строку идентификатора, которая передается для извлечения и удаления изображения на клиенте (приложение для iOS). Я предполагаю, что лучшим решением было бы использовать HTTP-метод DELETE (вместо GET), но это, вероятно, потребует некоторой возни с маршрутами и так далее. Я не уверен, что webapp2 поддерживает PUT и DELETE из коробки. - person Dylan; 04.11.2012
comment
FWIW webapp2 поддерживает методы HTTP: webapp-improved.appspot.com /guide/ А на стороне обработчика вы просто делаете def put(self, ...) или def delete(self, ...) - person alex; 04.11.2012
comment
Ах, извините, я думаю, что я понял это сейчас. Вы хотите иметь совпадение с одним шаблоном URL, но запускать другой код, например. put и delete. Да, я не думаю, что это будет работать из коробки. В любом случае, рад, что вышеизложенное сработало для вас. - person alex; 04.11.2012

Обычно я использую этот стиль.

Маршрутизатор:

Route('/auth/<provider>/call', handler='handlers.AuthHandler:meo', name='meo')

И класс обработчика

class AuthHandler(webapp2.RequestHandler):
  def meo(self, provider=None):
    self.response.write(provider)
person nguyên    schedule 01.11.2012
comment
Однако это работает только для реальных HTTP-запросов. Я не хочу вызывать обработчик запроса для запроса, просто извлекаю параметры из URL-адреса. Извините, если это было непонятно. - person Dylan; 01.11.2012