Advertisement
s243a

rest_test6.py

Nov 13th, 2018
355
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 22.20 KB | None | 0 0
  1. import bottle
  2. from bottle import route, run, Bottle, request
  3. import sys, os, re, urllib
  4. import datetime #I think I need this
  5. import time #I think I need this
  6. from gevent import queue
  7. from gevent import Greenlet
  8. import gevent
  9. import StringIO
  10. from datetime import datetime
  11. from bottle import response #https://stackoverflow.com/questions/17262170/bottle-py-enabling-cors-for-jquery-ajax-requests
  12.  
  13. #from gevent import pywsgi #Don't need this yet
  14. fcpHost = "127.0.0.1"
  15. import fcp
  16. #node = fcp.FCPNode(host=fcpHost, verbosity=fcp.DETAIL)
  17. jobs={}
  18. app = Bottle()
  19.  
  20. #https://stackoverflow.com/questions/17262170/bottle-py-enabling-cors-for-jquery-ajax-requests#17262900
  21. # the decorator
  22. def enable_cors(fn):
  23.     def _enable_cors(*args, **kwargs):
  24.         # set CORS headers
  25.         response.headers['Access-Control-Allow-Origin'] = '127.0.0.1'
  26.         response.headers['Vary'] = 'Origin'
  27.         response.headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT, OPTIONS'
  28.         response.headers['Access-Control-Allow-Headers'] = 'Origin, Accept, Content-Type, X-Requested-With, X-CSRF-Token'
  29.  
  30.         if bottle.request.method != 'OPTIONS':
  31.             # actual request; reply with the actual response
  32.             return fn(*args, **kwargs)
  33.  
  34.     return _enable_cors
  35.  
  36.  
  37. def delim_filter(config):
  38.     bottle.debug(True)
  39.     print("Entering delim_filter")
  40.     ''' Matches a comma separated list of numbers. '''
  41.     aconfig = config or "%20"
  42.     print ("aconfig=" + aconfig)
  43.     delimiter = urllib.unquote(aconfig).decode('utf8')
  44.     print("delimiter=" + delimiter)  
  45.     regexp = r'(?!{a_delim})+({a_delim}(?!{a_delim})+)*'.format(a_delim=re.escape(delimiter))
  46.     print("regexp="+regexp)
  47.     def to_python(match):
  48.         print("Converting Match")
  49.         print("Math=" + match)
  50.         ms = map(urllib.unquote(aconfig).decode,match.split())
  51.         print( "ms=" + ms )
  52.         return ms
  53.  
  54.     def to_url(astr):
  55.         print("Converting to URL")
  56.         print ("astr=" + astr)
  57.         astr2 = delimiter.join(map(urllib.unquote(aconfig).decode,astr))
  58.         print("astr2="+astr2)
  59.         print  astr2
  60.         return astr2
  61.  
  62.     return regexp, to_python, to_url
  63.  
  64. app.router.add_filter('delim', delim_filter)
  65.  
  66. def split_urlArgs(url,delim=" ",
  67.                   decode='All',
  68.                   xfm_de=lambda a: urllib.unquote(a).decode('utf8'),
  69.                   xfm_split=lambda a, b: re.split(a,b), #Typically a is a regular expression and b a string
  70.                   fn_regexp = lambda a: r'(?!{a_delim})+({a_delim}(?!{a_delim})+)*'.format(a_delim=a) ):
  71.     bottle.debug(True)
  72.     ''' Matches a comma separated list of numbers. '''
  73.     print("delimiter=" + delim)  
  74.     if decode == "Args":
  75.         ms = xfm_split(fn_regexp(a),url)
  76.     elif decode == "All":
  77.         url2 = xfm_de(url)    #Decode the URL
  78.         delim= xfm_de(delim) #Decode the delimitor
  79.         ms = xfm_split(fn_regexp(delim),url)
  80.     elif decode == "None":
  81.         ms = xfm_split(fn_regexp(delim),url) #SPlit the URL based on a regular expression.
  82.            
  83.     print( "ms=" + "["+",".join(ms) +"]" )    
  84.     return ms, delim
  85.  
  86. def combine_urlArgs(args,delim=" ",
  87.                     encode='All',
  88.                     xfm_encode=lambda a: urllib.quote(a, safe=''),
  89.                     xfm_join=lambda a, b: a.join(b)): #Typically a is the delimiter and b is a list
  90.     print("Converting to URL")
  91.     print ("astr=" + args)
  92.     if decode == "Args":
  93.         astr2 = xfm_join(delim,(map(lambda a: xfm_encode,args)))
  94.     elif decode == "All":
  95.         astr2 = urllib.unquote(xfm_join(delim,args))
  96.     elif decode=="None":
  97.         astr2 = xfm_join(delim,args)      
  98.     print("astr2="+astr2)
  99.     return astr2    
  100.  
  101.  
  102. #@app.route('/<key>/%09/<cmd>/<args:delim:%09>') # %09 == tab
  103. #@app.route('/<key>/%20/<cmd>/<args:delim:%20>') # %20 == ' '
  104. #@app.route('/<key>/ /<cmd>/<args:delim: >') # %20 == ' '
  105. #@app.route('/<key>/%3B/<cmd>/<args:delim:%3B>') # %3B == ';'
  106. #@app.route('/<key>/;/<cmd>/<args:delim:;>') # %3B == ';'
  107. #@app.route('/<key>/%2C/<cmd>/<args:delim:%2C>') # %2C == ','
  108. #@app.route('/<key>/,/<cmd>/<args:delim:,>') # %2C == ','
  109. @app.route('/<key>/<sep>/<cmd>/<args:path>') # %2C == ','
  110. def mystery(key,cmd,args,sep=""):
  111.     bottle.debug(True)
  112.     print("engering mystery")
  113.     print("sep=" + sep)
  114.     if len(sep) > 0 : # True if seperator is a wild card
  115.         args, sep = split_urlArgs(args,sep)
  116.     if key == '1234': # %2C == ','
  117.         print(key)
  118.         print(cmd)
  119.         print(args)
  120.         #delimiter = urllib.unquote(aconfig).decode('utf8')
  121.         #print(delimiter)            
  122.         result1 = os.popen("IFS=<a_dilim>".format(a_dilim=sep)).read()
  123.         print("result1=" + result1)
  124.         result2 = result1 + "<br>"
  125.         print("result2=" + result2)    
  126.         cmd_str=cmd + sep + sep.join(args)
  127.         print(cmd_str)  
  128.         result3 = result2 +os.popen(cmd_str).read()
  129.         print("result3=" + result3)              
  130.         return "<pre>" + result3 + "</pre>"
  131.         #return result3.replace("\n","<br>")
  132.         #return ('key=' + key + '<br>' +
  133.         #     'sep=' + sep + '<br>' +
  134.         #     'cmd=' + cmd + '<br>' +
  135.         #     'args='   + "[" + ",".join(args)+"]")
  136. def generateFreeWorker(job_or_uri,message=None,afile=None,fcpHost = "127.0.0.1",fcpPort= 9481,aBody=None,OutputType="HTML"):
  137.     fw = FreeWorkerFactory(job_or_uri,message,afile,fcpHost,fcpPort,aBody,OutputType)
  138.     return fw        
  139. #class calbackExecuter:
  140. #    __init__(self,calbacks):
  141. #        self.callbacks=calbacks
  142. #    def execute():
  143. #        for c in self.calbacks():
  144. #            c()
  145. class loggerContainer:
  146.     def __init__(self,node=None,**kw):
  147.         self.ready = False
  148.         self.strBuff = StringIO.StringIO()
  149.         self.job = kw.get('job',None)
  150.         self.Brk = kw.get('Brk',"\n")
  151.         self.body = kw.get('body',None) #The html body to write to.
  152.  
  153.         self.msgDict={}
  154.         self.meseges=[None]*5
  155.         self.msgPosNext=0
  156.         self.msgPos=-1
  157.         self.msgMax=5
  158.         self.msgLnCnt=0  
  159.         self.cb = kw.get('cb',None) #A callback function for self.logfunc
  160.         self.node=kw.get('node',None)
  161.         self.dealayDuringFetch=7
  162.         self.delayWhenFishished=100
  163.         self.complete=False        
  164.         self.EndHdr=False
  165.        
  166.     def do_logfunc(self,msgline):
  167.         #print("self.msgPosNext="+str(self.msgPosNext))
  168.        
  169.         self.meseges[self.msgPosNext]={ "msg_str" : msgline,
  170.                                         "time" : datetime.now()
  171.                                       }      
  172.         self.msgPos=self.msgPosNext
  173.         #print("self.msgMax="+str(self.msgMax))
  174.         self.msgPosNext=((self.msgPosNext+1)%(self.msgMax))
  175.         if self.filterMSG(msgline):
  176.             self.msgDict[msgline]=datetime.now()
  177.         if self.msgLnCnt<self.msgMax:
  178.             self.msgLnCnt=self.msgLnCnt+1        
  179.     def logfunc(self,msgline,**kw):
  180.         #print(msgline)
  181.         mDict=self.parseMsg(msgline)
  182.         #cb=None,HTML_lb="<br>"
  183.         #if cb is None:
  184.         #    cb=lambda msg: self.print_and_put_cb(msg,HTML_lb="<br>",chkSender=True)
  185.    
  186.         if self.cb is None:
  187.             #print(msgline)
  188.             self.print_and_put_cb(msgline,mDict)
  189.         else:
  190.             cb(msgline,mDict)
  191.         self.do_logfunc(msgline)            
  192.     def parseMsg(self,msg):
  193.         mDict=self.parseSenderLine(msg)
  194.         sender=mDict.get('sender',None)
  195.         if (sender == 'CLIENT') or (sender == 'CLIENT'):
  196.             mDict['node_or_client']=True
  197.             try: #Not sure if we need a try/except here
  198.                 #k, v = mgStrToKey(mDict['msg_str'])
  199.                 #mDict['k']=v
  200.                 mDict=self.parseFCPMsgStr(mDict['msg_str']) # I haven't decided if a dictionary should be returned or a seperate key/value
  201.             except:
  202.                 pass
  203.         return mDict    
  204.     def parseSenderLine(self,msg_line):
  205.        regex=r'^(?P<sender>\S+)[:]\s+(?P<msg_str>[^\n]+)\n{0,1}$'
  206.        try: #Not sure if we need a try/except here
  207.            #print msg_line
  208.            m=re.match(regex,msg_line)
  209.            mDict=m.groupdict()
  210.            assert len(mDict['msg_str'])>0 #,"Could not parse msg_str"
  211.            self.setStatus(mDict['msg_str']) #This is to detect the end of communications
  212.        except AssertionError:
  213.            print("Could not parse msg_str")
  214.            print("msg_line="+msg_line)
  215.            return mDict
  216.        if mDict is None:
  217.            mDict={'sender' : 'Unknown',
  218.                  'msg_str' : msg_line }
  219.        return mDict
  220.     def parseFCPMsgStr(self,msg_line): #I should think of a better name for this
  221.         mDict, succeeded = self.parseSenderLine(msg_line)
  222.         if succeeded:
  223.             k, v, hasKeyVal = line.split("=", 1)
  224.             if hasKeyVal:
  225.                 mDict['parsed'][k]=v
  226.             else:
  227.                 mDict['parsed'][mDict['msg_str']]=True #Maybe do some checks here such as length and for white space characters
  228.         return mDict, succeeded
  229.     def print_and_put_cb(self,msg,mDict):
  230.         node_or_client=mDict.get('node_or_client',False)
  231.         #chkSender= not node_or_client
  232.         if self.filterMSG(msg): #Don't reprint the same message if we've scene it recently.
  233.             print self.msg_to_str(msg)
  234.         if node_or_client:
  235.             self.bodyPut_cb(msg,chkSender=False)
  236.     def filterMSG(self,msg): #We don't want to see the same log message too often
  237.         t1=self.msgDict.get(msg,None)
  238.        
  239.         if t1 is not None: #isinstance(t1,datetime):
  240.             if self.isComplete():
  241.                 delay=self.delayWhenFishished=100
  242.             else:
  243.                 delay=self.dealayDuringFetch=7
  244.             t2=datetime.now()
  245.             delta = t2 - t1 #https://stackoverflow.com/questions/2880713/time-difference-in-seconds-as-a-floating-point
  246.             #print(str(delta.seconds)+" "+msg)            
  247.             if delta.seconds>delay:
  248.                 return True
  249.             else:
  250.                 return False
  251.         else:
  252.             #print("New Message"+msg)
  253.             return True
  254.     def bodyPut_cb(self,msg,HTML_lb="<br>",chkSender=True):
  255.         #parseMsg
  256.         if chkSender:
  257.             if self.filterForBody(msg):
  258.                 print('bodyPut_cb: This branch should not normally be called')
  259.                 self.body.put(self.msg_to_str(msg)+HTML_lb)
  260.         else:
  261.             self.body.put(self.msg_to_str(msg)+HTML_lb)
  262.            
  263.     def filterForBody(self,msg):
  264.         if msg.startswith("NODE:") or msg.startswith("CLIENT:"):
  265.             return True
  266.         else:
  267.             return False
  268.  
  269.     def msg_to_str(self,msg):
  270.         if type(msg) == str:
  271.             return msg
  272.         elif type(msg) is dict: #isinstance(msg, collections.Mapping): #https://stackoverflow.com/questions/25231989/how-to-check-if-a-variable-is-a-dictionary-in-python
  273.             return msg['msg_str']
  274.         else:
  275.             return "Empty Message"
  276.     def tail(self,lines=0,cb=None,delta=None):
  277.         if cb is None:
  278.             cb=self.print_and_put_cb
  279.         if lines == 0:
  280.             N=self.msgMax
  281.         else:
  282.             N=min(self.msgMax,lines)
  283.         for i in range(self.msgPost,self.msgPos-N+1,-1):
  284.             msg_i=self.meseges[i%self.msgMax]
  285.             if delta is not None:
  286.                 t2=datetime.now()
  287.                 t1=msg_i['time']
  288.                 delta2=t2-t1
  289.                 if delta2.delta.microseconds > delta.microseconds:
  290.                     break
  291.             cb(self.meseges[i%self.msgMax])
  292.                  
  293.         #self.body.put(msgline)  
  294.     def myLogger(self, level, msg):
  295.         print("level="+level + " msg=" + msg)
  296.         if level > self.job.verbosity:
  297.             return  
  298.         if not msg.endswith(self.Brk):
  299.             msg += "\n"
  300.        
  301.         strBuff.write(msg)
  302.         self.isReady = True
  303.         #strBuff.flush()
  304.         #time.sleep(0.001)
  305.     def getLogger(self): #THis might be redundant
  306.         return self.myLogger              
  307.     def isReady(self):
  308.         return self.ready
  309.     def flush(self):
  310.         val=self.strBuff.getvalue()
  311.         self.strBuff.close()
  312.         self.strBuff = StringIO.StringIO()
  313.         self.isRead=False
  314.         return val
  315.     def getValue(self):
  316.         self.strBuff.getValue()
  317.     def readBuf(self):
  318.         if self.ready:
  319.             val = self.flush()
  320.             ready = True
  321.             return val, ready
  322.         else:
  323.             ready = False
  324.             val = ""
  325.             return val, ready
  326.         return val, ready
  327.     def isComplete(self): # We might also want to check for an EndMessage and wait if needed
  328.         return self.complete
  329.         #if self.job.msg['hdr'] == 'PutSuccessful':
  330.         #    return True
  331.         #elif self.job.msg['hdr'] == 'PutFailed':
  332.         #    return True
  333.     def detectEndMsg(self,msg): #I don't think we use this
  334.        
  335.         if filterForBody(self,msg):
  336.             node_or_client = True
  337.         else:
  338.             node_or_client = False
  339.         return node_or_client
  340.     def setStatus(self,msgLine):
  341.         if msgLine == 'PutSuccessful':
  342.             self.EndHdr=True
  343.         elif msgLine == 'PutFailed':
  344.             self.EndHdr=True
  345.         if self.EndHdr==True:
  346.             if msgLine=='EndMessage':
  347.                 self.complete=True
  348.     def callback(self, status, value):
  349.         if status == 'PutSuccessful':
  350.             self.complete=True
  351.         elif status == 'PutFailed':
  352.             self.complete=True
  353.         #elif status == 'URIGenerated':
  354.         #    self.complete=True        
  355.         #self.msg=value
  356.     def getCallback(self):
  357.         return self.callback    
  358. class FreeWorkerFactory:
  359.  
  360.     #self.job = None #A freenet job
  361.     #self.g = None
  362.     #self.body = None
  363.     #self.OutputType =None
  364.    
  365.     def __init__(self,job_or_uri=None,**kw):
  366.         self.kw={}
  367.         self.kw['message']=kw.get('message',None)
  368.         self.kw['file']=kw.get(file,None)
  369.         self.loggerContainer=kw.get('loggerContainer',None)
  370.         #if self.loggerContainer is not None and self.node is not None:
  371.         #    self.loggerContainer.node=node
  372.         self.host=kw.get('host',"127.0.0.1")
  373.         self.port=self.kw.get('port',9481)
  374.         self.OutputType=self.kw.get('OutputType','HTML')
  375.         #selffcpPort,aBody,OutputType
  376.         if job_or_uri is not None:
  377.             if type(job_or_uri) is str:
  378.                 print("__init__" + "uri as input")
  379.                 if job_or_uri in jobs:                
  380.                     print("uri in jobs")
  381.                     self.job=jobs[job_or_uri]
  382.                 else:
  383.                     print("making job")
  384.                     node = fcp.FCPNode(fcpHost,verbosity='fcp.DETAIL',port=self.kw)
  385.                     val = self.kw['message']
  386.                     ksk = job_or_uri
  387.                     uri = "KSK@" + ksk
  388.                     node.put("KSK@"+ksk, data=val, mimetype="text/plain", verbosity=fcp.DETAIL)
  389.                     #self.job = node.get(uri, async=True)
  390.                     self.startCB = lambda: node.get(uri, async=True) #A start callback is safer than immediatly starting the job
  391.             else:
  392.                 print("__init__"+"job as input")
  393.                 print("Warning: Make sure that logger is created before job is started")
  394.                 self.job=job_or_uri
  395.                 self.startCB = lambda: job_or_uri #Best of luck with this! Job might proceed before logger is ready.
  396.         if self.OutputType == "HTML":
  397.             self.Brk="<br>"
  398.         elif self.OutputType == "UNIX":
  399.             self.Brk="" #We won't use "\n" since print automatically generates the \n. Write can be used instead if one wants to explicitly use the /n
  400.         self.loggerContainer=kw.get('loggerContainer',None)
  401.         self.body=kw.get('body',None)
  402.         if self.body is None:
  403.             try:
  404.                 self.body = self.loggerContainer.body  
  405.             except:
  406.                 print("Warning: body should be set in logger before freenet worker is created")
  407.                 self.body = queue.Queue()
  408.         self.greenlet=kw.get('greenlet',None)
  409.         if self.greenlet is None:
  410.             g = Greenlet(self.on_data)
  411.         try:
  412.             if self.loggerContainer.body is None:
  413.                 if self.body is not None:
  414.                     self.loggerContainer.body=self. body
  415.         except:
  416.             pass
  417.  
  418.         #self.setBody(kw.get('body',None)) # Replaced w/ the above code
  419.         self.startCB=kw.get('startCB',None) #Maybe I need to define a default start CB.    
  420.        
  421.     def on_data(self):
  422.         # we can poll the job
  423.         while True:
  424.             val, ready = self.loggerContainer.readBuf()
  425.             if ready:
  426.                 print val
  427.                 self.body.put(val)    
  428.             if self.loggerContainer.isComplete():
  429.                 print "Yay! job complete"
  430.                
  431.                 try:
  432.                     self.body.put(self.job.getResult()) #Returns the completion message.
  433.                 except Exception as inst:
  434.                     print(type(inst))    # the exception instance
  435.                     print(inst.args)     # arguments stored in .args
  436.                     print(inst)          # __str__ allows args to be printed directly,
  437.                     break        
  438.             else:
  439.                 print "Waiting" + datetime.now().strftime('%s(s) %m/%d/%Y')+self.Brk
  440.                 #self.body.put("Waiting" + datetime.now().strftime('%s(s) %m/%d/%Y')+self.Brk)
  441.                 time.sleep(0.001) #Yield control to other threads
  442.                 gevent.sleep(7) #This yields control to another greenlet
  443.         print("Apparently we are done!")
  444.         self.on_finish() #Maybe we can sequence the greenlets instead of putting this here.
  445.        
  446.     def on_finish(self):
  447.         self.body.put('</body></html>') #There should be a way to seperate these last two lines from this method.
  448.         self.body.put(StopIteration)
  449.     def header(self,start_response=None):
  450.         if self.OutputType == "HTML":
  451.             if start_response is not None:
  452.                 start_response('200 OK', [('Content-Type', 'text/html')])
  453.         self.body.put(' ' * 1000)
  454.         if self.OutputType == "HTML":
  455.             self.body.put("<html><body><h1>Current Time:</h1>")  
  456.            
  457.     def handle(self,environ=None, start_response=None,aBody=None):
  458.         lambda a: self.start(self,enviorn,start_response)
  459.         #g = Greenlet.spawn(on_data, body)
  460.     def setBody(self,aBody=None,aGreenlet=None):
  461.         if aBody is None:
  462.            if self.body is None:
  463.                print("setting body & greenlet. Normally we shouldn't do this here")
  464.                self.body = queue.Queue()
  465.                self.greenlet = Greenlet(self.on_data)
  466.                self.loggerContainer.body=self.body
  467.         else:
  468.            self.body = aBody
  469.         if aGreenlet is None:
  470.             if self.greenlet is None:
  471.                 self.greenlet = Greenlet(self.on_data)
  472.         else:
  473.             self.greenlet=aGreenlet
  474.         if self.loggerContainer.body is None:
  475.             self.loggerContainer.body=self.body
  476.     def start(self,environ=None, start_response=None,aBody=None,aGreenlet=None): # Not sure
  477.         #https://stackoverflow.com/questions/20824218/how-to-implement-someasyncworker-from-bottle-asynchronous-primer
  478.         #g = Greenlet.spawn(current_time, lambda a: on_data(body))
  479.         print("Set Body")
  480.         self.setBody(aBody)
  481.         print("header")
  482.         self.header(start_response)
  483.         self.job=self.startCB() #Maybe add the option for some key words (i.e. kw) to the startCB function
  484.         print("start")
  485.         self.greenlet.start()            
  486.         return self.body, self.greenlet
  487.  
  488. #@enable_cors
  489.        
  490. @app.post('/KSK/insert')
  491. @enable_cors
  492. def rest_test():
  493.     fcpHost=request.json.get('host','127.0.0.1')
  494.     fcpVerbosity=request.json.get('verbosity',fcp.NOISY)
  495.     fcpPort=request.json.get('port',9481)
  496.    
  497.  
  498.  
  499.    
  500.     val = request.json.get('message')
  501.     ksk = request.json.get('ksk')
  502.     uri = "KSK@" + ksk
  503.    
  504.     print "Inserting %s, containing '%s'" % (uri, val)
  505.     # do the put - note that 'data=' inserts a string directly
  506.     # note too that mimetype is optional, defaulting to text/plain
  507.     #node.put("KSK@"+ksk, data=val, mimetype="text/plain")
  508.     # ------------------------------------------
  509.     # now, demonstrate asynchronous requests    
  510.     print "Launching asynchronous request"
  511.     body = queue.Queue()    
  512.     lgrCnt=loggerContainer(body=body)    
  513.  
  514.     node = fcp.FCPNode(host=fcpHost,verbosity=fcp.NOISY,port=fcpPort,logfunc=lgrCnt.logfunc)    
  515.    
  516.  
  517.  
  518.     loggerContainer.node=node # We don't use this yet    
  519.  
  520.     aStartCB = lambda: node.put(uri, data=val, async=True)  #Can I start a thread with a lambda expression?      
  521.     worker = FreeWorkerFactory(loggerContainer=lgrCnt,startCB=aStartCB,body=body)
  522.     #g = Greenlet(worker.on_data) Due to dependencies create this in the worker factory.
  523.     #lgrCnt.greenlet=g  
  524.  
  525.  
  526.  
  527.  
  528.  
  529.    
  530. #    loggerContainer.job=job
  531. #    loggerContainer.node=node
  532. #    jobs["KSK@"+ksk]=job    
  533.  
  534. #    #node.logfunc=lgrCnt.logfunc
  535. #    job._log=lgrCnt.getLogger()
  536. #    job.callback=lgrCnt.getCallback()
  537.    
  538.    
  539.     body, g = worker.start() #Returns the greenelet
  540.     #body = gevent.queue.Queue()    
  541.     #worker = getFreenetWorker(job)
  542.     #worker.on_data(body.put)
  543.     #Finish https://stackoverflow.com/questions/20824218/how-to-implement-someasyncworker-from-bottle-asynchronous-primer
  544.     #worker.on_finish(lambda: body.put(StopIteration)) #    body.put('</body></html>')      
  545.  
  546.     return body      
  547.     #yield job_waitt("KSK@"+ksk)
  548.     #return "KSK Inserted" # We probably want to do wsomething smarter than this.
  549.    
  550.     # or we can await its completion
  551.  
  552. #@app.route('/USK@<hashKey:nocomma>,<ecryptionKey:nocomma>,<encryption:nocomma>/<metaData:path>')
  553. #def hello(hashKey,ecryptionKey,encryption,metaData):
  554. #    
  555. #    mimetype, val1 = node.get(uri)
  556. #    return ('hashKey=' + hashKey + '<br>' +
  557. #             'ecryptionKey=' + ecryptionKey + '<br>' +
  558. #             'encryption=' + encryption + '<br>' +
  559. #             'metaData='   + metaData)
  560. #            
  561. #Regular eressions use a seperate filter; https://bottlepy.org/docs/dev/routing.html
  562. app.run(host='localhost', port=8082, debug=True)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement