コード例 #1
0
def handle(mapping, fvars=None):
    """
    Call the appropriate function based on the url to function mapping in `mapping`.
    If no module for the function is specified, look up the function in `fvars`. If
    `fvars` is empty, using the caller's context.

    `mapping` should be a tuple of paired regular expressions with function name
    substitutions. `handle` will import modules as necessary.
    """
    for url, ofno in utils.group(mapping, 2):
        if isinstance(ofno, tuple):
            ofn, fna = ofno[0], list(ofno[1:])
        else:
            ofn, fna = ofno, []
        fn, result = utils.re_subm('^' + url + '$', ofn, web.ctx.path)
        if result:  # it's a match
            if fn.split(' ', 1)[0] == "redirect":
                url = fn.split(' ', 1)[1]
                if web.ctx.method == "GET":
                    x = web.ctx.env.get('QUERY_STRING', '')
                    if x:
                        url += '?' + x
                return http.redirect(url)
            elif '.' in fn:
                x = fn.split('.')
                mod, cls = '.'.join(x[:-1]), x[-1]
                mod = __import__(mod, globals(), locals(), [""])
                cls = getattr(mod, cls)
            else:
                cls = fn
                mod = fvars
                if isinstance(mod, types.ModuleType):
                    mod = vars(mod)
                try:
                    cls = mod[cls]
                except KeyError:
                    return web.notfound()

            meth = web.ctx.method
            if meth == "HEAD":
                if not hasattr(cls, meth):
                    meth = "GET"
            if not hasattr(cls, meth):
                return nomethod(cls)
            tocall = getattr(cls(), meth)
            args = list(result.groups())
            for d in re.findall(r'\\(\d+)', ofn):
                args.pop(int(d) - 1)
            return tocall(*([urllib.unquote(x) for x in args] + fna))

    return web.notfound()
コード例 #2
0
ファイル: request.py プロジェクト: 1ngmar/ianki
def handle(mapping, fvars=None):
    """
    Call the appropriate function based on the url to function mapping in `mapping`.
    If no module for the function is specified, look up the function in `fvars`. If
    `fvars` is empty, using the caller's context.

    `mapping` should be a tuple of paired regular expressions with function name
    substitutions. `handle` will import modules as necessary.
    """
    for url, ofno in utils.group(mapping, 2):
        if isinstance(ofno, tuple): 
            ofn, fna = ofno[0], list(ofno[1:])
        else: 
            ofn, fna = ofno, []
        fn, result = utils.re_subm('^' + url + '$', ofn, web.ctx.path)
        if result: # it's a match
            if fn.split(' ', 1)[0] == "redirect":
                url = fn.split(' ', 1)[1]
                if web.ctx.method == "GET":
                    x = web.ctx.env.get('QUERY_STRING', '')
                    if x: 
                        url += '?' + x
                return http.redirect(url)
            elif '.' in fn: 
                x = fn.split('.')
                mod, cls = '.'.join(x[:-1]), x[-1]
                mod = __import__(mod, globals(), locals(), [""])
                cls = getattr(mod, cls)
            else:
                cls = fn
                mod = fvars
                if isinstance(mod, types.ModuleType): 
                    mod = vars(mod)
                try: 
                    cls = mod[cls]
                except KeyError: 
                    return web.notfound()
            
            meth = web.ctx.method
            if meth == "HEAD":
                if not hasattr(cls, meth): 
                    meth = "GET"
            if not hasattr(cls, meth): 
                return nomethod(cls)
            tocall = getattr(cls(), meth)
            args = list(result.groups())
            for d in re.findall(r'\\(\d+)', ofn):
                args.pop(int(d) - 1)
            return tocall(*([x and urllib.unquote(x) for x in args] + fna))

    return web.notfound()
コード例 #3
0
ファイル: application.py プロジェクト: alustig/OSPi
 def internal(self, arg):
     if '/' in arg:
         first, rest = arg.split('/', 1)
         func = prefix + first
         args = ['/' + rest]
     else:
         func = prefix + arg
         args = []
     
     if hasattr(self, func):
         try:
             return getattr(self, func)(*args)
         except TypeError:
             raise web.notfound()
     else:
         raise web.notfound()
