Django 部署中的目录错误
我已经用Django搭建网站好几个月了。现在我觉得是时候让一些朋友来测试一下了。在把它部署到一台Ubuntu 14.4 64位LTS(和我的开发环境一样)时,我遇到了一个奇怪的错误。
调用了
OSError at /accounts/edit/
[Errno 21] Is a directory: '/var/www/media/'
我还尝试了不同的路径 BASE_PATH + "/media"
,这个在我的开发环境中是没问题的。
我正在运行默认的Django开发服务器(因为这是测试!)
如果有人能纠正我并教我这里出了什么问题,那就太好了。
谢谢。
编辑:(错误追踪信息)
Environment:
Request Method: POST
Request URL: http://playbox.asia:8000/accounts/edit/
Django Version: 1.6.4
Python Version: 2.7.6
Installed Applications:
('django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'south',
'easy_pjax',
'bootstrap3',
'djangoratings',
'taggit',
'imagekit',
'playbox',
'accounts',
'musics',
'playlist')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware')
Traceback:
File "/root/playbox/venv/local/lib/python2.7/site- packages/django/core/handlers/base.py" in get_response
114. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/root/playbox/venv/local/lib/python2.7/site- packages/django/contrib/auth/decorators.py" in _wrapped_view
22. return view_func(request, *args, **kwargs)
File "/root/playbox/accounts/views.py" in edit
189. os.remove(settings.MEDIA_ROOT + "/" + profile.avatar.name)
Exception Type: OSError at /accounts/edit/
Exception Value: [Errno 21] Is a directory: '/var/www/media/'
2 个回答
0
我遇到过类似的情况,但原因不同。这里分享一下我的经历,以防这不是上面提到的情况。
我在静态文件夹里有一个叫“admin”的文件,这个名字和Django的管理应用存放静态文件的“admin”目录是一样的。
当我运行 collectstatic
命令时,这两个就发生了冲突。我不得不删除我的“admin”文件(或者给它改个名字),这样才能避免冲突。
总的来说,确保你的文件名不要和其他应用提供的静态文件重名。
2
看起来 profile.avatar.name
的值是一个空字符串
所以没有文件被传给 os.remove
来删除,而它不能删除一个目录,这会导致抛出OSError错误:详细信息可以查看这里:https://docs.python.org/2/library/os.html#os.remove
你可以通过添加一个条件判断来解决这个错误,具体步骤如下:
if profile.avatar.name:
os.remove(settings.MEDIA_ROOT + "/" + profile.avatar.name)