I recently setup and deploy an Amazon EC2 instance for deploy my django project.
I was interacting with my application via browser when I get this error in the browser:
errno 5 input/output error django
This error did reference to some function of my application
Environment: Request Method: GET Request URL: http://localhost:8000/accounts/profile/ Django Version: 1.9 Python Version: 3.4.3 Installed Applications: ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'crispy_forms', 'django_extensions', 'storages', 'userprofile'] Installed Middleware: ['django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware'] Traceback: File "/home/ubuntu/.virtualenvs/nrb_dev/lib/python3.4/site-packages/django/core/handlers/base.py" in get_response 149. response = self.process_exception_by_middleware(e, request) File "/home/ubuntu/.virtualenvs/nrb_dev/lib/python3.4/site-packages/django/core/handlers/base.py" in get_response 147. response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/home/ubuntu/.virtualenvs/nrb_dev/lib/python3.4/site-packages/django/views/generic/base.py" in view 68. return self.dispatch(request, *args, **kwargs) File "/home/ubuntu/.virtualenvs/nrb_dev/lib/python3.4/site-packages/django/utils/decorators.py" in _wrapper 67. return bound_func(*args, **kwargs) File "/home/ubuntu/.virtualenvs/nrb_dev/lib/python3.4/site-packages/django/contrib/auth/decorators.py" in _wrapped_view 23. return view_func(request, *args, **kwargs) File "/home/ubuntu/.virtualenvs/nrb_dev/lib/python3.4/site-packages/django/utils/decorators.py" in bound_func 63. return func.__get__(self, type(self))(*args2, **kwargs2) File "/home/ubuntu/workspace/neurorehabilitation-system/userprofile/mixins.py" in dispatch 7. return super(LoginRequiredMixin, self).dispatch(request, *args, **kwargs) File "/home/ubuntu/.virtualenvs/nrb_dev/lib/python3.4/site-packages/django/views/generic/base.py" in dispatch 88. return handler(request, *args, **kwargs) File "/home/ubuntu/.virtualenvs/nrb_dev/lib/python3.4/site-packages/django/views/generic/base.py" in get 157. context = self.get_context_data(**kwargs) File "/home/ubuntu/workspace/neurorehabilitation-system/userprofile/views.py" in get_context_data 50. print (user.is_physiotherapist) Exception Type: OSError at /accounts/profile/ Exception Value: [Errno 5] Input/output error
At the end in the line 50 is referenced a
get_context_data() function which is inside of a class based view that inherit of
but in my console the server require restart and when I did this, the error was solved of a magic way ..
I've search this error and I found this ticket reported https://code.djangoproject.com/ticket/23284
This report is very similar to my error ...
In addition I had this error yesterday, I restart my server, and today I have again the error.
There is some problem with EC2 infraestructure with Django (I don't think so) or the problem is more for my application side?
I don't think so that the function
get_context_data() of my application be the problem ...
I have been exploring, and I should say that the origin of this error were in my code
I have two newbie errors:
In the traceback that I shown above in my question, I had a
get_context_data() function of this way:
File "/home/ubuntu/workspace/neurorehabilitation-system/userprofile/views.py" in get_context_data 50. print (user.is_physiotherapist)
Is possible that each time that this print sentence is executed, the process try write to the stdout file in my amazon ec2 machine instance.
I remove this print sentence in that line, and retrieve the changes into my production servers via git and restart gunicorn server and all it's works perfect.
- I have the
I have the following settings files:
settings/ base.py # --- without DEBUG development.py # --- DEBUG=True testing.py # --- DEBUG=True production.py # --- DEBUG=False staging.py # --- DEBUG=False
All files (
development.py, testing.py, production.py, staging.py) inherit from
But I don't know how to make that in my ec2 instance, the production.py be executed, this inherit all from base.py and override DEBUG to False.
I've been exploring and one possibility is change their value (True or False) according to the name of the host in which is running my application, such as shown in this post
In my case this is the value of my hostname
(nrb_dev)[email protected]:~$ python Python 3.4.3 (default, Oct 14 2015, 20:28:29) [GCC 4.8.4] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import socket >>> a=socket.gethostname() >>> a 'ip-172-31-27-249' >>> >>> if a != 'ip-172-31-27-249': ... DEBUG = print ('Caleno juiciocito') ... >>> DEBUG True >>>
This mean, put into my base.py the following:
import socket if socket.gethostname() == 'ip-172-31-27-249': DEBUG = False else: DEBUG = True
Although I am hardcoding the hostname of the production server in my code. This mean that I am adding a point thar after will have modified manually when we want deploy my project in other machine with other hostname
Is this a best practice despite to it's works?
Another option which I think that it's the most suited alternative is fix the value of my
DJANGO_SETTINGS_MODULE environment variables
In my particular situation I am using
virtualenvwrapper and I have two virtual environments so:
nrb_dev for my development environment
nrb_test for my testing environment . I have some hooks which are activated when the virtual environments are activated
$VIRTUAL_ENV/bin/postactivate I have this:
In the same way, in
$VIRTUAL_ENV/bin/postactivate I have this:
This mean that in my amazon EC2 production machine I should change the hook in
$VIRTUAL_ENV/bin/postactivate to choose the
settings/production.py of this way:
Just for test effects and the temporal way, I print the
DEBUG value in my
from .base import * # SECURITY WARNING: don't run with debug turned on in production! DEBUG = False print (DEBUG) # just for now.
And when I start my gunicorn daemon server, I can see that DEBUG value is set to
(nrb_dev)[email protected]:~/workspace/neurorehabilitation-system$ gunicorn -c neurorehabilitation/gunicorn_config.py neurorehabilitation.wsgi [2016-01-08 00:26:15 +0000]  [INFO] Starting gunicorn 19.4.5 [2016-01-08 00:26:15 +0000]  [INFO] Listening at: http://127.0.0.1:8000 (6691) [2016-01-08 00:26:15 +0000]  [INFO] Using worker: sync [2016-01-08 00:26:15 +0000]  [INFO] Booting worker with pid: 6694 False ^C[2016-01-08 00:26:19 +0000]  [INFO] Handling signal: int
I can explore the Django Logging functionality for register events and others things of my application.
I should explore the supervisor service for manage the gunicorn procees of a better way in production.
Other resources for supervisor: