我在Python Google App Engine站点上创建管理页面时遇到问题。我认为答案应该很简单,但老实说,我一直在试图理解类是如何从其他类继承的,或者是如何使用函数包装其他函数的,而我似乎无法很好地理解它。你知道吗
基本上,我的站点有两种页面:主页,然后是一些允许用户执行管理操作的页面。任何人都可以在不登录的情况下看到主页。其他页面是管理员的。唯一拥有帐户的用户是管理员,所以我设置了webapp2会话,只要
self.sessions.get('username')
返回足以允许访问其他页面的内容。你知道吗
以下是我的处理程序:
class BaseHandler(webapp2.RequestHandler):
def write(self, *a, **kw):
self.response.out.write(*a, **kw)
def render(self, template, **kw):
self.response.out.write(render_str(template, **kw))
def dispatch(self):
# Get a session store for this request.
self.session_store = sessions.get_store(request=self.request)
try:
# Dispatch the request.
webapp2.RequestHandler.dispatch(self)
finally:
# Save all sessions.
self.session_store.save_sessions(self.response)
@webapp2.cached_property
def session(self):
# Returns a session using the default cookie key.
return self.session_store.get_session()
class MainHandler(BaseHandler):
def get(self):
animals = Animal.query().fetch(100)
self.render('index.html',animals=animals)
class AdminHandler(BaseHandler):
def get(self):
if self.session.get('username'):
self.render('admin.html')
else:
self.render('signin.html')
class ReorderHandler(BaseHandler):
def get(self):
self.render('reorder.html')
def post(self):
#Change order of item display
self.write('OK')
class DeleteHandler(BaseHandler):
def get(self):
self.render('delete.html')
def post(self):
#Delete entry from db
self.write('OK')
class AddHandler(BaseHandler):
def get(self):
self.render('add.html')
def post(self):
#add entry to db
self.write('OK')
class SigninHandler(BaseHandler):
def post(self):
#Check username and password
if valid:
self.session['username'] = username
self.redirect('/admin')
else:
self.write('Not valid')
AdminHandler列出了这些管理页面应该做什么的基本逻辑。 如果有人试图访问管理页面,处理程序应该检查用户是否已登录,如果是,则允许访问该页面。如果不是,则呈现登录页。你知道吗
重新排序、删除和添加都是我希望管理员能够执行的操作,但将来可能还会有更多的操作。我可以将AdminHandler逻辑添加到其他处理程序的所有get和post中,但这是非常重复的,因此我确信这样做是错误的。你知道吗
寻找一些关于如何将AdminHandler的逻辑合并到包含“管理”任务的所有其他处理程序中的指导。你知道吗
更新:Brent Washburne为我指出了正确的方向,足以让它正常工作,尽管我仍然不理解decorator函数的实际功能。不管怎样,代码似乎正在运行,现在看起来是这样的:
def require_user(old_func):
def new_function(self):
if not self.session.get('username'):
self.redirect('/signin')
old_func(self)
return new_function
class AdminHandler(BaseHandler):
@require_user
def get(self):
self.render('admin.html')
class AddHandler(BaseHandler):
@require_user
def get(self):
self.render('add.html')
@require_user
def post(self):
name = self.request.get('name')
qry = Animal.query(Animal.name == name).get()
if not qry:
new_animal = Animal(name=name)
new_animal.put()
self.write('OK')
其他所有“管理”处理程序也是如此。你知道吗
以下是一种暴力方式,可以确保用户在每个页面(登录页面除外)都已登录,或者将用户重定向到登录页面:
更好的方法是将此代码添加到每个get()和put()例程的顶部:
更好的方法是将代码转换为装饰器,这样只需添加一行代码:
相关问题 更多 >
编程相关推荐