Reputation: 152
I am trying to use decorator for verifying user in bottle web framework for python. following is my login decorator code
def decorate_verify_user(fun):
def nothing():
logging.debug("no username password available")
return template("failed_login.html",post_data="No post_data")
@wraps(fun)
def do_it():
if(verify_user()==True):
fun()
else:
nothing()
logging.debug("function name of do_it is {}".format(do_it.__name__))
return do_it
following function uses decorator
@route('/view_antigen', method='POST')
@decorate_verify_user
def view_antigen():
logging.debug('view_antigen() entered...')
m=mysql_lis()
con=m.get_link(astm_var.my_host,astm_var.my_user,astm_var.my_pass,astm_var.my_db)
cur=m.run_query(con,prepared_sql='select * from antigen',data_tpl=())
all_data=m.get_all_rows(cur)
logging.debug("antigen data:{}".format(all_data))
if(all_data==None):
logging.debug('antigen data not found')
m.close_cursor(cur)
m.close_link(con)
return False
m.close_cursor(cur)
m.close_link(con)
logging.debug('view_antigen.html entering...')
return template("view_antigen.html",all_data=all_data)
if I remove @decorate_verify_user
line, template shows as expected
But, with @decorate_verify_user
line, only blank page is shown. (However, browser web developer tool shows all POST variables correctly. Log file also shows all statements upto
line logging.debug('view_antigen.html entering...')
What is explanation/correction of this behavior?
Upvotes: 0
Views: 23
Reputation: 152
Here is corrected decorator
def decorate_verify_user(fun):
def nothing():
logging.debug("no username password available")
return template("failed_login.html",post_data="No post_data")
@wraps(fun)
def do_it():
if(verify_user()==True):
logging.debug("#fun() reached...")
return fun() #return added XXX
else:
return nothing() #return added YYY
logging.debug("function name of do_it is {}".format(do_it.__name__))
return do_it
Only return was added to fun() and nothing() at XXX and YYY As I understand, I needed to return template for display in browser. In earlier code, function was executed but template was returned, hence, no display of template in browser
Upvotes: 0