Django中的静态根和静态URL混淆

时间:2014-08-24 09:00:22

标签: python django

我正在尝试在django中阅读创建mp3文件。但我对我配置的static和static_root感到困惑。 发生的事情是,在我的代码中,当我打印下面的行时,它显示了 的 /usr/local/src/mena_recording/play/static/audio/dorris_0_.mp3

代码:

print settings.BASE_DIR+'/play/static/audio/'+record.driverName +'_'+str(counter)+'_'+ '.mp3'

但是当我在这篇文章的下一行中使用相同的东西时,会出现这个错误:

IOError at /
[Errno 2] No such file or directory: u'/usr/local/src/mena_recording/play/static_root/play/static/audio/dorris_0_.oga'

代码:

with open(settings.BASE_DIR+'/play/static/audio/'+record.driverName +'_'+str(counter)+'_'+ '.mp3', 'w') as mp3_file:
    mp3_file.write(decoded_mp3_str)
    mp3_file.close()

my settings.py

STATIC_ROOT = os.path.join(BASE_DIR, 'play/static_root')
STATIC_URL = '/static/'

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'mena_recording/static'),
    os.path.join(BASE_DIR, 'play/static'),
    # Put strings here, like "/home/html/static" or "C:/www/django/static".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
)

请有人告诉我,请问这是如何运作的?

谢谢。

1 个答案:

答案 0 :(得分:11)

来自django docs,

STATIC_ROOT是collectstatic将收集静态文件以进行部署的目录的绝对路径。

STATIC_URL是引用位于STATIC_ROOT的静态文件时使用的网址。

因此,当您请求某个特定的静态资源时,会在STATIC_ROOT + STATIC_URL中搜索,然后提供服务。

现在问题出在你的问题上

STATIC_ROOT = os.path.join(BASE_DIR, 'play/static_root')
STATIC_URL = '/static/'

这意味着django实际上会在BASE_DIR/play/static_root/static/中搜索不正确的内容,所以查看其他路径可以看出你需要做什么

STATIC_ROOT = os.path.join(BASE_DIR, 'play/')