Есть ли эквивалент «флеш» сообщений Rails в GAE (python)? - PullRequest
4 голосов
/ 08 февраля 2011

В Ruby on Rails есть способ, которым вы можете установить сообщение, например flash[:notice] и flash[:error, которое пользователь увидит при следующей возможности. Это особенно полезно для таких вещей, как уведомление пользователя о невозможности входа в систему и т. Д., Когда они перенаправляются (например, обратно на страницу входа).

Есть ли канонический или распространенный способ добиться этого в Google App Engine (Python API)? (Предположим, что Django не используется.)

Ответы [ 5 ]

2 голосов
/ 08 февраля 2011

Каркас веб-приложения , простой каркас веб-приложения, который поставляется с GAE, не предоставляет ничего подобного.

Одна классная платформа, созданная специально для Google App Engine, которая предлагает Flash сообщений: Tipfy .
Взгляните на tipfy.ext.session модуль:

set_flash (данные, ключ = нет, бэкэнд = нет, ** kwargs)

Устанавливает флэш-сообщение. Флэш-сообщения удаляются при первом чтении.

1 голос
/ 05 ноября 2015

Да, посмотрите на эту функцию get_flashes(key='_flash')[source] в этом объекте: class webapp2_extras.sessions.SessionDict(container, data=None, new=False)[source]

Возвращает флэш-сообщение.Флэш-сообщения удаляются при первом чтении.Параметры: key - имя флэш-ключа, сохраненного в сеансе.По умолчанию это _flash.Возвращает:
Данные, хранящиеся во флэш-памяти, или пустой список.

1 голос
/ 12 декабря 2012

Что ж, webapp2 имеет:

def add_flash(self, value, level=None, key='_flash'):

и:

def get_flashes(self, key='_flash'):

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

def render_template(self, template, context=None):
    context = context or {}

    extra_context = {
        'uri_for': self.uri_for,
        'flashes': self.session.get_flashes(),
        'user': self.current_user,
    }

    # Only override extra context stuff if it's not set by the template:
    for key, value in extra_context.items():
        if key not in context:
            context[key] = value

    rendered = self.jinja2.render_template(template, **context)
    self.response.write(rendered)

И в вашем шаблоне используйте переменную «вспышки» для отображения ваших сообщений так, как вам нравится.

Документы здесь: http://code.google.com/p/webapp-improved/source/browse/webapp2_extras/sessions.py?r=9c1ec933be7c3d8c09c9bf801ebffe2deeb922e0#127

Живой пример здесь: https://simpleauth.appspot.com/

и источник примера: http://code.google.com/p/gae-simpleauth/source/browse/example/handlers.py

Кстати, отличная работа с simpleauth Alex!

1 голос
/ 11 февраля 2011

Мне нравится совет llazzaro относительно шаблонов.

Другая половина истории - возможность поддерживать флэш-сообщения между запросами.

  1. Если вы имеете дело ссеансы, вставьте сообщение в сеанс.

  2. Если у вас нет поддержки сеанса, вам придется создать использование cookie.

    Cookie caveats :

    • Удивительно сложно установить куки в GAE, потому что вы должны установить заголовок самостоятельно.(Исправьте это, если в GAE встроен API для установки файлов cookie; это вики сообщества).Остерегайтесь кодировки и других ограничений (точки с запятой указывают на конец значения cookie).Найдите хорошо написанную функцию, чтобы написать куки и использовать ее.
    • Помните об ограничениях длины файлов cookie браузера
    • Если вы отправляете предустановленное сообщение, рассмотрите возможность установки уникального идентификатора сообщения в файле cookie вместо фактического сообщения.У вас не будет проблем с длиной или кодировкой!
    • Если ваше сообщение переменное, один из возможных обходных путей аналогичен приведенному выше пункту, но вместо предустановленных сообщений при установке сообщения нажмите объект хранилища данных, напишитеего идентификатор для файла cookie, и при отображении сообщения найдите его в хранилище данных, а затем удалите файл cookie.сообщение из сеанса или cookie.
1 голос
/ 09 февраля 2011

Что вы думаете о расширении шаблона и настройке параметра "flash" для шаблона?

например, базовый шаблон:

<html... bla blah ...
<body ... bla blah
{% if flash %} {{flash}} {% endif %}
<!-- more html here -->
{% block content %}

your dynamic block here...

{% endblock %}

теперь на каждом шаблоне

{% extends "base_template.html" %}
{% block content %}
    {% if object %} success to edit : {{object.title }} {% endif %}
{% endblock %}

ваш обработчик должен передать flash param шаблону, он будет использоваться в базовом шаблоне.

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