コード例 #1
0
ファイル: wsgidir.py プロジェクト: dolda2000/ashd
 def handle(self, env, startreq):
     if not "SCRIPT_FILENAME" in env:
         log.error("wsgidir called without SCRIPT_FILENAME set")
         return wsgiutil.simpleerror(env, startreq, 500, "Internal Error", "The server is erroneously configured.")
     path = env["SCRIPT_FILENAME"]
     if not os.access(path, os.R_OK):
         log.error("%s: not readable" % path)
         return wsgiutil.simpleerror(env, startreq, 500, "Internal Error", "The server is erroneously configured.")
     if "HTTP_X_ASH_PYTHON_HANDLER" in env:
         try:
             handler = self.resolve(env["HTTP_X_ASH_PYTHON_HANDLER"])
         except Exception:
             log.error("could not load handler %s" % env["HTTP_X_ASH_PYTHON_HANDLER"], exc_info=sys.exc_info())
             return wsgiutil.simpleerror(env, startreq, 500, "Internal Error", "The server is erroneously configured.")
     else:
         base = os.path.basename(path)
         p = base.rfind('.')
         if p < 0:
             log.error("wsgidir called with neither X-Ash-Python-Handler nor a file extension: %s" % path)
             return wsgiutil.simpleerror(env, startreq, 500, "Internal Error", "The server is erroneously configured.")
         ext = base[p + 1:]
         if not ext in self.exts:
             log.error("unregistered file extension: %s" % ext)
             return wsgiutil.simpleerror(env, startreq, 500, "Internal Error", "The server is erroneously configured.")
         handler = self.exts[ext]
     return handler(env, startreq)
コード例 #2
0
ファイル: wsgidir.py プロジェクト: dolda2000/ashd
def chain(env, startreq):
    """Chain-loading WSGI handler
    
    This handler loads requested files, compiles them and loads them
    into their own modules. The compiled modules are cached and reused
    until the file is modified, in which case the previous module is
    discarded and the new file contents are loaded into a new module
    in its place. When chaining such modules, an object named `wmain'
    is first looked for and called with no arguments if found. The
    object it returns is then used as the WSGI application object for
    that module, which is reused until the module is reloaded. If
    `wmain' is not found, an object named `application' is looked for
    instead. If found, it is used directly as the WSGI application
    object.
    """
    path = env["SCRIPT_FILENAME"]
    try:
        mod = getmod(path)
    except Exception:
        log.error("Exception occurred when loading %s" % path, exc_info=sys.exc_info())
        return wsgiutil.simpleerror(env, startreq, 500, "Internal Error", "Could not load WSGI handler.")
    entry = None
    if mod is not None:
        mod.lock.acquire()
        try:
            if hasattr(mod, "entry"):
                entry = mod.entry
            else:
                if hasattr(mod.mod, "wmain"):
                    entry = mod.mod.wmain()
                elif hasattr(mod.mod, "application"):
                    entry = mod.mod.application
                mod.entry = entry
        finally:
            mod.lock.release()
    if entry is not None:
        return entry(env, startreq)
    return wsgiutil.simpleerror(env, startreq, 500, "Internal Error", "Invalid WSGI handler.")