Without being able to see the implementation of action_config this is just
a guess/check exercise. My first guess is that you're calling scan()
multiple times with overlapping options that are possibly scanning that
module multiple times.

You said you tried using view_defaults and removing action_config, which of
course does nothing if you didn't replace the action_config calls with the
appropriate view_config calls.

Also if action_config is using view_config directly, instead of
implementing its own venusian callback, there will be issues here unless
you are using 1.4 and overriding the depth argument to view_config.


On Thu, Dec 6, 2012 at 11:54 AM, ian marcinkowski <[email protected]
> wrote:

> 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.
>
>

-- 
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.

Reply via email to