基本上我想要实现的是检查用户是否登录,如果他没有登录,他将被重定向到/somepage。我试图通过创建一个扩展 webapp.RequestHandler 的类来实现它,然后在代码中扩展该类。(类似于 cakephp 中的 beforeFilter)如果不清楚,我会解释它:)。
5 回答
您可以覆盖dispatch()
webapp 请求中的方法,以便在调用之前进行此检查super()
:
http://webapp-improved.appspot.com/guide/handlers.html#overriding-dispatch
正如其他答案所建议的那样,您也可以使用装饰器,但这需要将它放在每个处理程序的头部(您可能想要也可能不想要)。dispatch()
如上所述的覆盖允许您对所有页面执行一次。
如果你使用的是 python2.5 运行时,你需要在你的项目中安装 webapp2 并在你的代码中使用它。
一种方法是实现一个类似于 Django 中用于用户身份验证的 Python 装饰器。例如login_required 装饰器。stackoverflow 上的这个线程也是相关的。
使用装饰器。
这里的文档: 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
我所做的是创建一个类层次结构,让我可以使用模板方法设计模式,例如:
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()
模板方法函数的逻辑可以根据您的需要复杂,只要您的处理程序类都是从此类派生的,它们就会自动获得正确的行为。
我没有对此进行测试,但这应该可以。只要您直接使用 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...
*edit 将 BasicHandler 放在它自己的 .py 文件中并导入