Как я могу уничтожить веб-приложение Python на GAE рано после перенаправления?

Отказ от ответственности: абсолютно в новинку для Python происхождения PHP

Хорошо я использую Python на платформе веб-приложения Google App Engine with Google's.

У меня есть функция, которую я импортирую, поскольку она содержит вещи, которые должны быть обработаны на каждой странице.

def some_function(self):
    if data['user'].new_user and not self.request.path == '/main/new':
        self.redirect('/main/new')

Это хорошо работает, когда я называю его, но как я могу удостовериться, что приложение уничтожено после перенаправления. Я не хочу ничто больше обработка. Например, я сделаю это:

class Dashboard(webapp.RequestHandler):
    def get(self):
        some_function(self)
        #Continue with normal code here
        self.response.out.write('Some output here')

Я хочу удостовериться, что, после того как перенаправление сделано в some_function () (который хорошо работает), что ни в какой обработке не выполняют получение () функция после перенаправления, ни является "Некоторым выводом, здесь" произведенным.

На что я должен смотреть сделать эту всю работу правильно? Я не могу только выйти из сценария, потому что платформа веб-приложения должна работать.

Я понимаю, что более, чем вероятный просто выполняю в вещах полностью неправильный путь любой путь к приложению Python, таким образом, любое руководство было бы большой справкой. Надо надеяться, я объяснился правильно, и кто-то сможет указать на меня в правильном направлении.

Спасибо

8
задан Mike 8 June 2010 в 23:57
поделиться

3 ответа

Как насчет этого?

class Dashboard(webapp.RequestHandler):
    def some_function(self):
        if data['user'].new_user and not self.request.path == '/main/new':
            self.redirect('/main/new')
            return True
        else:
            return False
    def get(self):
        if not self.some_function():
            self.response.out.write('Some output here')

Для справки, если вам нужна some_function() в большом количестве RequestHandlers, было бы питонично сделать класс, который другие RequestHandlers могут подклассифицировать:

class BaseHandler(webapp.RequestHandler):
    def some_function(self):
        if data['user'].new_user and not self.request.path == '/main/new':
            self.redirect('/main/new')
            return False
        else:
            return True

class Dashboard(BaseHandler):
    def get(self):
        if not self.some_function():
            self.response.out.write('Some output here')
4
ответ дан 5 December 2019 в 20:14
поделиться

Я предлагаю возвращать булево значение из some_function() в зависимости от того, должен ли вызывающий продолжить выполнение или нет. Пример:

def some_function(self):
    if data['user'].new_user and not self.request.path == '/main/new':
        self.redirect('/main/new')
        return True
    return False

class Dashboard(webapp.RequestHandler):
    def get(self):
        if some_function(self):
            return
        #Continue with normal code here
        self.response.out.write('Some output here')

Есть также немного более сложная альтернатива, которая может быть полезна, если some_function() вложена на несколько уровней вглубь, или если у вас может быть много подобных функций. Идея: создайте исключение, указывающее на то, что вы хотите остановить обработку, и используйте подкласс webapp.RequestHandler, который просто перехватывает и игнорирует это исключение. Вот примерное представление о том, как это может выглядеть:

class RedirectException(Exception):
    """Raise this from any method on a MyRequestHandler object to redirect immediately."""
    def __init__(self, uri, permanent=False):
        self.uri = uri
        self.permanent = permanent

class RedirectRequestHandler(webapp.RequestHandler):
    def handle_exception(self, exception, debug_mode):
        if isinstance(exception, RedirectException):
            self.redirect(exception.uri, exception.permanent)
        else:
            super(MyRequestHandler, self).handle_exception(exception, debug_mode)

Это может немного облегчить работу с some_function() (и сделать другие обработчики запросов немного проще для чтения). Например:

def some_function(self):
    if data['user'].new_user and not self.request.path == '/main/new':
        raise RedirectException('/main/new')

class Dashboard(RedirectRequestHandler):
     # rest of the implementation is the same ...
4
ответ дан 5 December 2019 в 20:14
поделиться

Я знаю, что этот вопрос довольно старый, но я что-то делал сегодня и, естественно, попробовал другое решение, не задумываясь об этом, оно сработало нормально, но мне интересно, возникнет ли проблема с тем, чтобы сделать это таким образом.

Мое решение сейчас - просто вернуться, вернуть что-либо на самом деле, но я использую «return False», поскольку есть проблема с запросом как таковым, поэтому я печатаю ошибку или перенаправляю в другое место.

Возвращаясь, я уже установил вывод и т. Д., И я рано убираю функцию get () или post ().

Это нормальное решение?

0
ответ дан 5 December 2019 в 20:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: