基本上我想要实现的是检查用户是否已登录,如果不是,则应将其重定向到/ somepage。我试图通过创建一个扩展webapp.RequestHandler的类来实现它,稍后在代码中扩展该类。 (像cakephp中的beforeFilter) 如果事情不明确,我会解释它:)。
答案 0 :(得分:2)
您可以覆盖webapp请求中的dispatch()
方法,以便在super()
调用之前进行此检查:
http://webapp-improved.appspot.com/guide/handlers.html#overriding-dispatch
你也可以使用装饰器,正如其他答案所建议的那样,但这需要把它放在每个处理程序的头部(你可能想要也可能不想要)。如上所述覆盖dispatch()
允许您对所有页面执行一次。
如果您使用的是python2.5运行时,则需要在项目中安装webapp2并在代码中使用它。
答案 1 :(得分:1)
一种方法是实现类似于Django中用于用户身份验证的Python装饰器。例如login_required decorator。 stackoverflow上的This thread也是相关的。
答案 2 :(得分:1)
使用装饰器。
这里的文档: http://www.python.org/dev/peps/pep-0318/
这是一个删除请求路径上的斜杠的示例:
def removeslash(method):
"""Use this decorator to remove trailing slashes from the request path.
For example, a request to '/foo/' would redirect to '/foo' with this
decorator. Your request handler mapping should use a regular expression
like r'/foo/*' in conjunction with using the decorator.
"""
@functools.wraps(method)
def wrapper(self, *args, **kwargs):
if self.request.path.endswith("/"):
if self.request.method == "GET":
uri = self.request.path.rstrip("/")
if self.request.query: uri += "?" + self.request.query
self.redirect(uri)
return
return self.status(404)
return method(self, *args, **kwargs)
return wrapper
你就像使用它一样:
class MyHandler(RequestHandler):
@removeslash
def get(self):
# your code
答案 3 :(得分:1)
我所做的是创建一个类层次结构,让我使用模板方法设计模式,如:
class Page(webapp.RequestHandler):
def do_get(self):
''' override in derived classes to actually do something '''
pass
def get(self):
''' do NOT override this in derived classes '''
# do whatever you need to do to verify that the get() should succeed.
# Maybe redirect, show an error, whatever
self.do_get()
...围绕调用do_get()
模板方法函数的逻辑可能就像你需要的那样复杂,并且只要你的处理程序类都是从这个类派生的,它们就会得到自动纠正行为。
答案 4 :(得分:1)
我没有测试过这个,但这应该有效。只要您直接使用BasicHandler而不是webapp2,任何未登录用户的请求都将重定向。
class BasicHandler(webapp2.RequestHandler):
def __init__(self, request=None, response=None):
self.initialize(request, response)
self.user = users.get_current_user()
if not self.user:
self.redirect('/somepage')
class Page(BasicHandler):
def get(self):
# Do your work/render...
*编辑 将BasicHandler放在自己的.py文件中并导入