コード例 #4
0
    def internal(self, arg):
        if '/' in arg:
            first, rest = arg.split('/', 1)
            func = prefix + first
            args = ['/' + rest]
        else:
            func = prefix + arg
            args = []

        if hasattr(self, func):
            try:
                return getattr(self, func)(*args)
            except TypeError:
                raise web.notfound()
        else:
            raise web.notfound()
コード例 #5
0
 def _delegate(self, f, fvars, args=[]):
     def handle_class(cls):
         meth = web.ctx.method
         if meth == 'HEAD' and not hasattr(cls, meth):
             meth = 'GET'
         if not hasattr(cls, meth):
             raise web.nomethod(cls)
         tocall = getattr(cls(), meth)
         return tocall(*args)
         
     def is_class(o): return isinstance(o, (types.ClassType, type))
         
     if f is None:
         raise NotFound
     elif isinstance(f, application):
         return f.handle()
     elif is_class(f):
         return handle_class(f)
     elif isinstance(f, str):
         if '.' in f:
             x = f.split('.')
             mod, cls = '.'.join(x[:-1]), x[-1]
             mod = __import__(mod, globals(), locals(), [""])
             cls = getattr(mod, cls)
         else:
             cls = fvars[f]
         return handle_class(cls)
     elif hasattr(f, '__call__'):
         return f()
     else:
         return web.notfound()
コード例 #6
0
ファイル: application.py プロジェクト: acgourley/watchdog
    def _delegate(self, f, fvars, args=[]):
        def handle_class(cls):
            meth = web.ctx.method
            if meth == "HEAD" and not hasattr(cls, meth):
                meth = "GET"
            if not hasattr(cls, meth):
                raise web.nomethod(cls)
            tocall = getattr(cls(), meth)
            return tocall(*args)

        def is_class(o):
            return isinstance(o, (types.ClassType, type))

        if f is None:
            raise NotFound
        elif isinstance(f, application):
            return f.handle()
        elif is_class(f):
            return handle_class(f)
        elif isinstance(f, str):
            if "." in f:
                x = f.split(".")
                mod, cls = ".".join(x[:-1]), x[-1]
                mod = __import__(mod, globals(), locals(), [""])
                cls = getattr(mod, cls)
            else:
                cls = fvars[f]
            return handle_class(cls)
        elif hasattr(f, "__call__"):
            return f()
        else:
            return web.notfound()
コード例 #7
0
ファイル: application.py プロジェクト: kindy61/webpy
 def _delegate(self, f, fvars, args=[]):
     def handle_class(cls):
         meth = web.ctx.method
         if meth == 'HEAD' and not hasattr(cls, meth):
             meth = 'GET'
         if not hasattr(cls, meth):
             raise web.nomethod(cls)
         tocall = getattr(cls(), meth)
         return tocall(*args)
         
     def is_class(o): return isinstance(o, (types.ClassType, type))
         
     if f is None:
         raise web.notfound()
     elif isinstance(f, application):
         return f.handle_with_processors()
     elif is_class(f):
         return handle_class(f)
     elif isinstance(f, basestring):
         if f.startswith('redirect '):
             url = f.split(' ', 1)[1]
             if web.ctx.method == "GET":
                 x = web.ctx.env.get('QUERY_STRING', '')
                 if x:
                     url += '?' + x
             raise web.redirect(url)
         elif '.' in f:
             x = f.split('.')
             if not len(x) == len(filter(None, x)):
                 raise web.internalerror()
             mod, cls = '.'.join(x[:-1]), x[-1]
             try:
                 mod = __import__(mod, globals(), locals(), [""])
             except: raise web.notfound()
             cls = getattr(mod, cls)
         else:
             cls = fvars.get(f)
         if cls:
             return handle_class(cls)
         else:
             raise web.notfound()
     elif hasattr(f, '__call__'):
         return f(*args)
     else:
         raise web.notfound()
コード例 #8
0
 def internal(*a, **kw):
     i = web.input(_method='get')
     if '_t' in i:
         try:
             t = background.threaddb[int(i._t)]
         except KeyError:
             return web.notfound()
         web._context[threading.currentThread()] = web._context[t]
         return
     else:
         return func(*a, **kw)
