我正在尝试让我的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.url
(http://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错误仍然存在。
提前致谢!
答案 0 :(得分:1)
是的,django.conf.urls.static.static
仅用于开发,而不用于生产。对于生产,您只需要配置MEDIA_URL
和MEDIA_ROOT
设置,并让您的网络服务器在MEDIA_ROOT
路径中提供MEDIA_URL
目录。
答案 1 :(得分:1)
你不应该做任何事情。没有错误没问题。这些文档写的是development server和serving 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.py
和from base import *
中设置特定于开发的设置,以便base.py
包含默认设置。
此项目和设置布局取自Django的Two Scoops一书。这只是一个例子。根据自己的需要进行调整。
答案 2 :(得分:0)
基本上在网址urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
中添加该内容会使网址中的媒体文件存在。尝试将其删除并访问网址中的媒体文件,您将收到404 not found
。它与您插入view
以呈现媒体files