使用Django static()在生产中生成音频文件的URL

时间:2017-05-01 15:02:50

标签: django

我正在尝试让我的Django应用程序播放用户通过表单上传的音频文件(据称)。所述文件与模型相关联:

# models.py
class Doc(models.Model):
    # ...
    tape = models.FileField()

上传和保存部分工作正常,文件存储在应有的位置:

- djangoproject
 |
 - docapp
  |
  - media <- here

因此,为了得到我想要的地方,我将这两行添加到settings.py文件MEDIA_ROOT = os.path.join(BASE_DIR, 'docapp/media/')MEDIA_URL = 'docapp/media/'

我希望能够链接到音频文件:

# templates/docapp/index.html
...
<audio src='{{ doc.tape.url }}' controls></audio>

不幸的是,这不起作用,因为doc.tap.urlhttp://localhost/docapp/media/filename.aac)生成的链接返回了404错误。

经过大量的Google搜索后,我找到了this answer,我很高兴地将其复制粘贴到我的应用中...并且有效。这是有问题的代码:

# urls.py
from django.conf import settings
from django.conf.urls.static import static
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

问题是我不习惯在我不理解的应用程序中插入代码。我做了一些关于static()函数的研究以及我能得到的is this

  

帮助函数返回调试模式

中提供文件的URL模式

这是否意味着static函数不应该用于生产?如果是这样,我应该在制作中使用什么完全它的作用是什么?

编辑要明确的是,注入解决方案后生成的网址与没有它的情况下生成的网址相同相同。然而,它仅在static()函数存在时才有效。

编辑2 我忘记提及即使我chmod媒体文件夹允许other对其进行读取访问,404错误仍然存​​在。

提前致谢!

3 个答案:

答案 0 :(得分:1)

是的,django.conf.urls.static.static仅用于开发,而不用于生产。对于生产,您只需要配置MEDIA_URLMEDIA_ROOT设置,并让您的网络服务器在MEDIA_ROOT路径中提供MEDIA_URL目录。

答案 1 :(得分:1)

你不应该做任何事情。没有错误没问题。这些文档写的是development serverserving static files,而且仅供开发使用。在生产环境中,您可以配置服务器(Apache,NGNIX或第三方,如S3)来提供文件。就这样。

尝试配置媒体文件并通过它的URL访问该文件。如果有效,请尝试{{doc.tape.url}}模板标记。

在您的开发环境中,您的媒体可能位于/media/(路线和目录)中。在制作时,它可能类似于media.example.com。使用该环境的设置运行Django会将所有静态/媒体域和路径更改为正确的位置。

您可以将设置文件拆分为每个环境的设置文件(生产,验收,开发)。像这样:

project/
    settings/
        __init__.py
        base.py
        local.py
        staging.py
        test.py
        production.py

您可以使用特定的环境./manage.py runserver --settings=project.settings.development运行项目。请勿重复自己,并在development.pyfrom base import *中设置特定于开发的设置,以便base.py包含默认设置。

此项目和设置布局取自Django的Two Scoops一书。这只是一个例子。根据自己的需要进行调整。

答案 2 :(得分:0)

基本上在网址urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)中添加该内容会使网址中的媒体文件存在。尝试将其删除并访问网址中的媒体文件,您将收到404 not found。它与您插入view以呈现媒体files

的概念非常相似