コード例 #9
0
 def internal(*a, **kw):
     i = web.input(_method='get')
     if '_t' in i:
         try:
             t = background.threaddb[int(i._t)]
         except KeyError:
             return web.notfound()
         web._context[threading.currentThread()] = web._context[t]
         return
     else:
         return func(*a, **kw)
コード例 #10
0
    def _delegate(self, f, fvars, args=[]):
        def handle_class(cls):
            meth = web.ctx.method
            if meth == 'HEAD' and not hasattr(cls, meth):
                meth = 'GET'
            if not hasattr(cls, meth):
                raise web.nomethod(cls)
            tocall = getattr(cls(), meth)
            return tocall(*args)

        def is_class(o):
            return isinstance(o, (types.ClassType, type))

        if f is None:
            raise web.notfound()
        elif isinstance(f, application):
            return f.handle_with_processors()
        elif is_class(f):
            return handle_class(f)
        elif isinstance(f, basestring):
            if f.startswith('redirect '):
                url = f.split(' ', 1)[1]
                if web.ctx.method == "GET":
                    x = web.ctx.env.get('QUERY_STRING', '')
                    if x:
                        url += '?' + x
                raise web.redirect(url)
            elif '.' in f:
                x = f.split('.')
                mod, cls = '.'.join(x[:-1]), x[-1]
                mod = __import__(mod, globals(), locals(), [""])
                cls = getattr(mod, cls)
            else:
                cls = fvars[f]
            return handle_class(cls)
        elif hasattr(f, '__call__'):
            return f()
        else:
            return web.notfound()
コード例 #11
0
    def _delegate(self, f, fvars, args=[]):
        def handle_class(cls):
            meth = web.ctx.method
            if meth == "HEAD" and not hasattr(cls, meth):
                meth = "GET"
            if not hasattr(cls, meth):
                raise web.nomethod(cls)
            tocall = getattr(cls(), meth)
            return tocall(*args)

        def is_class(o):
            return isinstance(o, (types.ClassType, type))

        if f is None:
            raise web.notfound()
        elif isinstance(f, application):
            return f.handle_with_processors()
        elif is_class(f):
            return handle_class(f)
        elif isinstance(f, basestring):
            if f.startswith("redirect "):
                url = f.split(" ", 1)[1]
                if web.ctx.method == "GET":
                    x = web.ctx.env.get("QUERY_STRING", "")
                    if x:
                        url += "?" + x
                raise web.redirect(url)
            elif "." in f:
                x = f.split(".")
                mod, cls = ".".join(x[:-1]), x[-1]
                mod = __import__(mod, globals(), locals(), [""])
                cls = getattr(mod, cls)
            else:
                cls = fvars[f]
            return handle_class(cls)
        elif hasattr(f, "__call__"):
            return f()
        else:
            return web.notfound()
コード例 #12
0
ファイル: application.py プロジェクト: alustig/OSPi
 def _delegate(self, f, fvars, args=[]):
     def handle_class(cls):
         meth = web.ctx.method
         if meth == 'HEAD' and not hasattr(cls, meth):
             meth = 'GET'
         if not hasattr(cls, meth):
             raise web.nomethod(cls)
         tocall = getattr(cls(), meth)
         return tocall(*args)
         
     def is_class(o): return isinstance(o, (types.ClassType, type))
         
     if f is None:
         raise web.notfound()
     elif isinstance(f, application):
         return f.handle_with_processors()
     elif is_class(f):
         return handle_class(f)
     elif isinstance(f, basestring):
         if f.startswith('redirect '):
             url = f.split(' ', 1)[1]
             if web.ctx.method == "GET":
                 x = web.ctx.env.get('QUERY_STRING', '')
                 if x:
                     url += '?' + x
             raise web.redirect(url)
         elif '.' in f:
             mod, cls = f.rsplit('.', 1)
             mod = __import__(mod, None, None, [''])
             cls = getattr(mod, cls)
         else:
             cls = fvars[f]
         return handle_class(cls)
     elif hasattr(f, '__call__'):
         return f()
     else:
         return web.notfound()