博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Medusa-dev] psp_handler - embed python in HTML like ASP
阅读量:2207 次
发布时间:2019-05-04

本文共 8613 字,大约阅读时间需要 28 分钟。

[Medusa-dev] psp_handler - embed python in HTML like ASP

Kevin Smith
Sun Apr 27 13:27:49 EDT 2003

 

  • Previous message:
  • Next message:
  • Messages sorted by:

Hi, I have created a psp_handler (Python Server Pages???) for medusabased on the script_handler.  This handler lets you mix HTML with pythonlike ASP pages.  The handler can be installed on the server in the sammanner as the script handler.  Here is an example hello.psp file...Medusa PSP Handler<%pspprint "hello world"%>I have been using this handler for much more useful applications ofcourse :).  Just wrap the inline python with <%psp ... %> tags. Here is the handler...# -*- Mode: Python -*-# This is a simple python server pages script handler.# A note about performance: This is really only suited for 'fast'# scripts: The script should generate its output quickly, since the# whole web server will stall otherwise.  This doesn't mean you have# to write 'fast code' or anything, it simply means that you shouldn't# call any long-running code, [like say something that opens up an# internet connection, or a database query that will hold up the# server].  If you need this sort of feature, you can support it using# the asynchronous I/O 'api' that the rest of medusa is built on.  [or# you could probably use threads]# Put your script into your web docs directory (like a cgi-bin# script), make sure it has the correct extension [see the overridable# script_handler.extension member below].## There's lots of things that can be done to tweak the restricted# execution model.  Also, of course you could just use 'execfile'# instead (this is now the default, see class variable# script_handler.restricted)import rexecimport reimport stringimport StringIOimport sysimport counterimport default_handlerimport producersfrom script_handler import collectorunquote    = default_handler.unquotedef iif(expression,truepart,falsepart):    if expression:        return truepart    else:        return falsepartclass psp_handler:     extension = 'psp'    # the following should not get overridden!    fp = None    script = ''    data = ''    insidePsp = False        script_regex = re.compile (            r'.*/([^/]+\.%s)' % extension,            re.IGNORECASE            )    def __init__ (self,filesystem,restricted=False,preserveNamespace=True):        self.filesystem = filesystem        self.hits = counter.counter()        self.exceptions = counter.counter()        self.restricted = restricted        self.preserveNamespace = preserveNamespace    def match (self, request):        [path, params, query, fragment] = request.split_uri()        m = self.script_regex.match (path)        return (m and (m.end() == len(path)))    def handle_request (self, request):        [path, params, query, fragment] = request.split_uri()        while path and path[0] == '/':            path = path[1:]        if '%' in path:            path = unquote (path)        if not self.filesystem.isfile (path):            request.error (404)            return        else:            self.hits.increment()            request.script_filename = self.filesystem.translate (path)            if request.command in ('PUT', 'POST'):                # look for a Content-Length header.                cl = request.get_header ('content-length')                length = int(cl)                if not cl:                    request.error (411)                else:                    collector (self, length, request)            else:                self.continue_request (                        request,                        StringIO.StringIO() # empty stdin                        )    def continue_request (self, request, stdin):        temp_files = stdin, StringIO.StringIO(), StringIO.StringIO()        old_files = sys.stdin, sys.stdout, sys.stderr        try:            sys.request = request            sys.stdin, sys.stdout, sys.stderr = temp_files            try:                #get the path from the uri and open the file with thefilesystem class                try:                    file =self.filesystem.open(request.split_uri()[0],'r')                except IOError:                    request.error (404)                    return                self.fp = producers.file_producer(file)                self.dissect_psp(request)                request.reply_code = 200            except:                request.reply_code = 500                self.exceptions.increment()        finally:            sys.stdin, sys.stdout, sys.stderr = old_files            del sys.request        i,o,e = temp_files        if request.reply_code != 200:            s = e.getvalue()        else:            s = o.getvalue()        request['Content-Length'] = len(s)        request.push (s)        request.done()    def status (self):        return producers.simple_producer (                '
  • PSP - Python Server Pages Handler' + '
      ' + '
    • Hits: %s' % self.hits + '
    • Exceptions: %s' % self.exceptions + '
    • Execution Mode:%s' %iif(self.restricted,'Restricted','Unrestricted' ) + '
    • Namespace::%sPreserved' %iif(self.preserveNamespace,'','not ' ) + '
    ' ) ## this function reads the file using the file producer and sends ## the data to the client until the script start tag '<%psp' ## is found. All of the text between the script start marker ## '<%psp' and the end script marker '%>' is executed as ## python script. def dissect_psp(self,request): self.insidePsp = False self.script = '' while not self.fp.done: self.data=self.fp.more() #print the HTML to the stdout, execute the python script... while self.data: if self.insidePsp: sectiοnend=self.data.find("%>") if (sectionend == -1): #end of script section is not in the currentchunk self.script += self.data self.data = '' else: #end of script section is within the currentchunk self.script += self.data[:sectionend] self.data = self.data[sectionend+len("%>"):] del sectionend if self.preserveNamespace: if self.restricted: r = rexec.RExec() try: if self.restricted: r.s_exec (self.script) else: exec (self.script) request.reply_code = 200 except: request.reply_code = 500 self.exceptions.increment() else: self.script_exec(request,self.script) self.script = '' self.insidePsp = False else: sectiοnend=self.data.find("<%psp") if (sectionend == -1): #end of HTML section is not in the current chunk print self.data self.data = '' else: #end of HTML section is within the current chunk print self.data[:sectionend] self.data = self.data[sectionend+len("<%psp"):] self.insidePsp = True # this function will eliminate any of the unnecessary objects # from appearing in the script namespace. print dir() should # return only self,request, and script. # one drawback with this method is that namespace is cleared # for each section of script in the document. def script_exec(self,request,script): # for debugging we can send a copy of the script to the browser. # this presents security issues so this next line should be # commented out. if self.restricted: r = rexec.RExec() try: if self.restricted: r.s_exec (script) else: exec (script) request.reply_code = 200 except: request.reply_code = 500 self.exceptions.increment()

  •  

    • Previous message:
    • Next message:
    • Messages sorted by:

    posted on
    2014-05-14 21:50  阅读(
    ...) 评论(
    ...) 收藏

    转载于:https://www.cnblogs.com/lexus/p/3728755.html

    你可能感兴趣的文章
    【LEETCODE】290-Word Pattern
    查看>>
    【LEETCODE】36-Valid Sudoku
    查看>>
    【LEETCODE】205-Isomorphic Strings
    查看>>
    【LEETCODE】204-Count Primes
    查看>>
    【LEETCODE】228-Summary Ranges
    查看>>
    【LEETCODE】27-Remove Element
    查看>>
    【LEETCODE】66-Plus One
    查看>>
    【LEETCODE】26-Remove Duplicates from Sorted Array
    查看>>
    【LEETCODE】118-Pascal's Triangle
    查看>>
    【LEETCODE】119-Pascal's Triangle II
    查看>>
    【LEETCODE】190-Reverse Bits
    查看>>
    【LEETCODE】67-Add Binary
    查看>>
    【LEETCODE】223-Rectangle Area
    查看>>
    【LEETCODE】12-Integer to Roman
    查看>>
    【学习方法】如何分析源代码
    查看>>
    【LEETCODE】61- Rotate List [Python]
    查看>>
    【算法】- 动态规划的编织艺术
    查看>>
    用 TensorFlow 让你的机器人唱首原创给你听
    查看>>
    深度学习的主要应用举例
    查看>>
    word2vec 模型思想和代码实现
    查看>>