On Jan 3, 2011, at 8:29 PM, VP wrote:
> 
> Questions:
> 
> 1. Shouldn't app1 or app2 be one of the 5 apps specified in
> "applications"?

This is a somewhat subtle point. The role of "applications" is to help identify 
ambiguities. If there's a controller or function name that collides with an 
application name, then we have to give the application name priority: if we see 
that name as the first element of a URL, it must be the application.

But in the example, app1 and app2 are domain-mapped apps, corresponding to 
domain1.com and domain2.com. My convention is that all accesses to app1 and 
app2 will come via domain1 & domain2, so we can ignore ambiguities associated 
with other domains. This is a somewhat arbitrary choice, since the developer 
might want to access those apps from (for example) localhost. In that case, you 
*would* want to include app1 and app2 in "applications". But for maximum URL 
reduction, you can leave them out.

> 
> 2. Does this (controllers = ['myctlr', 'ctr']) all apps (app1, app2 in
> particular) must have 2 controllers named "myctlr" and "ctr"?

No. In the base router (the one in the root routes.py), "controllers" applies 
only to the default application. Values for "controllers" for other apps must 
be specified in app-specific routers.

I'll be checking in a new feature in a day or two that allows you to define 
app-specific routers in the root routes.py.


> 
> 
> 
> 
> On Jan 3, 8:28 pm, Jonathan Lundell <jlund...@pobox.com> wrote:
>> The new URL routing facility that I described a few days ago is now in the 
>> trunk. Iprovides fairly powerful rewriting with very simple configuration 
>> and no regexes. The configuration is described below.
>> 
>> WARNING: this is beta-quality code. There are surely bugs in it, and the 
>> API/configuration will no doubt change a little. On the other hand, it's 
>> simple to configure, and I'd appreciate as much testing as possible.
>> 
>> You should see *no* change in routing behavior if you do not add a router 
>> entry to routes.py. Please notify me ASAP if you notice anything to the 
>> contrary.
>> 
>> Features:
>> 
>> * remove default application/controller names from URLs
>> 
>> * support domain<->app mapping (no visible app names)
>> 
>> * support language codes embedded in URLs: /app/en/ctlr/fcn/args
>> 
>> * handle static files, including root-based files like favicon.ico, 
>> automatically
>> 
>> * make full URL-legal character set available for args and vars
>>  (This was the original driver for making the changes, since it was 
>> essentially impossible to
>>   retrofit into the existing rewrite system. The secondary goal was to 
>> address 99% of required
>>   functionality while keeping configuration as close to trivial as possible.)
>> 
>> * app-specific routing
>> 
>> The new logic is selected in routes.py. The old regex logic remains 
>> available, though not simultaneously.
>> 
>> The language feature is not yet tied into web2py's existing language 
>> support, so for now all you get is URL conversion and support for 
>> language-specific subdirectories in app/static.
>> 
>> There's a new routing example file called router.example.py that has some 
>> documentation, reproduced below. As with routes.example.py, you copy it to 
>> routes.py and edit it for your own configuration.
>> 
>> #  router is a dictionary of URL routing parameters.
>> #
>> #  For each request, the effective router is the default router (below),
>> #  updated by the base router (if any) from routes.py,
>> #  updated by the relevant application-specific router (if any)
>> #  from applications/app/routes.py.
>> #
>> #  Optional members of base router:
>> #
>> #  default_application: default application name
>> #  applications: list of all recognized applications,
>> #       or 'ALL' to use all currently installed applications
>> #  map_domain: dict used to map domain names to application names
>> #
>> #  These values may be overridden by app-specific routers:
>> #
>> #  default_controller: name of default controller
>> #  default_function: name of default function (all controllers)
>> #  root_static: list of static files accessed from root
>> #       (mapped to the selected application's static/ directory)
>> #
>> #
>> #  Optional members of application-specific router:
>> #
>> #  These values override those in the base router:
>> #
>> #  default_controller
>> #  default_function
>> #  root_static
>> #
>> #  When these appear in the base router, they apply to the default 
>> application only:
>> #
>> #  controllers: list of valid controllers in selected app
>> #       or "DEFAULT" to use all controllers in the selected app plus 'static'
>> #       or [] to disable controller-name omission
>> #  languages: list of all supported languages
>> #  default_language
>> #       The language code (for example: en, it-it) optionally appears in the 
>> URL following
>> #       the application (which may be omitted). For incoming URLs, the code 
>> is copied to
>> #       request.language; for outgoing URLs it is taken from 
>> request.language.
>> #       If languages=[], language support is disabled.
>> #       The default_language, if any, is omitted from the URL.
>> #  check_args: set to False to suppress arg checking
>> #       request.raw_args always contains a list of raw args from the URL, 
>> not unquoted
>> #       request.args are the same values, unquoted
>> #       By default (check_args=True), args are required to match args_match.
>> #  acfe_match: regex for valid application, controller, function, extension 
>> /a/c/f.e
>> #  file_match: regex for valid file (used for static file names)
>> #  args_match: regex for valid args (see also check_args flag)
>> #
>> #
>> #  The built-in default router supplies default values (undefined members 
>> are None):
>> #
>> #     router = dict(
>> #         default_application = 'init',
>> #             applications = 'ALL',
>> #         default_controller = 'default',
>> #             controllers = 'DEFAULT',
>> #         default_function = 'index',
>> #         root_static = ['favicon.ico', 'robots.txt'],
>> #         map_domain = dict(),
>> #         languages = [],
>> #         default_language = None,
>> #         check_args = True,
>> #         map_hyphen = True,
>> #         acfe_match = r'\w+$',              # legal app/ctlr/fcn/ext
>> #         file_match = r'(\w+[-=./]?)+$',    # legal file (path) name
>> #         args_match = r'([\w@ -]+[=.]?)+$', # legal arg in args
>> #     )
>> #
>> #  See rewrite.map_url_in() and rewrite.map_url_out() for implementation 
>> details.
>> 
>> #  This simple router overrides only the default application name,
>> #  but provides full rewrite functionality.
>> #
>> #  router = dict(
>> #     default_application = 'welcome',
>> #  )
>> 
>> #  This router supports the doctests below; it's not very realistic.
>> #
>> router = dict(
>>     applications = ['welcome', 'admin', 'app', 'myapp', 'bad!app'],
>>     default_application = 'myapp',
>>     controllers = ['myctlr', 'ctr'],
>>     default_controller = 'myctlr',
>>     default_function = 'myfunc',
>>     languages = ['en', 'it', 'it-it'],
>>     default_language = 'en',
>>     map_domain = {
>>         "domain1.com" : "app1",
>>         "domain2.com" : "app2"
>>     },
>> )


Reply via email to