python - Creating restricted pages in google app engine -
i'm having trouble creating admin pages on python google app engine site. think answer should pretty straightforward, honestly, i've been trying understand how classes inheriting other classes, or using functions wrap other functions, , can't seem understanding of it.
basically, site has 2 kinds of pages: main page, , pages allow user perform admin actions. main page can seen without signing in. other pages admins. users accounts admins, i've set webapp2 sessions, , long
self.sessions.get('username') returns that's enough allowed access other pages.
here handlers:
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): # session store request. self.session_store = sessions.get_store(request=self.request) try: # dispatch request. webapp2.requesthandler.dispatch(self) finally: # save sessions. self.session_store.save_sessions(self.response) @webapp2.cached_property def session(self): # returns session using 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 db self.write('ok') class addhandler(basehandler): def get(self): self.render('add.html') def post(self): #add entry db self.write('ok') class signinhandler(basehandler): def post(self): #check username , password if valid: self.session['username'] = username self.redirect('/admin') else: self.write('not valid') the adminhandler lays out basic logic of these admin pages should do. if trying access admin pages, handler should checks see if user signed in, , if so, allow access page. if not, renders sign-in page.
reorder, delete, , add actions want admins able do, there might more in future. add adminhandler logic gets , posts of other handlers, extremely repetitive , therefore sure wrong thing do.
looking guidance on how logic of adminhandler incorporated of other handlers cover "administrative" tasks.
update: brent washburne pointed me in right direction enough thing working, although still don't feel understand decorator function does. anyway, code seems working, , looks this:
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') and on other "admin" handlers.
here's brute-force way ensure user logged in every page (except login page), or redirects them login page:
def dispatch(self): # session store request. self.session_store = sessions.get_store(request=self.request) if not self.session['username'] , self.request.get('path') != '/login': return redirect('/login') a better way add code top of every get() , put() routine:
def get(self): if not self.session['username']: return redirect('/login') an better way turn code decorator need add 1 line:
@require_login def get(self): ....
Comments
Post a Comment