问题
How to stop execution after self.redirect in request initilization?
The method redirect does not stop/halt script execution. My initilizer method is called but the process continues into method AnswerHandler.get() but self.user is None because user is not logged.
class BaseRequestHandler(webapp.RequestHandler):
def __init__(self):
self.user = None
def initialize(self, request=None, response=None):
super(BaseRequestHandler,self).initialize(request, response)
user = users.get_current_user()
if not user:
return self.redirect(users.create_login_url(request.uri))
self.user = user
class AnswerHandler(BaseRequestHandler):
def get(self):
answer = Answer.next_answer_by_user(self.user)
self.write_template({"answer" : answer})
Tanks!
回答1:
I would go with this solution:
class BaseRequestHandler(webapp.RequestHandler):
def __init__(self):
self.user = None
def setAuthUser(self):
user = users.get_current_user()
if not user:
self.redirect(users.create_login_url(request.uri))
return False
self.user = user
return True
class AnswerHandler(BaseRequestHandler):
def get(self):
if not self.setAuthUser():
return
answer = Answer.next_answer_by_user(self.user)
self.write_template({"answer" : answer})
I understand that you would like to work around having to have 2 lines of code in every handler.
If you really want that, your other option would be:
class BaseRequestHandler(webapp.RequestHandler):
def __init__(self):
self.user = None
def get(self):
self.user = users.get_current_user()
if not self.user:
self.redirect(users.create_login_url(request.uri))
return
self.doGet()
def doGet(self):
raise Exception("doGet() needs to be implemented by a subclass.")
class AnswerHandler(BaseRequestHandler):
def doGet(self):
answer = Answer.next_answer_by_user(self.user)
self.write_template({"answer" : answer})
回答2:
With webapp2, there is an optional abort parameter:
redirect(uri, permanent=False, abort=False, code=None, body=None)
Taken from the api here
回答3:
I accomplished this by using the abort() method and using a custom exception handler, thus trapping the exception
来源:https://stackoverflow.com/questions/9231880/how-to-stop-execution-after-self-redirect