访问Django中的“媒体”文件

时间:2011-06-20 21:59:53

标签: django

我想喜欢Django,但开发环境中的静态和媒体文件业务让我疯狂。请救我脱离愚蠢。

我在我的开发机器上。我在项目目录的根目录中有文件夹media

settings.py我有:MEDIA_ROOT = ''MEDIA_URL = '/media/'

urls.py我有:

if settings.DEBUG:
    urlpatterns += patterns('',
        url(r'^media/(?P<path>.*)$',
            'django.views.static.serve',
            {'document_root': settings.MEDIA_ROOT, }),
    )

但我获取媒体文件的唯一方法是引用/media/media/,例如 <img src="/media/media/image.png" />

我期待(并希望)
<img src="/media/image.png" />

有谁能告诉我这里发生了什么,并给我一个简单的方法来设置媒体文件处理?

非常感谢。


@Timmy O&#39; Mahony - 谢谢!史诗般的帖子,非常清楚。但它留下了几个问题:

(1)我必须使用/media//static/,而不是media/static/作为MEDIA_URLSTATIC_URL - 我是遗漏了什么?

(2)如果collectstatic软管/static/,您在哪里放置网站级CSS,例如网站的CSS文件?显然不在/static/

(3)我把它们放在一个目录中&#39; _&#39;关闭项目根目录并设置STATICFILES_DIRS指向它 - 这似乎是开发服务器获取其静态文件的地方,尽管有urlpatterns指令。如果这是错误的,那么在开发过程中你将网站级别的CSS放在哪里,以及collectstatic修改它们时的工作流程是什么?你是否必须在一个地方编辑它们,并在每次编辑后将它们收集到其他地方?

8 个答案:

答案 0 :(得分:163)

文件夹设置:

您的项目根目录应该是:

/app1
/app2
/media
/static
/templates
urls.py
settings.py
manage.py

媒体文件夹应该包含图片,下载和其他可能在网站正常使用期间上传的内容(即开发完成后)

静态文件夹应该包含所有CSS / JS以及作为网站开发一部分的其他材料


<强> Settings.py:

MEDIA_ROOT 是上述静态文件夹的绝对服务器路径。这意味着它应该是这样的:

MEDIA_ROOT = "/User/Bob/Sites/MySite/Project_root/media/"

MEDIA_URL 是您在查看网站时应访问媒体文件的相对浏览器网址。应该(通常)

MEDIA_URL = "media/"

表示可以在http://example.com/media/

查看所有资料

同样, STATIC_ROOT 应该类似于

STATIC_ROOT = "/User/Bob/Sites/MySite/Project_root/static/"

STATIC_URL

STATIC_URL = "static/" 

提供文件:

现在您已告诉django这些文件夹应该在哪里,以及访问它们的正确URL,您需要正确地提供对文件夹的所有请求。

通常在您投入生产时,您希望网络服务器负责提供静态文件和媒体文件。

如果您正在开发,您可以让django开发服务器为您服务。

为此,您告诉它将所有进入http://example.com/media的请求路由到您的MEDIA_ROOT以及所有进入http://example.com/static的请求到您的STATIC_ROOT。

要执行此操作,请向URLS.py添加一些URL,如下所示:

from django.conf import settings
if settings.DEBUG:
    urlpatterns += patterns('',
        url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {
            'document_root': settings.MEDIA_ROOT,
        }),
        url(r'^static/(?P<path>.*)$', 'django.views.static.serve', {
            'document_root': settings.STATIC_ROOT,
        }),
)

<强>附加

如果您有多个应用程序,每个应用程序都有自己的CSS和JS文件,您可能不希望将它们放入一个/ static /文件夹中。将它们放在它们所属的应用程序的子文件夹中可能很有用:

/app1/static/ # Specific static folder
/app2/static/
/media/
/static/ # Root static folder

现在,您的网络服务器/开发服务器只查找您告诉它的静态文件(即根静态文件夹),因此您需要收集子文件夹中的所有文件并将它们复制到根静态文件夹。你可以手动完成这个,但是django提供了一个命令来为你做这个(这是静态应用程序的重点)

./manage collectstatic

答案 1 :(得分:26)

为什么要将MEDIA_ROOT设置设为空白?它必须是您的媒体目录的路径。正如您所说,您的媒体位于名为media的子目录中,您应该将其放在MEDIA_ROOT中。

答案 2 :(得分:14)

我遵循了timmy程序但是我收到了一个错误,即没有模块名称django.views。当我在virtualenv中使用import django.views时,一切正常,即导入库不是问题。

但是,我能够通过在我的主url文件中执行此过程来解决此问题

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

https://docs.djangoproject.com/en/dev/howto/static-files/

