Отказ от ответственности: абсолютно в новинку для 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, таким образом, любое руководство было бы большой справкой. Надо надеяться, я объяснился правильно, и кто-то сможет указать на меня в правильном направлении.
Спасибо
Как насчет этого?
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')
Я предлагаю возвращать булево значение из 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 ...
Я знаю, что этот вопрос довольно старый, но я что-то делал сегодня и, естественно, попробовал другое решение, не задумываясь об этом, оно сработало нормально, но мне интересно, возникнет ли проблема с тем, чтобы сделать это таким образом.
Мое решение сейчас - просто вернуться, вернуть что-либо на самом деле, но я использую «return False», поскольку есть проблема с запросом как таковым, поэтому я печатаю ошибку или перенаправляю в другое место.
Возвращаясь, я уже установил вывод и т. Д., И я рано убираю функцию get () или post ().
Это нормальное решение?