MobileBlur

Hex Artifact Content
Login

Artifact 439fc9680baaa270bdca0164d099a5aaf930ca34:


0000: 23 21 2f 75 73 72 2f 62 69 6e 2f 65 6e 76 20 70  #!/usr/bin/env p
0010: 79 74 68 6f 6e 0a 23 20 2d 2a 2d 20 63 6f 64 69  ython.# -*- codi
0020: 6e 67 3a 20 75 74 66 2d 38 20 2d 2a 2d 0a 0a 22  ng: utf-8 -*-.."
0030: 22 22 0a 54 68 69 73 20 66 69 6c 65 20 69 73 20  "".This file is 
0040: 70 61 72 74 20 6f 66 20 74 68 65 20 77 65 62 32  part of the web2
0050: 70 79 20 57 65 62 20 46 72 61 6d 65 77 6f 72 6b  py Web Framework
0060: 0a 43 6f 70 79 72 69 67 68 74 65 64 20 62 79 20  .Copyrighted by 
0070: 4d 61 73 73 69 6d 6f 20 44 69 20 50 69 65 72 72  Massimo Di Pierr
0080: 6f 20 3c 6d 64 69 70 69 65 72 72 6f 40 63 73 2e  o <mdipierro@cs.
0090: 64 65 70 61 75 6c 2e 65 64 75 3e 0a 4c 69 63 65  depaul.edu>.Lice
00a0: 6e 73 65 3a 20 4c 47 50 4c 76 33 20 28 68 74 74  nse: LGPLv3 (htt
00b0: 70 3a 2f 2f 77 77 77 2e 67 6e 75 2e 6f 72 67 2f  p://www.gnu.org/
00c0: 6c 69 63 65 6e 73 65 73 2f 6c 67 70 6c 2e 68 74  licenses/lgpl.ht
00d0: 6d 6c 29 0a 22 22 22 0a 0a 23 23 23 23 23 23 23  ml)."""..#######
00e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0110: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0120: 23 23 23 23 23 23 23 0a 23 20 43 6f 6e 66 69 67  #######.# Config
0130: 75 72 61 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  uration paramete
0140: 72 73 20 66 6f 72 20 47 6f 6f 67 6c 65 20 41 70  rs for Google Ap
0150: 70 20 45 6e 67 69 6e 65 0a 23 23 23 23 23 23 23  p Engine.#######
0160: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0170: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0180: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0190: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
01a0: 23 23 23 23 23 23 23 0a 4b 45 45 50 5f 43 41 43  #######.KEEP_CAC
01b0: 48 45 44 20 3d 20 46 61 6c 73 65 20 20 20 20 23  HED = False    #
01c0: 20 72 65 71 75 65 73 74 20 61 20 64 75 6d 6d 79   request a dummy
01d0: 20 75 72 6c 20 65 76 65 72 79 20 31 30 73 65 63   url every 10sec
01e0: 73 20 74 6f 20 66 6f 72 63 65 20 63 61 63 68 69  s to force cachi
01f0: 6e 67 20 61 70 70 0a 4c 4f 47 5f 53 54 41 54 53  ng app.LOG_STATS
0200: 20 3d 20 46 61 6c 73 65 20 20 20 20 20 20 23 20   = False      # 
0210: 77 65 62 32 70 79 20 6c 65 76 65 6c 20 6c 6f 67  web2py level log
0220: 20 73 74 61 74 69 73 74 69 63 73 0a 41 50 50 53   statistics.APPS
0230: 54 41 54 53 20 3d 20 54 72 75 65 20 20 20 20 20  TATS = True     
0240: 20 20 20 20 23 20 47 41 45 20 6c 65 76 65 6c 20      # GAE level 
0250: 75 73 61 67 65 20 73 74 61 74 69 73 74 69 63 73  usage statistics
0260: 20 61 6e 64 20 70 72 6f 66 69 6c 69 6e 67 0a 44   and profiling.D
0270: 45 42 55 47 20 3d 20 46 61 6c 73 65 20 20 20 20  EBUG = False    
0280: 20 20 20 20 20 20 23 20 64 65 62 75 67 20 6d 6f        # debug mo
0290: 64 65 0a 41 55 54 4f 5f 52 45 54 52 59 20 3d 20  de.AUTO_RETRY = 
02a0: 54 72 75 65 20 20 20 20 20 20 23 20 66 6f 72 63  True      # forc
02b0: 65 20 67 61 65 20 74 6f 20 72 65 74 72 79 20 63  e gae to retry c
02c0: 6f 6d 6d 69 74 20 6f 6e 20 66 61 69 6c 75 72 65  ommit on failure
02d0: 0a 23 0a 23 20 52 65 61 64 20 6d 6f 72 65 20 61  .#.# Read more a
02e0: 62 6f 75 74 20 41 50 50 53 54 41 54 53 20 68 65  bout APPSTATS he
02f0: 72 65 0a 23 20 20 20 68 74 74 70 3a 2f 2f 67 6f  re.#   http://go
0300: 6f 67 6c 65 61 70 70 65 6e 67 69 6e 65 2e 62 6c  ogleappengine.bl
0310: 6f 67 73 70 6f 74 2e 63 6f 6d 2f 32 30 31 30 2f  ogspot.com/2010/
0320: 30 33 2f 65 61 73 79 2d 70 65 72 66 6f 72 6d 61  03/easy-performa
0330: 6e 63 65 2d 70 72 6f 66 69 6c 69 6e 67 2d 77 69  nce-profiling-wi
0340: 74 68 2e 68 74 6d 6c 0a 23 20 63 61 6e 20 62 65  th.html.# can be
0350: 20 61 63 63 65 73 73 65 64 20 66 72 6f 6d 3a 0a   accessed from:.
0360: 23 20 20 20 68 74 74 70 3a 2f 2f 6c 6f 63 61 6c  #   http://local
0370: 68 6f 73 74 3a 38 30 38 30 2f 5f 61 68 2f 73 74  host:8080/_ah/st
0380: 61 74 73 0a 23 23 23 23 23 23 23 23 23 23 23 23  ats.############
0390: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
03a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
03b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
03c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
03d0: 23 23 0a 23 20 41 6c 6c 20 74 72 69 63 6b 73 20  ##.# All tricks 
03e0: 69 6e 20 74 68 69 73 20 66 69 6c 65 20 64 65 76  in this file dev
03f0: 65 6c 6f 70 65 64 20 62 79 20 52 6f 62 69 6e 20  eloped by Robin 
0400: 42 68 61 74 74 61 63 68 61 72 79 79 61 0a 23 23  Bhattacharyya.##
0410: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0420: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0430: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0440: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0450: 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a 0a 69  ############...i
0460: 6d 70 6f 72 74 20 74 69 6d 65 0a 69 6d 70 6f 72  mport time.impor
0470: 74 20 6f 73 0a 69 6d 70 6f 72 74 20 73 79 73 0a  t os.import sys.
0480: 69 6d 70 6f 72 74 20 6c 6f 67 67 69 6e 67 0a 69  import logging.i
0490: 6d 70 6f 72 74 20 63 50 69 63 6b 6c 65 0a 69 6d  mport cPickle.im
04a0: 70 6f 72 74 20 70 69 63 6b 6c 65 0a 69 6d 70 6f  port pickle.impo
04b0: 72 74 20 77 73 67 69 72 65 66 2e 68 61 6e 64 6c  rt wsgiref.handl
04c0: 65 72 73 0a 69 6d 70 6f 72 74 20 64 61 74 65 74  ers.import datet
04d0: 69 6d 65 0a 0a 70 61 74 68 20 3d 20 6f 73 2e 70  ime..path = os.p
04e0: 61 74 68 2e 64 69 72 6e 61 6d 65 28 6f 73 2e 70  ath.dirname(os.p
04f0: 61 74 68 2e 61 62 73 70 61 74 68 28 5f 5f 66 69  ath.abspath(__fi
0500: 6c 65 5f 5f 29 29 0a 73 79 73 2e 70 61 74 68 20  le__)).sys.path 
0510: 3d 20 5b 70 61 74 68 5d 2b 5b 70 20 66 6f 72 20  = [path]+[p for 
0520: 70 20 69 6e 20 73 79 73 2e 70 61 74 68 20 69 66  p in sys.path if
0530: 20 6e 6f 74 20 70 3d 3d 70 61 74 68 5d 0a 0a 73   not p==path]..s
0540: 79 73 2e 6d 6f 64 75 6c 65 73 5b 27 63 50 69 63  ys.modules['cPic
0550: 6b 6c 65 27 5d 20 3d 20 73 79 73 2e 6d 6f 64 75  kle'] = sys.modu
0560: 6c 65 73 5b 27 70 69 63 6b 6c 65 27 5d 0a 0a 0a  les['pickle']...
0570: 66 72 6f 6d 20 67 6c 75 6f 6e 2e 73 65 74 74 69  from gluon.setti
0580: 6e 67 73 20 69 6d 70 6f 72 74 20 67 6c 6f 62 61  ngs import globa
0590: 6c 5f 73 65 74 74 69 6e 67 73 0a 66 72 6f 6d 20  l_settings.from 
05a0: 67 6f 6f 67 6c 65 2e 61 70 70 65 6e 67 69 6e 65  google.appengine
05b0: 2e 61 70 69 2e 6c 61 62 73 20 69 6d 70 6f 72 74  .api.labs import
05c0: 20 74 61 73 6b 71 75 65 75 65 0a 66 72 6f 6d 20   taskqueue.from 
05d0: 67 6f 6f 67 6c 65 2e 61 70 70 65 6e 67 69 6e 65  google.appengine
05e0: 2e 65 78 74 20 69 6d 70 6f 72 74 20 77 65 62 61  .ext import weba
05f0: 70 70 0a 66 72 6f 6d 20 67 6f 6f 67 6c 65 2e 61  pp.from google.a
0600: 70 70 65 6e 67 69 6e 65 2e 65 78 74 2e 77 65 62  ppengine.ext.web
0610: 61 70 70 2e 75 74 69 6c 20 69 6d 70 6f 72 74 20  app.util import 
0620: 72 75 6e 5f 77 73 67 69 5f 61 70 70 0a 0a 0a 67  run_wsgi_app...g
0630: 6c 6f 62 61 6c 5f 73 65 74 74 69 6e 67 73 2e 77  lobal_settings.w
0640: 65 62 32 70 79 5f 72 75 6e 74 69 6d 65 5f 67 61  eb2py_runtime_ga
0650: 65 20 3d 20 54 72 75 65 0a 67 6c 6f 62 61 6c 5f  e = True.global_
0660: 73 65 74 74 69 6e 67 73 2e 64 62 5f 73 65 73 73  settings.db_sess
0670: 69 6f 6e 73 20 3d 20 54 72 75 65 0a 69 66 20 6f  ions = True.if o
0680: 73 2e 65 6e 76 69 72 6f 6e 2e 67 65 74 28 27 53  s.environ.get('S
0690: 45 52 56 45 52 5f 53 4f 46 54 57 41 52 45 27 2c  ERVER_SOFTWARE',
06a0: 20 27 27 29 2e 73 74 61 72 74 73 77 69 74 68 28   '').startswith(
06b0: 27 44 65 76 65 6c 27 29 3a 0a 20 20 20 20 28 67  'Devel'):.    (g
06c0: 6c 6f 62 61 6c 5f 73 65 74 74 69 6e 67 73 2e 77  lobal_settings.w
06d0: 65 62 32 70 79 5f 72 75 6e 74 69 6d 65 2c 20 44  eb2py_runtime, D
06e0: 45 42 55 47 29 20 3d 20 5c 0a 20 20 20 20 20 20  EBUG) = \.      
06f0: 20 20 28 27 67 61 65 3a 64 65 76 65 6c 6f 70 6d    ('gae:developm
0700: 65 6e 74 27 2c 20 54 72 75 65 29 0a 65 6c 73 65  ent', True).else
0710: 3a 0a 20 20 20 20 28 67 6c 6f 62 61 6c 5f 73 65  :.    (global_se
0720: 74 74 69 6e 67 73 2e 77 65 62 32 70 79 5f 72 75  ttings.web2py_ru
0730: 6e 74 69 6d 65 2c 20 44 45 42 55 47 29 20 3d 20  ntime, DEBUG) = 
0740: 5c 0a 20 20 20 20 20 20 20 20 28 27 67 61 65 3a  \.        ('gae:
0750: 70 72 6f 64 75 63 74 69 6f 6e 27 2c 20 46 61 6c  production', Fal
0760: 73 65 29 0a 0a 0a 69 6d 70 6f 72 74 20 67 6c 75  se)...import glu
0770: 6f 6e 2e 6d 61 69 6e 0a 0a 0a 64 65 66 20 6c 6f  on.main...def lo
0780: 67 5f 73 74 61 74 73 28 66 75 6e 29 3a 0a 20 20  g_stats(fun):.  
0790: 20 20 22 22 22 46 75 6e 63 74 69 6f 6e 20 74 68    """Function th
07a0: 61 74 20 77 69 6c 6c 20 61 63 74 20 61 73 20 61  at will act as a
07b0: 20 64 65 63 6f 72 61 74 6f 72 20 74 6f 20 6d 61   decorator to ma
07c0: 6b 65 20 6c 6f 67 67 69 6e 67 22 22 22 0a 20 20  ke logging""".  
07d0: 20 20 64 65 66 20 6e 65 77 66 75 6e 28 65 6e 76    def newfun(env
07e0: 2c 20 72 65 73 29 3a 0a 20 20 20 20 20 20 20 20  , res):.        
07f0: 22 22 22 4c 6f 67 20 74 68 65 20 65 78 65 63 75  """Log the execu
0800: 74 69 6f 6e 20 74 69 6d 65 20 6f 66 20 74 68 65  tion time of the
0810: 20 70 61 73 73 65 64 20 66 75 6e 63 74 69 6f 6e   passed function
0820: 22 22 22 0a 20 20 20 20 20 20 20 20 74 69 6d 65  """.        time
0830: 72 20 3d 20 6c 61 6d 62 64 61 20 74 3a 20 28 74  r = lambda t: (t
0840: 2e 74 69 6d 65 28 29 2c 20 74 2e 63 6c 6f 63 6b  .time(), t.clock
0850: 28 29 29 0a 20 20 20 20 20 20 20 20 28 74 30 2c  ()).        (t0,
0860: 20 63 30 29 20 3d 20 74 69 6d 65 72 28 74 69 6d   c0) = timer(tim
0870: 65 29 0a 20 20 20 20 20 20 20 20 65 78 65 63 75  e).        execu
0880: 74 65 64 5f 66 75 6e 63 74 69 6f 6e 20 3d 20 66  ted_function = f
0890: 75 6e 28 65 6e 76 2c 20 72 65 73 29 0a 20 20 20  un(env, res).   
08a0: 20 20 20 20 20 28 74 31 2c 20 63 31 29 20 3d 20       (t1, c1) = 
08b0: 74 69 6d 65 72 28 74 69 6d 65 29 0a 20 20 20 20  timer(time).    
08c0: 20 20 20 20 6c 6f 67 5f 69 6e 66 6f 20 3d 20 22      log_info = "
08d0: 22 22 2a 2a 2a 2a 20 52 65 71 75 65 73 74 3a 20  ""**** Request: 
08e0: 25 2e 32 66 6d 73 2f 25 2e 32 66 6d 73 20 28 72  %.2fms/%.2fms (r
08f0: 65 61 6c 20 74 69 6d 65 2f 63 70 75 20 74 69 6d  eal time/cpu tim
0900: 65 29 22 22 22 0a 20 20 20 20 20 20 20 20 6c 6f  e)""".        lo
0910: 67 5f 69 6e 66 6f 20 3d 20 6c 6f 67 5f 69 6e 66  g_info = log_inf
0920: 6f 20 25 20 28 28 74 31 20 2d 20 74 30 29 20 2a  o % ((t1 - t0) *
0930: 20 31 30 30 30 2c 20 28 63 31 20 2d 20 63 30 29   1000, (c1 - c0)
0940: 20 2a 20 31 30 30 30 29 0a 20 20 20 20 20 20 20   * 1000).       
0950: 20 6c 6f 67 67 69 6e 67 2e 69 6e 66 6f 28 6c 6f   logging.info(lo
0960: 67 5f 69 6e 66 6f 29 0a 20 20 20 20 20 20 20 20  g_info).        
0970: 72 65 74 75 72 6e 20 65 78 65 63 75 74 65 64 5f  return executed_
0980: 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 72 65 74  function.    ret
0990: 75 72 6e 20 6e 65 77 66 75 6e 0a 0a 0a 6c 6f 67  urn newfun...log
09a0: 67 69 6e 67 2e 62 61 73 69 63 43 6f 6e 66 69 67  ging.basicConfig
09b0: 28 6c 65 76 65 6c 3d 6c 6f 67 67 69 6e 67 2e 49  (level=logging.I
09c0: 4e 46 4f 29 0a 0a 0a 64 65 66 20 77 73 67 69 61  NFO)...def wsgia
09d0: 70 70 28 65 6e 76 2c 20 72 65 73 29 3a 0a 20 20  pp(env, res):.  
09e0: 20 20 22 22 22 52 65 74 75 72 6e 20 74 68 65 20    """Return the 
09f0: 77 73 67 69 61 70 70 22 22 22 0a 20 20 20 20 69  wsgiapp""".    i
0a00: 66 20 65 6e 76 5b 27 50 41 54 48 5f 49 4e 46 4f  f env['PATH_INFO
0a10: 27 5d 20 3d 3d 20 27 2f 5f 61 68 2f 71 75 65 75  '] == '/_ah/queu
0a20: 65 2f 64 65 66 61 75 6c 74 27 3a 0a 20 20 20 20  e/default':.    
0a30: 20 20 20 20 69 66 20 4b 45 45 50 5f 43 41 43 48      if KEEP_CACH
0a40: 45 44 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ED:.            
0a50: 64 65 6c 74 61 20 3d 20 64 61 74 65 74 69 6d 65  delta = datetime
0a60: 2e 74 69 6d 65 64 65 6c 74 61 28 73 65 63 6f 6e  .timedelta(secon
0a70: 64 73 3d 31 30 29 0a 20 20 20 20 20 20 20 20 20  ds=10).         
0a80: 20 20 20 74 61 73 6b 71 75 65 75 65 2e 61 64 64     taskqueue.add
0a90: 28 65 74 61 3d 64 61 74 65 74 69 6d 65 2e 64 61  (eta=datetime.da
0aa0: 74 65 74 69 6d 65 2e 6e 6f 77 28 29 20 2b 20 64  tetime.now() + d
0ab0: 65 6c 74 61 29 0a 20 20 20 20 20 20 20 20 72 65  elta).        re
0ac0: 73 28 27 32 30 30 20 4f 4b 27 2c 5b 28 27 43 6f  s('200 OK',[('Co
0ad0: 6e 74 65 6e 74 2d 54 79 70 65 27 2c 27 74 65 78  ntent-Type','tex
0ae0: 74 2f 70 6c 61 69 6e 27 29 5d 29 0a 20 20 20 20  t/plain')]).    
0af0: 20 20 20 20 72 65 74 75 72 6e 20 5b 27 27 5d 0a      return [''].
0b00: 20 20 20 20 65 6e 76 5b 27 50 41 54 48 5f 49 4e      env['PATH_IN
0b10: 46 4f 27 5d 20 3d 20 65 6e 76 5b 27 50 41 54 48  FO'] = env['PATH
0b20: 5f 49 4e 46 4f 27 5d 2e 65 6e 63 6f 64 65 28 27  _INFO'].encode('
0b30: 75 74 66 38 27 29 0a 0a 20 20 20 20 23 74 68 69  utf8')..    #thi
0b40: 73 20 64 65 61 6c 73 20 77 69 74 68 20 61 20 70  s deals with a p
0b50: 72 6f 62 6c 65 6d 20 77 68 65 72 65 20 47 41 45  roblem where GAE
0b60: 20 64 65 76 65 6c 6f 70 6d 65 6e 74 20 73 65 72   development ser
0b70: 76 65 72 20 73 65 65 6d 73 20 74 6f 20 66 6f 72  ver seems to for
0b80: 67 65 74 0a 20 20 20 20 23 20 74 68 65 20 70 61  get.    # the pa
0b90: 74 68 20 62 65 74 77 65 65 6e 20 72 65 71 75 65  th between reque
0ba0: 73 74 73 0a 20 20 20 20 69 66 20 67 6c 6f 62 61  sts.    if globa
0bb0: 6c 5f 73 65 74 74 69 6e 67 73 2e 77 65 62 32 70  l_settings.web2p
0bc0: 79 5f 72 75 6e 74 69 6d 65 20 3d 3d 20 27 67 61  y_runtime == 'ga
0bd0: 65 3a 64 65 76 65 6c 6f 70 6d 65 6e 74 27 3a 0a  e:development':.
0be0: 20 20 20 20 20 20 20 20 67 6c 75 6f 6e 2e 61 64          gluon.ad
0bf0: 6d 69 6e 2e 63 72 65 61 74 65 5f 6d 69 73 73 69  min.create_missi
0c00: 6e 67 5f 66 6f 6c 64 65 72 73 28 29 0a 0a 20 20  ng_folders()..  
0c10: 20 20 72 65 74 75 72 6e 20 67 6c 75 6f 6e 2e 6d    return gluon.m
0c20: 61 69 6e 2e 77 73 67 69 62 61 73 65 28 65 6e 76  ain.wsgibase(env
0c30: 2c 20 72 65 73 29 0a 0a 0a 69 66 20 4c 4f 47 5f  , res)...if LOG_
0c40: 53 54 41 54 53 20 6f 72 20 44 45 42 55 47 3a 0a  STATS or DEBUG:.
0c50: 20 20 20 20 77 73 67 69 61 70 70 20 3d 20 6c 6f      wsgiapp = lo
0c60: 67 5f 73 74 61 74 73 28 77 73 67 69 61 70 70 29  g_stats(wsgiapp)
0c70: 0a 0a 0a 69 66 20 41 55 54 4f 5f 52 45 54 52 59  ...if AUTO_RETRY
0c80: 3a 0a 20 20 20 20 66 72 6f 6d 20 67 6c 75 6f 6e  :.    from gluon
0c90: 2e 63 6f 6e 74 72 69 62 2e 67 61 65 5f 72 65 74  .contrib.gae_ret
0ca0: 72 79 20 69 6d 70 6f 72 74 20 61 75 74 6f 72 65  ry import autore
0cb0: 74 72 79 5f 64 61 74 61 73 74 6f 72 65 5f 74 69  try_datastore_ti
0cc0: 6d 65 6f 75 74 73 0a 20 20 20 20 61 75 74 6f 72  meouts.    autor
0cd0: 65 74 72 79 5f 64 61 74 61 73 74 6f 72 65 5f 74  etry_datastore_t
0ce0: 69 6d 65 6f 75 74 73 28 29 0a 0a 0a 64 65 66 20  imeouts()...def 
0cf0: 6d 61 69 6e 28 29 3a 0a 20 20 20 20 22 22 22 52  main():.    """R
0d00: 75 6e 20 74 68 65 20 77 73 67 69 20 61 70 70 22  un the wsgi app"
0d10: 22 22 0a 20 20 20 20 69 66 20 41 50 50 53 54 41  "".    if APPSTA
0d20: 54 53 3a 0a 20 20 20 20 20 20 20 20 72 75 6e 5f  TS:.        run_
0d30: 77 73 67 69 5f 61 70 70 28 77 73 67 69 61 70 70  wsgi_app(wsgiapp
0d40: 29 0a 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20  ).    else:.    
0d50: 20 20 20 20 77 73 67 69 72 65 66 2e 68 61 6e 64      wsgiref.hand
0d60: 6c 65 72 73 2e 43 47 49 48 61 6e 64 6c 65 72 28  lers.CGIHandler(
0d70: 29 2e 72 75 6e 28 77 73 67 69 61 70 70 29 0a 0a  ).run(wsgiapp)..
0d80: 69 66 20 5f 5f 6e 61 6d 65 5f 5f 20 3d 3d 20 27  if __name__ == '
0d90: 5f 5f 6d 61 69 6e 5f 5f 27 3a 0a 20 20 20 20 6d  __main__':.    m
0da0: 61 69 6e 28 29 0a 0a                             ain()..