Django 部署中的目录错误

1 投票
2 回答
6125 浏览
提问于 2025-04-18 05:00

我已经用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)

撰写回答