我最近设置并部署了一个Amazon EC2实例来部署我的django项目.
当我在浏览器中收到此错误时,我正通过浏览器与我的应用程序进行交互:
errno 5 input/output error django
此错误确实引用了我的应用程序的某些功能
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
在第50行的末尾引用了一个get_context_data()
函数,该函数位于继承TemplateView
CBV的基于类的视图内
但在我的控制台中服务器需要重启,当我这样做时,错误解决了一个神奇的方式..
我搜索了这个错误,我发现这张票报了https://code.djangoproject.com/ticket/23284
这个报告与我的错误很相似......
另外我昨天有这个错误,我重新启动我的服务器,今天我再次出现错误.
使用Django的EC2基础架构存在一些问题(我不这么认为)或问题更多的是我的应用程序方面?
我不认为get_context_data()
我的应用程序的功能是问题...
我一直在探索,我应该说这个错误的起源在我的代码中
我有两个新手错误:
print
生产中的句子
在我在上面的问题中展示的追溯中,我print
在这个get_context_data()
函数中有一个句子:
File "/home/ubuntu/workspace/neurorehabilitation-system/userprofile/views.py" in get_context_data 50. print (user.is_physiotherapist)
有可能每次执行此打印句子时,进程尝试写入我的amazon ec2机器实例中的stdout文件.
我在该行中删除了这个打印句子,并通过git并重新启动gunicorn服务器将更改检索到我的生产服务器中,所有这些都很完美.
我有 DEBUG=True
生产
我有以下设置文件:
settings/ base.py # --- without DEBUG development.py # --- DEBUG=True testing.py # --- DEBUG=True production.py # --- DEBUG=False staging.py # --- DEBUG=False
所有文件(development.py, testing.py, production.py, staging.py
)都继承自base.py
但我不知道怎么做,在我的EC2实例中,production.py被执行,这继承所有来自base.py并覆盖DEBUG为False.
我一直在探索,一种可能性是根据运行我的应用程序的主机的名称更改它们的值(True或False),如本文所示
在我的情况下,这是我的主机名的值
(nrb_dev)ubuntu@ip-172-31-27-249:~$ 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 >>>
这意味着,将我的base.py放入以下内容:
import socket if socket.gethostname() == 'ip-172-31-27-249': DEBUG = False else: DEBUG = True
虽然我在代码中硬编码生产服务器的主机名.这意味着当我们想要在其他具有其他主机名的机器中部署我的项目时,我将手动修改后添加一个点
这是最好的做法,尽管它是有效的吗?
我认为它是最适合的替代选择的另一种选择是修复DJANGO_SETTINGS_MODULE
环境变量的值
在我的特殊情况下,我正在使用virtualenvwrapper
,我有两个虚拟环境,所以:
nrb_dev
为我的开发环境
nrb_test
对于我的测试环境.我有一些在激活虚拟环境时激活的钩子
在nrb_dev
在$VIRTUAL_ENV/bin/postactivate
我有这样的:
export DJANGO_SETTINGS_MODULE="neurorehabilitation.settings.development"
以同样的方式,nrb_test
在$VIRTUAL_ENV/bin/postactivate
我有这个:
export DJANGO_SETTINGS_MODULE="neurorehabilitation.settings.testing"
这意味着在我的亚马逊EC2生产机器中我应该更改钩子$VIRTUAL_ENV/bin/postactivate
以选择settings/production.py
这种方式:
export DJANGO_SETTINGS_MODULE="neurorehabilitation.settings.production"
只是为了测试效果和时间方式,我打印我的DEBUG
值settings/production.py
from .base import * # SECURITY WARNING: don't run with debug turned on in production! DEBUG = False print (DEBUG) # just for now.
当我启动我的gunicorn守护程序服务器时,我可以看到DEBUG值设置为 False
(nrb_dev)ubuntu@ip-172-31-27-249:~/workspace/neurorehabilitation-system$ gunicorn -c neurorehabilitation/gunicorn_config.py neurorehabilitation.wsgi [2016-01-08 00:26:15 +0000] [6691] [INFO] Starting gunicorn 19.4.5 [2016-01-08 00:26:15 +0000] [6691] [INFO] Listening at: http://127.0.0.1:8000 (6691) [2016-01-08 00:26:15 +0000] [6691] [INFO] Using worker: sync [2016-01-08 00:26:15 +0000] [6694] [INFO] Booting worker with pid: 6694 False ^C[2016-01-08 00:26:19 +0000] [6691] [INFO] Handling signal: int
补充说明
我可以探索Django Logging功能,用于注册事件和我的应用程序的其他东西.
我应该探索管理服务,以便管理更好的生产方式.
主管的其他资源:
如何在Ubuntu中安装和管理主管
使用Nginx,Gunicorn,virtualenv,supervisor和PostgreSQL设置Django