在googleappengin中创建受限页面

2024-06-28 14:51:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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')

其他所有“管理”处理程序也是如此。你知道吗


Tags: storenameself处理程序getsessiondefhtml
1条回答
网友
1楼 · 发布于 2024-06-28 14:51:20

以下是一种暴力方式,可以确保用户在每个页面(登录页面除外)都已登录,或者将用户重定向到登录页面:

def dispatch(self):
    # Get a session store for this request.
    self.session_store = sessions.get_store(request=self.request)

    if not self.session['username'] and self.request.get('path') != '/login':
        return redirect('/login')

更好的方法是将此代码添加到每个get()和put()例程的顶部:

def get(self):
    if not self.session['username']:
        return redirect('/login')

更好的方法是将代码转换为装饰器,这样只需添加一行代码:

@require_login
def get(self):
    ....

相关问题 更多 >