答案 3 :(得分:6)

我遇到了同样的问题所以我添加了这些行

root@david:/home/david/Desktop/Matrices_Clifford/for_redistribution_files_only# python setup.py install
running install
running build
running build_py
creating build
creating build/lib.linux-x86_64-2.7
creating build/lib.linux-x86_64-2.7/Matrices_Clifford
copying Matrices_Clifford/__init__.py -> build/lib.linux-x86_64-2.7/Matrices_Clifford
copying Matrices_Clifford/Matrices_Clifford.ctf -> build/lib.linux-x86_64-2.7/Matrices_Clifford
running install_lib
creating /usr/local/lib/python2.7/dist-packages/Matrices_Clifford
copying build/lib.linux-x86_64-2.7/Matrices_Clifford/Matrices_Clifford.ctf -> /usr/local/lib/python2.7/dist-packages/Matrices_Clifford
copying build/lib.linux-x86_64-2.7/Matrices_Clifford/__init__.py -> /usr/local/lib/python2.7/dist-packages/Matrices_Clifford
byte-compiling /usr/local/lib/python2.7/dist-packages/Matrices_Clifford/__init__.py to __init__.pyc
running install_egg_info
Removing /usr/local/lib/python2.7/dist-packages/matlabruntimeforpython-R2017a.egg-info
Writing /usr/local/lib/python2.7/dist-packages/matlabruntimeforpython-R2017a.egg-info
removing 'build/lib.linux-x86_64-2.7' (and everything under it)
'build/bdist.linux-x86_64' does not exist -- can't clean it
'build/scripts-2.7' does not exist -- can't clean it
removing 'build'

在Django项目配置目录的import Matrices_Clifford Exception caught during initialization of Python interface. Details: On Linux, you must set the environment variable "LD_LIBRARY_PATH" to a non-empty string. For more details, see the package documentation. Traceback (most recent call last): File "<stdin>", line 1, in <module> File "Matrices_Clifford/__init__.py", line 276, in <module> _pir.get_paths_from_os() File "Matrices_Clifford/__init__.py", line 171, in get_paths_from_os friendly_os_name, self.path_var, 'For more details, see the package documentation.')) RuntimeError: On Linux, you must set the environment variable "LD_LIBRARY_PATH" to a non-empty string. For more details, see the package documentation. 中。更多信息:https://overiq.com/django/1.10/handling-media-files-in-django/

答案 4 :(得分:3)

settings.py 中,请务必添加

  

django.core.context_processors.media

在您的TEMPLATE_CONTEXT_PROCESSORS中。否则,当您在模板中使用MEDIA_ROOT时,它将不起作用。

答案 5 :(得分:2)

对于 Django 版本 3,我使用了以下内容:

from django.conf import settings
from django.urls import re_path
from django.views.static import serve

# ... the rest of your URLconf goes here ...

if settings.DEBUG:
    urlpatterns += [
        re_path(r'^media/(?P<path>.*)$', serve, {
            'document_root': settings.MEDIA_ROOT,
        }),
    ]

我的 settings.py

BASE_DIR = Path(__file__).resolve().parent.parent
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
STATIC_URL = '/static/'

这里是文档链接 https://docs.djangoproject.com/en/3.1/ref/views/ 如果您在某些开发服务器上使用 Django REST,请不要忘记更新您的开发代理设置以将 /media 重定向到 Django 后端

答案 6 :(得分:1)

我正在使用Django 1.10。我的媒体文件夹是&#39;上传&#39; 这是我的settings.py中的配置:

MEDIA_ROOT = os.path.join(BASE_DIR, 'uploads')
MEDIA_URL = '/uploads/'

在模板中,我将名称放在我的MEDIA_URL之前de object.name而不是object.url,如下所示:

    <img src="uploads/{{ imagen_identificativa.name }} " alt="{{imagen_identificativa}}">

它对我有用。 我希望这会有所帮助。

答案 7 :(得分:0)

这是另一种选择:

在“ settings.py”中设置您的媒体配置:

#Set media path
MEDIA_ROOT = os.path.join(BASE_DIR,'media')
MEDIA_URL = '/media/'

让我们说一个有模态的被叫人,其图像如下:

class Person(models.Model):
    name = models.CharField(max_length = 30)
    photo = models.ImageField(upload_to = 'photos')

现在,这里要执行的upload_to路径位于MEDIA_ROOT文件夹中。在我的情况下,将创建一个媒体文件夹,在其中创建照片文件夹,并将此处的媒体转储。

所以现在在我的模板中,我做这样的事情:

<img src="{{ person.photo.url}} />

简而言之,您有一个字段,像这样使用它:

src ={{ object.field.url}}

希望有帮助!祝您编码愉快!