Django中的静态根和静态网址混淆

6 投票
1 回答
11411 浏览
提问于 2025-04-18 18:20

我正在尝试在Django中创建mp3文件,但我对我配置的静态文件和静态根目录有些困惑。
发生的情况是,当我在代码中打印下面这行时,它显示的是 /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()

我的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 个回答

14

根据Django的文档,

STATIC_ROOT 是一个绝对路径,指的是Django在准备部署时收集静态文件的目录。

STATIC_URL 是用来引用位于STATIC_ROOT中的静态文件的URL。

所以,当你请求某个特定的静态资源时,Django会在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/')

撰写回答