Google App Engine: как передать значение моему обработчику запросов? - PullRequest
0 голосов
/ 11 июля 2009

Абсолютный вопрос для начинающих:

У меня есть файл шаблона index.html, который выглядит следующим образом:

...
<FRAMESET ROWS="10%, *">
    <FRAME SRC="/top_frame">
    <FRAME SRC="{{ bottom_frame_url }}">
</FRAMESET>
...

И обработчик запроса для / top_frame, который выглядит так:

class TopFrame(webapp.RequestHandler):
    def get(self):
        ...
        bottom_frame_url = self.request.get('bottom_frame_url')
        ...

Как видите, я хотел бы иметь значение {{bottom_frame_url}}, которое использовалось для генерации моего index.html, но как передать это значение моему обработчику запросов TopFrame?

Спасибо!

Редактировать: Я выполняю index.html из другого обработчика запросов:

class MainPage(webapp.RequestHandler):
def get(self):
    ...
    bottom_frame_url = Site.qql("WHERE Category = :1 ORDER BY date DESC",category_name)
    ...
    args = {
      ...
      'bottom_frame_url': bottom_frame_url,
      ...
    }
    index_path = os.path.join(os.path.dirname(__file__), 'index.html')     
    self.response.out.write(template.render(index_path, args))

Но когда мы встречаемся с "/ top_frame" в шаблоне index.html, мой обработчик запросов TopFrame называется:

class TopFrame(webapp.RequestHandler):
def get(self):
    ...
    bottom_frame_url = self.request.get('bottom_frame_url')
    ...
    args = {
        'bottom_frame_url': bottom_frame_url
    }
    self.response.out.write(template.render('topframe.html', args))

Но self.request.get ('bottom_frame_url'), похоже, не читает никакого значения. Я знаю, что значение было установлено в моем шаблоне index.html, потому что, когда я отображаю страницу, нижний фрейм отображается как веб-сайт, который я установил, но в верхнем фрейме отображается обратный след, заканчивающийся следующей ошибкой:

NameError: global name 'bottom_frame_url' is not defined

Похоже, мне нужно добавить еще немного кода в мой шаблон index.html, чтобы явно передать значение bottom_frame_url в мой обработчик запросов TopFrame. Это правильно?

Другая вещь, о которой я могу подумать, это то, что, хотя я передаю bottom_frame_url в качестве аргумента для отображения index.html, когда я пытаюсь отобразить topframe.html, этот аргумент еще не доступен, потому что я не рендерил нижний кадр еще. Может ли это быть так?

1 Ответ

2 голосов
/ 12 июля 2009

Это параметр для вызова для отображения шаблона:

args = {
    bottom_frame_url: self.request.get('bottom_frame_url')
}
self.response.out.write(template.render('index.html', args))

См. http://code.google.com/appengine/docs/python/gettingstarted/templates.html

Редактировать: Извините, я неправильно понял вопрос. Я думал, что обработчик запросов, содержащий код, который вы показали, был обработчиком запросов для набора фреймов, но теперь я вижу, что это не так.

self.request.get может получить параметры только для текущего HTTP-запроса. Ваша настройка приведет к трем HTTP-запросам: один для набора фреймов (с любым URL, который является обработчиком), один для верхнего фрейма (с URL "/ top_frame") и один для нижнего фрейма (с URL, заданным bottom_frame_url параметр для первого HTTP-запроса). Второй и третий не обязательно будут происходить в таком порядке, и могут быть другие запросы на изображения и так далее. Но порядок не влияет на то, что видит обработчик верхнего кадра в self.request.get. Каждый запрос приводит к обращению к вашему app.yaml, запуску соответствующего скрипта Python и вызову соответствующего обработчика внутри него. Параметры каждого запроса - это только то, что установлено в строке запроса или параметрах POST для этого одного запроса.

Итак, если вы хотите, чтобы обработчик для верхнего фрейма видел bottom_frame_url через self.request.get, то вы должны добавить его в качестве параметра URL для запроса, который вызывает запуск обработчика верхнего фрейма. Измените шаблон на:

<FRAMESET ROWS="10%, *">
    <FRAME SRC="/top_frame?bottom_frame_url={{bottom_frame_url}}">
    <FRAME SRC="{{ bottom_frame_url }}">
</FRAMESET>

Теперь, когда браузер запрашивает верхний фрейм, вы сможете получить к нему доступ в этом обработчике с помощью self.request.get('bottom_frame_url'), как вы это делали в обработчике для набора фреймов.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...