基本上我试图实现的是检查用户是否登录,如果他不是,他应该被重定向到/ somepage。我试图通过创建一个扩展webapp.RequestHandler的类来实现,稍后在代码中扩展该类。 (类似cakephp中的beforeFilter) 如果有什么不清楚的话我会解释它:)。如何在调用get()和post()之前做一些代码?
2
A
回答
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
1
一种方法是实现一个类似于Django中用于用户身份验证的Python装饰器。例如login_required decorator。在stackoverflow上的This thread也是相关的。
2
您可以覆盖在Web应用程序请求dispatch()
方法super()
调用之前把这个检查:
http://webapp-improved.appspot.com/guide/handlers.html#overriding-dispatch
你也可以使用一个装饰,其他答案的建议,但这需要把它在每个处理程序的头部(您可能需要或可能不需要)。如上所述覆盖dispatch()
可让您为所有页面执行一次。
如果您使用的是python2.5运行时,则需要在您的项目中安装webapp2并在代码中使用它。
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()
模板法功能的逻辑可以作为复杂,只要你处理类都是从这个类派生的,他们将得到正确的行为自动。
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文件,并导入
相关问题
- 1. 如何在$ .get()被提交之前做些什么?
- 2. 如何在applicationDidFinishLaunching之前做些什么
- 3. PHP形式,做GET和POST
- 4. 在创建之后和破坏之前做一些事情
- 5. NotificationListenerService在Application.onCreate代码之前调用
- 6. Facebook使用GET代替POST调用Google App Engine代码
- 7. 如何在编译之前调试一个cython代码?
- 8. 如何在Astersik抢通话文件之前做一些操作?
- 9. jQuery.post()正在调用GET和POST
- 10. 如何在做颠覆提交之前清理源代码?
- 11. 如何在使用传统ASP发布表单之前执行一些代码
- 12. web2py:如何在调用控制器之前执行代码?
- 13. 如何在我的扫描仪之前调用GUI代码?
- 14. 如何做HTTPS post/get in java。
- 15. 如何让下面的代码等待和api调用在恢复之前做好准备?
- 16. 在OOP之前如何管理代码?
- 17. 在Perl脚本结束之前总是执行一些代码
- 18. 为什么我的一些代码在其他代码之前运行?
- 19. 如何在flask socket.io服务器启动之前执行一些代码?
- 20. 如何在VC中进入main()例程之前执行一些代码?
- 21. CasperJs在开始之前做些什么?
- 22. 如何在nanoc的网站编译之前/之后调用我的代码?
- 23. 调试一些PHP代码
- 24. POST和GET方法在同一个文件中调用函数
- 25. GET和POST在PDO
- 26. GET和POST在AJAX
- 27. Python请求POST做GET?
- 28. 如何在每个元音之前添加一些文字? (代码在第一个之后停止)
- 29. jQuery:为什么$ .post做一个GET而不是一个POST
- 30. jQuery重定向后做一些代码
我也忘了提,我使用Python 2.5。 – Vizualni 2012-04-12 18:24:10
已更新为python2.5。 – mjibson 2012-04-12 18:42:35