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

Popular posts from this blog

java - pagination of xlsx file to XSSFworkbook using apache POI -

Unlimited choices in BASH case statement -

apache - How do I stop my index.php being run twice for every user -