Hi Tom,
I ran into a baffling issue exactly like this yesterday. What I found
out was that I was defining a view as an instance at module scope like
this:
class SomeViewClass(object):
....
wizard = SomeViewClass(...)
wizard_view = view_config(...)(wizard)
When I started up the process, and scanned the package, I would get a
conflict error that pointed at "wizard_view". What was happening was
that I was unwittlingly creating *two* views at module scope by
assigning the result of "view_config" to "wizard_view". When I did this
instead, it all worked:
class SomeViewClass(object):
....
wizard = SomeViewClass(...)
view_config(...)(wizard)
Probably what is happening here is that your code is generating *two*
separately named implementations of the same view and a scan is
registering both, like mine was.
It's unclear how this is happening from the code. You don't mention
below if it works when you use @view_config and @log_event together.
Does that work? If so, then it would point at @t_view.
On Tue, 2010-12-21 at 07:45 -0800, Thomas G. Willis wrote:
> I'm porting a bfg app over to pyramid and getting some strange things
> happening that I don't understand...
>
> first of all, in order to cut down on the cruft I wrote a wrapper
> around view_config(formerly bfg_view) and it looks like this...
>
>
> def t_view(route_name="model", renderer="json", **kw):
> """
> some sugar to for the common things.
> most views have a common route and renderer
>
> **DRY**
> """
> kw["route_name"] = route_name
> kw["renderer"] = renderer
> return view_config(**kw)
>
>
> and I also have a decorator for logging "events"
> def log_event(func):
> @functools.wraps(func)
> def _inner(context, request):
> try:
> result = func(context, request)
> except Exception, ex:
> raise
> else:
> try:
> if hasattr(context, "key"):
> context_obj = context.key()
> else:
> context_obj = None
>
> if hasattr(request, "user"):
> created_by = request.user
> else:
> created_by = None
>
> data = dict(view=request.view_name)
> evt = Event(context_path=context.path,
> context_obj=context_obj,
> created_by=created_by,
> data=json.dumps(data))
> evt.put()
> except Exception, ex:
> log.error(ex)
>
> return result
> return _inner
>
>
>
> I get this error at startup
>
> ConfigurationConflictError: Conflicting configuration actions
> For: ('view', <class 'hydrant.model.user.UserModel'>, 'login', None,
> <InterfaceClass pyramid.interfaces.IView>, None, None, None, 'model',
> None, False, None, None, None)
> ('/Users/twillis/projects/hydrant-pyarmid/src/hydrant/hydrant/
> views/user.py', 21, '<module>', '@log_event')
> ('/Users/twillis/projects/hydrant-pyarmid/src/hydrant/hydrant/
> views/user.py', 21, '<module>', '@log_event')
> For: ('view', <class 'hydrant.model.user.UserModel'>, 'logout',
> None, <InterfaceClass pyramid.interfaces.IView>, None, None, None,
> 'model', None, False, None, None, None)
> ('/Users/twillis/projects/hydrant-pyarmid/src/hydrant/hydrant/
> views/user.py', 49, '<module>', '@log_event')
> ('/Users/twillis/projects/hydrant-pyarmid/src/hydrant/hydrant/
> views/user.py', 49, '<module>', '@log_event')
>
>
> and here's the functions it's whining about, I can't show the
> implementation though sorry...
>
> #view_config(context=UserModel, name="login", route_name="model",
> renderer="json")
> @t_view(context=UserModel, name="login")
> @log_event
> def view_login(context, request):
> ...
>
> #view_config(context=UserModel, name="logout", route_name="model",
> renderer="json")
> @t_view(context=UserModel, name="logout")
> @log_event
> def view_logout(context, request):
> ...
>
> I was thinking that maybe it's the log_event decorator but removing
> that....
>
> ConfigurationConflictError: Conflicting configuration actions
> For: ('view', <class 'hydrant.model.user.UserModel'>, 'login', None,
> <InterfaceClass pyramid.interfaces.IView>, None, None, None, 'model',
> None, False, None, None, None)
> ('/Users/twillis/projects/hydrant-pyarmid/src/hydrant/hydrant/
> views/user.py', 20, '<module>', '@t_view(context=UserModel,
> name="login")')
> ('/Users/twillis/projects/hydrant-pyarmid/src/hydrant/hydrant/
> views/user.py', 20, '<module>', '@t_view(context=UserModel,
> name="login")')
> For: ('view', <class 'hydrant.model.user.UserModel'>, 'logout',
> None, <InterfaceClass pyramid.interfaces.IView>, None, None, None,
> 'model', None, False, None, None, None)
> ('/Users/twillis/projects/hydrant-pyarmid/src/hydrant/hydrant/
> views/user.py', 48, '<module>', '@t_view(context=UserModel,
> name="logout")')
> ('/Users/twillis/projects/hydrant-pyarmid/src/hydrant/hydrant/
> views/user.py', 48, '<module>', '@t_view(context=UserModel,
> name="logout")')
>
>
> so I switch to the view_config decorators...
>
> view_config(context=UserModel, name="login", route_name="model",
> renderer="json")
> #...@t_view(context=UserModel, name="login")
> #...@log_event
> def view_login(context, request):
> ...
>
> view_config(context=UserModel, name="logout", route_name="model",
> renderer="json")
> #...@t_view(context=UserModel, name="logout")
> #...@log_event
> def view_logout(context, request):
> ...
>
> and I get a 404, all my other views seem to work and they are
> configured with t_view, and log_event
>
>
> I'm calling config.scan at startup after adding the route. I don't
> know if I've run into a bug or I'm doing it wrong, any guidance is
> appreciated.
>
>
--
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.