I am having a problem using the view_config decorator.
We have extended the view_config decorator to automatically include
the match_param
attribute. This new decorator is called action_config. I have
already eliminated
this as the source of my troubles, as the stock view_config decorator raises
the same errors.
I have 2 routes, 'contact' and 'contact id' that are being used by 4
view callables on a ContactHandler class. Only 1 of the view callables is using
the 'contact id' route while the other 3 use the 'contact' route.
(Note: Our project is using namespace packages, so application.lib is
located at application.lib/application/lib on disk, for example)
Routes
application/module/__init__.py:
...
config.add_route('contact',
'/contact/{action}',
factory='application.lib.contexts:ContactFactory')
config.add_route('contact id',
'/contact/{action}/{contact_id}',
factory='application.lib.contexts:ContactFactory')
config.scan('application.lib.handlers')
...
Callables
application.lib/application/lib/handlers/contact.py:
class ContactHandler(Handler):
@action_config(route_name='contact id')
def edit(self):
""" Add or edit a contact """
...
@action_config(route_name='contact')
def index(self):
""" Return list of contacts. """
...
@action_config(route_name='contact')
def search(self):
""" Return a list of contacts matching search parameters """
...
@action_config(route_name='contact')
def find(self):
""" Find a contacts """
...
I can't figure out how or why these route is conflicting. My application is
only scanning application.lib/application/lib/handlers/contact.py in one place
and each view/callable method is only decorated once, each for a specific route
as defined in my __init__.py.
If I decorate the ContactHandler class with @view_defaults(route_name='contact')
and remove all of the @action_config decorators from my class methods, no errors
are raised. However, this is not ideal as I one route requires an ID parameter
and one does not.
When using pdb.set_trace() inside of the our extended action_config
__call__ method
inside of the callback passed to view_config.venusian.attach(),
I find that the callback is being called 3 times for each of these routes.
I don't know if that is related to the problem.
Stragely, I am using this same action_config decorator in another module
inside of my application with no problems.
The error:
Traceback (most recent call last):
File "~/.virtualenvs/application/bin/paster", line 8, in <module>
load_entry_point('PasteScript==1.7.5', 'console_scripts', 'paster')()
File
"~/.virtualenvs/application/lib/python2.7/site-packages/PasteScript-1.7.5-py2.7.egg/paste/script/command.py",
line 104, in run
invoke(command, command_name, options, args[1:])
File
"~/.virtualenvs/application/lib/python2.7/site-packages/PasteScript-1.7.5-py2.7.egg/paste/script/command.py",
line 143, in invoke
exit_code = runner.run(args)
File
"~/.virtualenvs/application/lib/python2.7/site-packages/PasteScript-1.7.5-py2.7.egg/paste/script/command.py",
line 238, in run
result = self.command()
File
"~/.virtualenvs/application/lib/python2.7/site-packages/PasteScript-1.7.5-py2.7.egg/paste/script/serve.py",
line 284, in command
relative_to=base, global_conf=vars)
File
"~/.virtualenvs/application/lib/python2.7/site-packages/PasteScript-1.7.5-py2.7.egg/paste/script/serve.py",
line 321, in loadapp
**kw)
File
"~/.virtualenvs/application/lib/python2.7/site-packages/PasteDeploy-1.5.0-py2.7.egg/paste/deploy/loadwsgi.py",
line 247, in loadapp
return loadobj(APP, uri, name=name, **kw)
File
"~/.virtualenvs/application/lib/python2.7/site-packages/PasteDeploy-1.5.0-py2.7.egg/paste/deploy/loadwsgi.py",
line 272, in loadobj
return context.create()
File
"~/.virtualenvs/application/lib/python2.7/site-packages/PasteDeploy-1.5.0-py2.7.egg/paste/deploy/loadwsgi.py",
line 710, in create
return self.object_type.invoke(self)
File
"~/.virtualenvs/application/lib/python2.7/site-packages/PasteDeploy-1.5.0-py2.7.egg/paste/deploy/loadwsgi.py",
line 144, in invoke
**context.local_conf)
File
"~/.virtualenvs/application/lib/python2.7/site-packages/PasteDeploy-1.5.0-py2.7.egg/paste/deploy/util.py",
line 56, in fix_call
val = callable(*args, **kw)
File
"~/code/src/application/BRANCH/application.lib/application/lib/middleware/vhost.py",
line 199, in vhost_addict_factory
settings['app'] = loader.get_app(key, global_conf=global_conf)
File
"~/.virtualenvs/application/lib/python2.7/site-packages/PasteDeploy-1.5.0-py2.7.egg/paste/deploy/loadwsgi.py",
line 350, in get_app
name=name, global_conf=global_conf).create()
File
"~/.virtualenvs/application/lib/python2.7/site-packages/PasteDeploy-1.5.0-py2.7.egg/paste/deploy/loadwsgi.py",
line 710, in create
return self.object_type.invoke(self)
File
"~/.virtualenvs/application/lib/python2.7/site-packages/PasteDeploy-1.5.0-py2.7.egg/paste/deploy/loadwsgi.py",
line 146, in invoke
return fix_call(context.object, context.global_conf, **context.local_conf)
File
"~/.virtualenvs/application/lib/python2.7/site-packages/PasteDeploy-1.5.0-py2.7.egg/paste/deploy/util.py",
line 56, in fix_call
val = callable(*args, **kw)
File
"~/code/src/application/BRANCH/application/application/module/__init__.py",
line 137, in main
return config.make_wsgi_app()
File
"~/.virtualenvs/application/lib/python2.7/site-packages/pyramid-1.3.2-py2.7.egg/pyramid/config/__init__.py",
line 921, in make_wsgi_app
self.commit()
File
"~/.virtualenvs/application/lib/python2.7/site-packages/pyramid-1.3.2-py2.7.egg/pyramid/config/__init__.py",
line 594, in commit
self.action_state.execute_actions(introspector=self.introspector)
File
"~/.virtualenvs/application/lib/python2.7/site-packages/pyramid-1.3.2-py2.7.egg/pyramid/config/__init__.py",
line 1030, in execute_actions
for action in resolveConflicts(self.actions):
File
"~/.virtualenvs/application/lib/python2.7/site-packages/pyramid-1.3.2-py2.7.egg/pyramid/config/__init__.py",
line 1136, in resolveConflicts
raise ConfigurationConflictError(conflicts)
pyramid.exceptions.ConfigurationConflictError: Conflicting configuration actions
For: ('view', None, '', None, <InterfaceClass
pyramid.interfaces.IView>, None, None, None, 'contact', 'add', False,
None, None, None, 'action=add')
Line 184 of file
~/code/src/application/BRANCH/application.lib/application/lib/handlers/contact.py:
@action_config(route_name='contact')
Line 184 of file
~/code/src/application/BRANCH/application.lib/application/lib/handlers/contact.py:
@action_config(route_name='contact')
Line 184 of file
~/code/src/application/BRANCH/application.lib/application/lib/handlers/contact.py:
@action_config(route_name='contact')
For: ('view', None, '', None, <InterfaceClass
pyramid.interfaces.IView>, None, None, None, 'contact', 'find', False,
None, None, None, 'action=find')
Line 137 of file
~/code/src/application/BRANCH/application.lib/application/lib/handlers/contact.py:
@action_config(route_name='contact')
Line 137 of file
~/code/src/application/BRANCH/application.lib/application/lib/handlers/contact.py:
@action_config(route_name='contact')
Line 137 of file
~/code/src/application/BRANCH/application.lib/application/lib/handlers/contact.py:
@action_config(route_name='contact')
For: ('view', None, '', None, <InterfaceClass
pyramid.interfaces.IView>, None, None, None, 'contact', 'index',
False, None, None, None, 'action=index')
Line 94 of file
~/code/src/application/BRANCH/application.lib/application/lib/handlers/contact.py:
@action_config(route_name='contact')
Line 94 of file
~/code/src/application/BRANCH/application.lib/application/lib/handlers/contact.py:
@action_config(route_name='contact')
Line 94 of file
~/code/src/application/BRANCH/application.lib/application/lib/handlers/contact.py:
@action_config(route_name='contact')
For: ('view', None, '', None, <InterfaceClass
pyramid.interfaces.IView>, None, None, None, 'contact', 'search',
False, None, None, None, 'action=search')
Line 133 of file
~/code/src/application/BRANCH/application.lib/application/lib/handlers/contact.py:
@action_config(route_name='contact')
Line 133 of file
~/code/src/application/BRANCH/application.lib/application/lib/handlers/contact.py:
@action_config(route_name='contact')
Line 133 of file
~/code/src/application/BRANCH/application.lib/application/lib/handlers/contact.py:
@action_config(route_name='contact')
For: ('view', None, '', None, <InterfaceClass
pyramid.interfaces.IView>, None, None, None, 'contact id', 'edit',
False, None, None, None, 'action=edit')
Line 37 of file
~/code/src/application/BRANCH/application.lib/application/lib/handlers/contact.py:
@action_config(route_name='contact id')
Line 37 of file
~/code/src/application/BRANCH/application.lib/application/lib/handlers/contact.py:
@action_config(route_name='contact id')
Line 37 of file
~/code/src/application/BRANCH/application.lib/application/lib/handlers/contact.py:
@action_config(route_name='contact id')
--
Ian Marcinkowski
[email protected]
--
You received this message because you are subscribed to the Google Groups
"pylons-discuss" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/pylons-discuss?hl=en.