Using LoginRequiredMixin with async views? - django-views

I'm using Python 3.7, Django 3.1.7, social-auth-app-django 3.1.0.
I've just started playing with async views. I can't get them to play nice with LoginRequiredMixin. I've got this trivial view:
class TestView(LoginRequiredMixin, View):
#classonlymethod
def as_view(cls, **initkwargs):
view = super().as_view(**initkwargs)
view._is_coroutine = asyncio.coroutines._is_coroutine
return view
async def get(self, request):
return render(request, 'spi/test.jinja', {})
When I run this test:
class TestViewTest(ViewTestCase):
def test_get(self):
client = Client()
response = client.get('/spi/test')
self.assertEqual(response.status_code, 200)
It fails with an awe-inspiring stack dump (below), the gist of which is:
TypeError: object HttpResponseRedirect can't be used in 'await' expression
which I assume is due to the OAuth flow being run. If I leave out the LoginRequiredMixin, the test passes.
--- Logging error ---
Traceback (most recent call last):
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/core/handlers/base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/asgiref/sync.py", line 147, in __call__
return call_result.result()
File "/data/project/spi-tools-dev/python-distros/Python-3.7.3-install/lib/python3.7/concurrent/futures/_base.py", line 425, in result
return self.__get_result()
File "/data/project/spi-tools-dev/python-distros/Python-3.7.3-install/lib/python3.7/concurrent/futures/_base.py", line 384, in __get_result
raise self._exception
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/asgiref/sync.py", line 212, in main_wrap
result = await self.awaitable(*args, **kwargs)
TypeError: object HttpResponseRedirect can't be used in 'await' expression
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/data/project/spi-tools-dev/python-distros/Python-3.7.3-install/lib/python3.7/logging/handlers.py", line 630, in emit
s = self.makePickle(record)
File "/data/project/spi-tools-dev/python-distros/Python-3.7.3-install/lib/python3.7/logging/handlers.py", line 602, in makePickle
s = pickle.dumps(d, 1)
File "/data/project/spi-tools-dev/python-distros/Python-3.7.3-install/lib/python3.7/copyreg.py", line 65, in _reduce_ex
raise TypeError("can't pickle %s objects" % base.__name__)
TypeError: can't pickle BytesIO objects
Call stack:
File "/data/project/spi-tools-dev/www/python/src/manage.py", line 25, in <module>
main()
File "/data/project/spi-tools-dev/www/python/src/manage.py", line 21, in main
execute_from_command_line(sys.argv)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
utility.execute()
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/core/management/__init__.py", line 395, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/core/management/commands/test.py", line 23, in run_from_argv
super().run_from_argv(argv)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/core/management/base.py", line 330, in run_from_argv
self.execute(*args, **cmd_options)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/core/management/base.py", line 371, in execute
output = self.handle(*args, **options)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/core/management/commands/test.py", line 53, in handle
failures = test_runner.run_tests(test_labels)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/test/runner.py", line 699, in run_tests
result = self.run_suite(suite)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/test/runner.py", line 641, in run_suite
return runner.run(suite)
File "/data/project/spi-tools-dev/python-distros/Python-3.7.3-install/lib/python3.7/unittest/runner.py", line 176, in run
test(result)
File "/data/project/spi-tools-dev/python-distros/Python-3.7.3-install/lib/python3.7/unittest/suite.py", line 84, in __call__
return self.run(*args, **kwds)
File "/data/project/spi-tools-dev/python-distros/Python-3.7.3-install/lib/python3.7/unittest/suite.py", line 122, in run
test(result)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/test/testcases.py", line 243, in __call__
self._setup_and_call(result)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/test/testcases.py", line 279, in _setup_and_call
super().__call__(result)
File "/data/project/spi-tools-dev/python-distros/Python-3.7.3-install/lib/python3.7/unittest/case.py", line 663, in __call__
return self.run(*args, **kwds)
File "/data/project/spi-tools-dev/python-distros/Python-3.7.3-install/lib/python3.7/unittest/case.py", line 615, in run
testMethod()
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/src/spi/test_views.py", line 231, in test_get
response = client.get('/spi/test')
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/test/client.py", line 739, in get
response = super().get(path, data=data, secure=secure, **extra)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/test/client.py", line 395, in get
**extra,
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/test/client.py", line 470, in generic
return self.request(**r)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/test/client.py", line 711, in request
response = self.handler(environ)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/test/client.py", line 142, in __call__
response = self.get_response(request)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/core/handlers/base.py", line 130, in get_response
response = self._middleware_chain(request)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/utils/deprecation.py", line 114, in __call__
response = response or self.get_response(request)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/debug_toolbar/middleware.py", line 52, in __call__
return self.get_response(request)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/utils/deprecation.py", line 114, in __call__
response = response or self.get_response(request)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/utils/deprecation.py", line 114, in __call__
response = response or self.get_response(request)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/utils/deprecation.py", line 114, in __call__
response = response or self.get_response(request)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/utils/deprecation.py", line 114, in __call__
response = response or self.get_response(request)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/utils/deprecation.py", line 114, in __call__
response = response or self.get_response(request)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/utils/deprecation.py", line 114, in __call__
response = response or self.get_response(request)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/utils/deprecation.py", line 114, in __call__
response = response or self.get_response(request)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/utils/deprecation.py", line 114, in __call__
response = response or self.get_response(request)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/src/tools_app/middleware.py", line 26, in __call__
return self.get_response(request)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/src/tools_app/middleware.py", line 11, in __call__
return self.get_response(request)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/core/handlers/exception.py", line 49, in inner
response = response_for_exception(request, exc)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/core/handlers/exception.py", line 108, in response_for_exception
exc_info=sys.exc_info(),
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/utils/log.py", line 230, in log_response
exc_info=exc_info,
Message: '%s: %s'
Arguments: ('Internal Server Error', '/spi/test')
E
======================================================================
ERROR: test_get (spi.test_views.TestViewTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/src/spi/test_views.py", line 231, in test_get
response = client.get('/spi/test')
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/test/client.py", line 739, in get
response = super().get(path, data=data, secure=secure, **extra)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/test/client.py", line 395, in get
**extra,
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/test/client.py", line 470, in generic
return self.request(**r)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/test/client.py", line 716, in request
self.check_exception(response)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/test/client.py", line 577, in check_exception
raise exc_value
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/django/core/handlers/base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/asgiref/sync.py", line 147, in __call__
return call_result.result()
File "/data/project/spi-tools-dev/python-distros/Python-3.7.3-install/lib/python3.7/concurrent/futures/_base.py", line 425, in result
return self.__get_result()
File "/data/project/spi-tools-dev/python-distros/Python-3.7.3-install/lib/python3.7/concurrent/futures/_base.py", line 384, in __get_result
raise self._exception
File "/mnt/nfs/labstore-secondary-tools-project/spi-tools-dev/www/python/venv/lib/python3.7/site-packages/asgiref/sync.py", line 212, in main_wrap
result = await self.awaitable(*args, **kwargs)
TypeError: object HttpResponseRedirect can't be used in 'await' expression
----------------------------------------------------------------------
Ran 1 test in 0.274s
FAILED (errors=1)
Destroying test database for alias 'default'...

Well, it turns out the problem is simply that LoginRequiredMixin isn't async-capable yet. The work around is to implement the gist of LoginRequiredMixin in my view code. The supplied implementation of LoginRequiredMixin is complicated, but most of it is dealing with the general case. Stripping it down to the essential part that fits my use case, I ended up with:
from asgiref.sync import sync_to_async
from django.contrib.auth.views import redirect_to_login
class TestView(View):
#classonlymethod
def as_view(cls, **initkwargs):
view = super().as_view(**initkwargs)
view._is_coroutine = asyncio.coroutines._is_coroutine
return view
async def get(self, request):
if not await sync_to_async(lambda: request.user.is_authenticated)():
return redirect_to_login(self.request.get_full_path())
return render(request, 'spi/test.jinja', {})

Related

AttributeError: 'Overview' object has no attribute '__qualname__'

I am updating Django from 1.11.27 to 2.2.9 - python2.7 to python3.7 - made all the changes, but when I start server I have this error.
AttributeError: 'Overview' object has no attribute '__qualname__'
Traceback (most recent call last):
File "/Users/user/Sites/project-folder/venv/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/Users/user/Sites/project-folder/venv/lib/python3.7/site-packages/django/core/handlers/base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/Users/user/Sites/project-folder/venv/lib/python3.7/site-packages/django/core/handlers/base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/Cellar/python/3.7.4/Frameworks/Python.framework/Versions/3.7/lib/python3.7/contextlib.py", line 74, in inner
return func(*args, **kwds)
File "/Users/user/Sites/project-folder/venv/lib/python3.7/site-packages/django/contrib/admin/sites.py", line 241, in wrapper
return self.admin_view(view, cacheable)(*args, **kwargs)
File "/Users/user/Sites/project-folder/venv/lib/python3.7/site-packages/django/utils/decorators.py", line 142, in _wrapped_view
response = view_func(request, *args, **kwargs)
File "/Users/user/Sites/project-folder/venv/lib/python3.7/site-packages/django/views/decorators/cache.py", line 44, in _wrapped_view_func
response = view_func(request, *args, **kwargs)
File "/Users/user/Sites/project-folder/venv/lib/python3.7/site-packages/django/contrib/admin/sites.py", line 213, in inner
if request.path == reverse('admin:logout', current_app=self.name):
File "/Users/user/Sites/project-folder/venv/lib/python3.7/site-packages/django/urls/base.py", line 58, in reverse
app_list = resolver.app_dict[ns]
File "/Users/user/Sites/project-folder/venv/lib/python3.7/site-packages/django/urls/resolvers.py", line 513, in app_dict
self._populate()
File "/Users/user/Sites/project-folder/venv/lib/python3.7/site-packages/django/urls/resolvers.py", line 464, in _populate
url_pattern._populate()
File "/Users/user/Sites/project-folder/venv/lib/python3.7/site-packages/django/urls/resolvers.py", line 464, in _populate
url_pattern._populate()
File "/Users/user/Sites/project-folder/venv/lib/python3.7/site-packages/django/urls/resolvers.py", line 452, in _populate
self._callback_strs.add(url_pattern.lookup_str)
File "/Users/user/Sites/project-folder/venv/lib/python3.7/site-packages/django/utils/functional.py", line 80, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "/Users/user/Sites/project-folder/venv/lib/python3.7/site-packages/django/urls/resolvers.py", line 362, in lookup_str
return callback.__module__ + "." + callback.__qualname__
AttributeError: 'Overview' object has no attribute '__qualname__'
Found the exception here (Django 2.2.9):
https://github.com/django/django/blob/master/django/urls/resolvers.py#L361
#cached_property
def lookup_str(self):
"""
A string that identifies the view (e.g. 'path.to.view_function' or
'path.to.ClassBasedView').
"""
callback = self.callback
if isinstance(callback, functools.partial):
callback = callback.func
if not hasattr(callback, '__name__'):
return callback.__module__ + "." + callback.__class__.__name__
return callback.__module__ + "." + callback.__qualname__

unable to except ValueError thrown by mongoengine

I'm trying to catch a ValueError that occurs due to the skip parameter equal to a negative number. For example,
try:
MyModel.objects.skip(-1)
except ValueError as error:
print(error)
does not do anything. It doesn't error out with ANY message nor does it do anything else. What I want is just to catch the ValueError and handle it appropriately.
If I except TypeError (that is not raised) instead of ValueError it displays the same behaviour.
The traceback:
Traceback (most recent call last):
File "/home/admin/.local/lib/python3.6/site-packages/django/core/handlers/exception.py", line 35, in inner
response = get_response(request)
File "/home/admin/.local/lib/python3.6/site-packages/django/core/handlers/base.py", line 128, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/home/admin/.local/lib/python3.6/site-packages/django/core/handlers/base.py", line 126, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/admin/.local/lib/python3.6/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
File "/usr/local/lib/python3.6/dist-packages/rest_framework/viewsets.py", line 103, in view
return self.dispatch(request, *args, **kwargs)
File "/usr/local/lib/python3.6/dist-packages/rest_framework/views.py", line 483, in dispatch
response = self.handle_exception(exc)
File "/usr/local/lib/python3.6/dist-packages/rest_framework/views.py", line 443, in handle_exception
self.raise_uncaught_exception(exc)
File "/usr/local/lib/python3.6/dist-packages/rest_framework/views.py", line 480, in dispatch
response = handler(request, *args, **kwargs)
File "/home/admin/test_serverside/essences/test_result/views.py", line 273, in get_history
self._format_response_json(serializer.data),
File "/usr/local/lib/python3.6/dist-packages/rest_framework/serializers.py", line 765, in data
ret = super(ListSerializer, self).data
File "/usr/local/lib/python3.6/dist-packages/rest_framework/serializers.py", line 266, in data
self._data = self.get_initial()
File "/usr/local/lib/python3.6/dist-packages/rest_framework/serializers.py", line 600, in get_initial
return self.to_representation(self.initial_data)
File "/usr/local/lib/python3.6/dist-packages/rest_framework/serializers.py", line 683, in to_representation
self.child.to_representation(item) for item in iterable
File "/usr/local/lib/python3.6/dist-packages/rest_framework/serializers.py", line 683, in <listcomp>
self.child.to_representation(item) for item in iterable
File "/usr/local/lib/python3.6/dist-packages/mongoengine/queryset/queryset.py", line 99, in _iter_results
self._populate_cache()
File "/usr/local/lib/python3.6/dist-packages/mongoengine/queryset/queryset.py", line 118, in _populate_cache
self._result_cache.append(next(self))
File "/usr/local/lib/python3.6/dist-packages/mongoengine/queryset/base.py", line 1466, in __next__
raw_doc = next(self._cursor)
File "/usr/local/lib/python3.6/dist-packages/mongoengine/queryset/base.py", line 1573, in _cursor
self._cursor_obj.skip(self._skip)
File "/usr/local/lib/python3.6/dist-packages/pymongo/cursor.py", line 491, in skip
raise ValueError("skip must be >= 0")
ValueError: skip must be >= 0

IndexError: list index out of range in Test case

I have strange problems
I have next code Using TesCase and APIClient to get request with token
class Profile(TestCase):
fixtures = ['profiles.json']
def setUp(self):
self.client = APIClient()
self.user = Profile.objects.get(username='some-username')
self.token = Token.objects.create(user=self.user)
self.client.credentials(HTTP_AUTHORIZATION='Token ' + self.token.key)
def test_profile(self):
response = self.client.get('/api/some-username/profile/')
print(response.status_code)
print(response.data)`
Authorization goes well,but the I received error. If i use requests.get with headers (token) to development django server all pass well i receive a correct json response
Full Traceback when i run this test:
Traceback (most recent call last):
File "/home/work/project/profiles/tests.py", line 103, in test_user_profile
response = self.client.get('/api/some-username/profile/')
File "/usr/local/lib/python3.5/dist-packages/rest_framework/test.py", line 291, in get
response = super(APIClient, self).get(path, data=data, **extra)
File "/usr/local/lib/python3.5/dist-packages/rest_framework/test.py", line 208, in get
return self.generic('GET', path, **r)
File "/usr/local/lib/python3.5/dist-packages/rest_framework/test.py", line 237, in generic
method, path, data, content_type, secure, **extra)
File "/usr/local/lib/python3.5/dist-packages/django/test/client.py", line 416, in generic
return self.request(**r)
File "/usr/local/lib/python3.5/dist-packages/rest_framework/test.py", line 288, in request
return super(APIClient, self).request(**kwargs)
File "/usr/local/lib/python3.5/dist-packages/rest_framework/test.py", line 240, in request
request = super(APIRequestFactory, self).request(**kwargs)
File "/usr/local/lib/python3.5/dist-packages/django/test/client.py", line 501, in request
six.reraise(*exc_info)
File "/usr/local/lib/python3.5/dist-packages/django/utils/six.py", line 686, in reraise
raise value
File "/usr/local/lib/python3.5/dist-packages/django/core/handlers/exception.py", line 41, in inner
response = get_response(request)
File "/usr/local/lib/python3.5/dist-packages/django/core/handlers/base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/usr/local/lib/python3.5/dist-packages/django/core/handlers/base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python3.5/dist-packages/django/views/decorators/csrf.py", line 58, in wrapped_view
return view_func(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/django/views/generic/base.py", line 68, in view
return self.dispatch(request, *args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/rest_framework/views.py", line 489, in dispatch
response = self.handle_exception(exc)
File "/usr/local/lib/python3.5/dist-packages/rest_framework_tracking/mixins.py", line 69, in handle_exception
response = super(BaseLoggingMixin, self).handle_exception(exc)
File "/usr/local/lib/python3.5/dist-packages/rest_framework/views.py", line 449, in handle_exception
self.raise_uncaught_exception(exc)
File "/usr/local/lib/python3.5/dist-packages/rest_framework/views.py", line 486, in dispatch
response = handler(request, *args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/rest_framework/generics.py", line 254, in get
return self.retrieve(request, *args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/rest_framework/mixins.py", line 58, in retrieve
return Response(serializer.data)
File "/usr/local/lib/python3.5/dist-packages/rest_framework/serializers.py", line 533, in data
ret = super(Serializer, self).data
File "/usr/local/lib/python3.5/dist-packages/rest_framework/serializers.py", line 262, in data
self._data = self.to_representation(self.instance)
File "/usr/local/lib/python3.5/dist-packages/rest_framework/serializers.py", line 500, in to_representation
ret[field.field_name] = field.to_representation(attribute)
File "/home/work/project/profiles/serializers.py", line 10, in to_representation
return institute.all()[0].slug
File "/usr/local/lib/python3.5/dist-packages/django/db/models/query.py", line 289, in __getitem__
return list(qs)[0]
IndexError: list index out of range
How know what is the problem?

build_filters() got an unexpected keyword argument 'ignore_bad_filters'

I just updated my code from django 1.8 to 1.11 and so i also had to update tasty pie. Before update everything worked fine but now I am getting this error on one of my tests.
Here is the test case
def test_does_not_return_restricted_fields_when_insufficient_permissions(self):
self.user.user_permissions.all().delete()
response = self.api_client.get(url,
format='json',
authentication=self.create_apikey(username=self.username, api_key=self.api_key),
data=data)
Here is the full Trace,
Traceback (most recent call last):
File "/spare/local/projects/towerportal/apps/exchangedb/tests/test_api.py", line 68, in test_does_not_return_restricted_fields_when_insufficient_permissions
response = self.get_response(self.detail_url)
File "/spare/local/projects/towerportal/apps/exchangedb/tests/test_api.py", line 26, in get_response
data=data)
File "/spare/local/venv/lib/python2.7/site-packages/tastypie/test.py", line 70, in get
return self.client.get(uri, **kwargs)
File "/spare/local/venv/lib/python2.7/site-packages/django/test/client.py", line 536, in get
**extra)
File "/spare/local/venv/lib/python2.7/site-packages/django/test/client.py", line 340, in get
return self.generic('GET', path, secure=secure, **r)
File "/spare/local/venv/lib/python2.7/site-packages/django/test/client.py", line 416, in generic
return self.request(**r)
File "/spare/local/venv/lib/python2.7/site-packages/django/test/client.py", line 501, in request
six.reraise(*exc_info)
File "/spare/local/venv/lib/python2.7/site-packages/django/core/handlers/exception.py", line 41, in inner
response = get_response(request)
File "/spare/local/venv/lib/python2.7/site-packages/django/core/handlers/base.py", line 249, in _legacy_get_response
response = self._get_response(request)
File "/spare/local/venv/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/spare/local/venv/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/spare/local/venv/lib/python2.7/site-packages/django/utils/decorators.py", line 185, in inner
return func(*args, **kwargs)
File "/spare/local/venv/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 58, in wrapped_view
return view_func(*args, **kwargs)
File "/spare/local/venv/lib/python2.7/site-packages/tastypie/resources.py", line 221, in wrapper
response = callback(request, *args, **kwargs)
File "/spare/local/venv/lib/python2.7/site-packages/tastypie/resources.py", line 470, in dispatch_detail
return self.dispatch('detail', request, **kwargs)
File "/spare/local/venv/lib/python2.7/site-packages/tastypie/resources.py", line 493, in dispatch
response = method(request, **kwargs)
File "/spare/local/venv/lib/python2.7/site-packages/tastypie/resources.py", line 1376, in get_detail
obj = self.cached_obj_get(bundle=basic_bundle, **self.remove_api_resource_names(kwargs))
File "/spare/local/venv/lib/python2.7/site-packages/tastypie/resources.py", line 1195, in cached_obj_get
cached_bundle = self.obj_get(bundle=bundle, **kwargs)
File "/spare/local/venv/lib/python2.7/site-packages/tastypie/resources.py", line 2176, in obj_get
applicable_filters = self.build_filters(filters=kwargs, ignore_bad_filters=True)
TypeError: build_filters() got an unexpected keyword argument 'ignore_bad_filters'
Could your please paste your tastypie resource code?
Without related code, I can only guess that it is because you override
def build_filters(): in your modelresource class, but the newer version of tastypie added a ignore_bad_filter parameter in the function definition which you do not have in your modelresource code.
The build_filters function declaration in the latest tastypie:
def build_filters(self, filters=None, ignore_bad_filters=False):
The old version probably does not have the ignore_bad_filter parameter. To fix this, just add ignore_bad_filters=Falsekey word parameter to the build_filters function in your modelresource class.

Gunicorn exits because https request from Django fails in OpenSSL

Here's the scenario. I have a Django app being served by Gunicorn on Linux. On certain requests it makes an https call to an external API via httplib2.request(). Sometimes that call fails in such a way that hoses OpenSSL (not sure how, but it's not my fault and doesn't really matter). OpenSSL sends a SIGABRT signal to gunicorn in this case. Gunicorn handles the SIGABRT and promptly system exits (as it should).
The root issue as I see it is that OpenSSL asynchronously signals the parent process to abort, rather than returning an error code. Don't tell me to abort because of YOUR personal problems, OpenSSL! Legacy code in action.
Is anyone else thoroughly annoyed by this problem? How would you prevent this from killing your Gunicorn process? It completely bypasses Django exception handling.
Relevant code points:
OpenSSL sends SIGABRT whenever OpenSSLDie() is called: https://github.com/openssl/openssl/blob/e0fc7961c4fbd27577fb519d9aea2dc788742715/crypto/cryptlib.c#L391
which comments claim happens whenever there is a fatal error in any cryptographic operation: https://github.com/openssl/openssl/blob/e0fc7961c4fbd27577fb519d9aea2dc788742715/fips/fips.c#L136
The SIGABRT is handled by gunicorn: https://github.com/benoitc/gunicorn/blob/6eb01409da42a81b7020cd78c52613d8ec868e94/gunicorn/workers/base.py#L173
which causes gunicorn to sys.exit(1): https://github.com/benoitc/gunicorn/blob/6eb01409da42a81b7020cd78c52613d8ec868e94/gunicorn/workers/base.py#L200
I don't think the signal gets created by OpenSSL. The signal comes from gunicorn which sends this signal if the request takes too long.
worker_abort(worker): Called when a worker received the SIGABRT signal.
This call generally happens on timeout.
The callable needs to accept one instance variable for the initialized
Worker.
https://docs.gunicorn.org/en/stable/settings.html#worker-abort
My traceback, which I get if the request takes more than N seconds:
SystemExit: 1
File "django/core/handlers/wsgi.py", line 133, in __call__
response = self.get_response(request)
File "django/core/handlers/base.py", line 128, in get_response
response = self._middleware_chain(request)
File "django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "debug_toolbar/middleware.py", line 48, in __call__
return self.get_response(request)
File "django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "django/utils/deprecation.py", line 114, in __call__
response = response or self.get_response(request)
File "django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "whitenoise/middleware.py", line 59, in __call__
response = self.get_response(request)
File "django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "django/utils/deprecation.py", line 114, in __call__
response = response or self.get_response(request)
File "django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "django/utils/deprecation.py", line 114, in __call__
response = response or self.get_response(request)
File "django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "django/utils/deprecation.py", line 114, in __call__
response = response or self.get_response(request)
File "django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "django/utils/deprecation.py", line 114, in __call__
response = response or self.get_response(request)
File "django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "django/utils/deprecation.py", line 114, in __call__
response = response or self.get_response(request)
File "django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "django_middleware_global_request/middleware.py", line 15, in __call__
return self.get_response(request)
File "django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "django/core/handlers/base.py", line 179, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "django/contrib/admin/options.py", line 614, in wrapper
return self.admin_site.admin_view(view)(*args, **kwargs)
File "django/utils/decorators.py", line 130, in _wrapped_view
response = view_func(request, *args, **kwargs)
File "django/views/decorators/cache.py", line 44, in _wrapped_view_func
response = view_func(request, *args, **kwargs)
File "django/contrib/admin/sites.py", line 233, in inner
return view(request, *args, **kwargs)
File "django/utils/decorators.py", line 43, in _wrapper
return bound_method(*args, **kwargs)
File "django/utils/decorators.py", line 130, in _wrapped_view
response = view_func(request, *args, **kwargs)
File "django/contrib/admin/options.py", line 1719, in changelist_view
response = self.response_action(request, queryset=cl.get_queryset(request))
File "django/contrib/admin/options.py", line 1402, in response_action
response = func(self, request, queryset)
File "lala/admin.py", line 252, in send_invoice_via_mail
send_invoice_mail_failsafe_and_create_log(invoice)
File "lala/views/send_invoices_via_mail.py", line 24, in send_invoice_mail_failsafe_and_create_log
return send_invoice_mail(invoice)
File "contextlib.py", line 75, in inner
return func(*args, **kwds)
File "lala/views/send_invoices_via_mail.py", line 39, in send_invoice_mail
mail.send_mail(
File "django/core/mail/__init__.py", line 61, in send_mail
return mail.send()
File "django/core/mail/message.py", line 284, in send
return self.get_connection(fail_silently).send_messages([self])
File "django/core/mail/backends/smtp.py", line 109, in send_messages
sent = self._send(message)
File "django/core/mail/backends/smtp.py", line 125, in _send
self.connection.sendmail(from_email, recipients, message.as_bytes(linesep='\r\n'))
File "smtplib.py", line 865, in sendmail
(code, resp) = self.mail(from_addr, esmtp_opts)
File "smtplib.py", line 539, in mail
return self.getreply()
File "smtplib.py", line 391, in getreply
line = self.file.readline(_MAXLINE + 1)
File "socket.py", line 669, in readinto
return self._sock.recv_into(b)
File "ssl.py", line 1241, in recv_into
return self.read(nbytes, buffer)
File "ssl.py", line 1099, in read
return self._sslobj.read(len, buffer)
File "gunicorn/workers/base.py", line 201, in handle_abort
sys.exit(1)