ShaileshKumarMPatel
ShaileshKumarMPatel

Reputation: 152

python bottle do not display template output when login decorator is used

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

Answers (1)

ShaileshKumarMPatel
ShaileshKumarMPatel

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

Related Questions