123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- # -*- coding: utf-8 -*-
- '''
- autoroutes writes routes for you based on a simpler routing
- configuration file called routes.conf. Example:
- ----- BEGIN routes.conf-------
- 127.0.0.1 /examples/default
- domain1.com /app1/default
- domain2.com /app2/default
- domain3.com /app3/default
- ----- END ----------
- It maps a domain (the left-hand side) to an app (one app per domain),
- and shortens the URLs for the app by removing the listed path prefix. That means:
- http://domain1.com/index is mapped to /app1/default/index
- http://domain2.com/index is mapped to /app2/default/index
- It preserves admin, appadmin, static files, favicon.ico and robots.txt:
- http://domain1.com/favicon.ico /welcome/static/favicon.ico
- http://domain1.com/robots.txt /welcome/static/robots.txt
- http://domain1.com/admin/... /admin/...
- http://domain1.com/appadmin/... /app1/appadmin/...
- http://domain1.com/static/... /app1/static/...
- and vice-versa.
- To use, cp scripts/autoroutes.py routes.py
- and either edit the config string below, or set config = "" and edit routes.conf
- '''
- config = '''
- 127.0.0.1 /examples/default
- domain1.com /app1/default
- domain2.com /app2/default
- domain3.com /app3/defcon3
- '''
- if not config.strip():
- try:
- config_file = open('routes.conf', 'r')
- try:
- config = config_file.read()
- finally:
- config_file.close()
- except:
- config = ''
- def auto_in(apps):
- routes = [
- ('/robots.txt', '/welcome/static/robots.txt'),
- ('/favicon.ico', '/welcome/static/favicon.ico'),
- ('/admin$anything', '/admin$anything'),
- ]
- for domain, path in [x.strip().split() for x in apps.split('\n') if x.strip() and not x.strip().startswith('#')]:
- if not path.startswith('/'):
- path = '/' + path
- if path.endswith('/'):
- path = path[:-1]
- app = path.split('/')[1]
- routes += [
- ('.*:https?://(.*\.)?%s:$method /' % domain, '%s' % path),
- ('.*:https?://(.*\.)?%s:$method /static/$anything' %
- domain, '/%s/static/$anything' % app),
- ('.*:https?://(.*\.)?%s:$method /appadmin/$anything' %
- domain, '/%s/appadmin/$anything' % app),
- ('.*:https?://(.*\.)?%s:$method /$anything' %
- domain, '%s/$anything' % path),
- ]
- return routes
- def auto_out(apps):
- routes = []
- for domain, path in [x.strip().split() for x in apps.split('\n') if x.strip() and not x.strip().startswith('#')]:
- if not path.startswith('/'):
- path = '/' + path
- if path.endswith('/'):
- path = path[:-1]
- app = path.split('/')[1]
- routes += [
- ('/%s/static/$anything' % app, '/static/$anything'),
- ('/%s/appadmin/$anything' % app, '/appadmin/$anything'),
- ('%s/$anything' % path, '/$anything'),
- ]
- return routes
- routes_in = auto_in(config)
- routes_out = auto_out(config)
- def __routes_doctest():
- '''
- Dummy function for doctesting autoroutes.py.
- Use filter_url() to test incoming or outgoing routes;
- filter_err() for error redirection.
- filter_url() accepts overrides for method and remote host:
- filter_url(url, method='get', remote='0.0.0.0', out=False)
- filter_err() accepts overrides for application and ticket:
- filter_err(status, application='app', ticket='tkt')
- >>> filter_url('http://domain1.com/favicon.ico')
- 'http://domain1.com/welcome/static/favicon.ico'
- >>> filter_url('https://domain2.com/robots.txt')
- 'https://domain2.com/welcome/static/robots.txt'
- >>> filter_url('http://domain3.com/fcn')
- 'http://domain3.com/app3/defcon3/fcn'
- >>> filter_url('http://127.0.0.1/fcn')
- 'http://127.0.0.1/examples/default/fcn'
- >>> filter_url('HTTP://DOMAIN.COM/app/ctr/fcn')
- 'http://domain.com/app/ctr/fcn'
- >>> filter_url('http://domain.com/app/ctr/fcn?query')
- 'http://domain.com/app/ctr/fcn?query'
- >>> filter_url('http://otherdomain.com/fcn')
- 'http://otherdomain.com/fcn'
- >>> regex_filter_out('/app/ctr/fcn')
- '/app/ctr/fcn'
- >>> regex_filter_out('/app1/ctr/fcn')
- '/app1/ctr/fcn'
- >>> filter_url('https://otherdomain.com/app1/default/fcn', out=True)
- '/fcn'
- >>> filter_url('http://otherdomain.com/app2/ctr/fcn', out=True)
- '/app2/ctr/fcn'
- >>> filter_url('http://domain1.com/app1/default/fcn?query', out=True)
- '/fcn?query'
- >>> filter_url('http://domain2.com/app3/defcon3/fcn#anchor', out=True)
- '/fcn#anchor'
- '''
- pass
- if __name__ == '__main__':
- try:
- import gluon.main
- except ImportError:
- import sys
- import os
- os.chdir(os.path.dirname(os.path.dirname(__file__)))
- sys.path.append(os.path.dirname(os.path.dirname(__file__)))
- import gluon.main
- from gluon.rewrite import regex_select, load, filter_url, regex_filter_out
- regex_select() # use base routing parameters
- load(routes=__file__) # load this file
- import doctest
- doctest.testmod()
|