OK, I think I distilled the problem down and I think that Cornice way relying on behavior in Pyramid which doesn't hold true in Python 3. Cornice seems to just create multiple Pyramid views for a route. Here's a simple example Pyramid app which illustrates that which view gets called is not guaranteed in Python 3:

```python
~/dev/git-repos/cornice$ cat accept_test.py
import unittest

from pyramid.config import Configurator
from webtest import TestApp

def hello_view(request):
    return {'message': 'Hello!'}

def get_testapp():
    config = Configurator()
    config.add_route('hello', '/hello')
    config.add_view(hello_view, route_name='hello', accept='text/plain', renderer='string')
    config.add_view(hello_view, route_name='hello', accept='application/json', renderer='json')
    app = config.make_wsgi_app()
    return TestApp(app)

testapp = get_testapp()
res = testapp.get('/hello', status=200)
print("response content_type = %s" % res.content_type)

~/dev/git-repos/cornice$ for i in 1 2 3 4 5 6 7 8 9 10; do .tox/py33/bin/python accept_test.py; done
response content_type = application/json
response content_type = text/plain
response content_type = text/plain
response content_type = application/json
response content_type = application/json
response content_type = text/plain
response content_type = application/json
response content_type = text/plain
response content_type = text/plain
response content_type = application/json

~/dev/git-repos/cornice$ for i in 1 2 3 4 5 6 7 8 9 10; do .tox/py27/bin/python accept_test.py; done
response content_type = application/json
response content_type = application/json
response content_type = application/json
response content_type = application/json
response content_type = application/json
response content_type = application/json
response content_type = application/json
response content_type = application/json
response content_type = application/json
response content_type = application/json
```