Last active
December 15, 2015 01:39
-
-
Save hirokiky/5181190 to your computer and use it in GitHub Desktop.
The decorator named 'node' takes mapping and call next wsgi apprication. The mapping's key is URL pattern you want to match, and the value is a name for a function which will be called when the key pattern matches to URL. In this example, '/a/' calls node2, '/b/' calls node3, '/' calls node1 and '/b/a/' calls node1 too.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from wsgiref.simple_server import make_server | |
from webob.dec import wsgify | |
def node(mapping): | |
def deco(func): | |
def wrapper(request): | |
try: | |
called_count = request.environ['nodechain.chaincount'] | |
except KeyError: | |
called_count = 0 | |
node_name = request.path_info.split('/')[called_count+1] # /a/b/c => a | |
node = mapping.get(node_name) | |
if not node: | |
node = func | |
else: | |
from os.path import basename, splitext | |
name, _ = splitext(basename(__file__)) | |
mod = __import__(name) | |
if hasattr(mod, node): | |
node = getattr(mod, node) | |
else: | |
node = func | |
try: | |
request.environ['nodechain.chaincount'] += 1 | |
except KeyError: | |
request.environ['nodechain.chaincount'] = 1 | |
response = node(request) | |
return response | |
return wrapper | |
return deco | |
@wsgify | |
def node2(request): | |
return "OK. I'm node2" | |
@wsgify | |
@node({'a': 'node1', 'b': 'node2'}) | |
def node3(request): | |
return "OK. I'm node3" | |
@wsgify | |
@node({'a': 'node2', 'b': 'node3'}) | |
def node1(request): | |
return "OK. I'm node1" | |
if __name__ == '__main__': | |
httpd = make_server('', 8080, node1) | |
httpd.serve_forever() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment