无法弄清楚在django dev环境中提供静态图像

时间:2010-03-16 00:12:30

标签: python django image

我已经阅读了the article(以及其他几个关于此主题的内容),但仍然无法弄清楚如何显示图像,除非将存在于网络服务上的文件的链接硬编码到html模板。

我已经进入 urls.py

...        
(r'^galleries/(landscapes)/(?P<path>.jpg)$', 
    'django.views.static.serve', {'document_root': settings.MEDIA_URL}),

...

其中'landscapes'是我试图展示图片的专辑之一。 (还有其他几个。)

views.py 中,它使用以下代码调用模板:

...
<li><img src=160.jpg alt='' title='' /></li>
...

将html中的图像链接解析为:

http://127.0.0.1:8000/galleries/landscapes/160.jpg

settings.py 中我有:

MEDIA_ROOT = 'C:/siteURL/galleries/'
MEDIA_URL = 'http://some-good-URL/galleries/'

在文件系统中有一个文件C:/siteURL/galleries/landscapes/160.jpg我在http://some-good-URL/galleries/landscapes/160.jpg

拥有相同的文件

无论我在urls.py中使用什么 - MEDIA_ROOT或MEDIA_URL(期望提供本地图像或来自网络服务器) - 我都会在浏览器的源代码中关注:

<li><img src=160.jpg /></li>

浏览器中没有显示图像。

我做错了什么?

3 个答案:

答案 0 :(得分:11)

这是一个很长的帖子,基本上总结了我学习的关于Django的所有事情,以便让静态文件工作(我花了一些时间来理解所有不同部分是如何组合在一起的)。

要在开发服务器(以及后来的真实服务器)中提供静态图像,您将不得不做一些事情(特别注意第三和第四步):

设置MEDIA_ROOT

MEDIA_ROOT是一个常量,它告诉Django文件的物理路径(在您的文件系统上)。使用您的示例,MEDIA_ROOT需要设置为'C:/ siteURL / galleries /',就像您写的那样。 MEDIA_ROOT将用于以下步骤之一,这就是我们设置它的原因。

设置MEDIA_URL

MEDIA_URL是您的图片所在的“网址”。换句话说,每当您想要获取图像时,查找的网址都以 MEDIA_URL开头。通常这是以“http”开头,因为您从自己的服务器提供服务(我的MEDIA_URL通常设置为'/ site_media /',意味着从根域开始,然后转到site_media等。)

使用MEDIA_URL

MEDIA_URL无法通过魔法运行,您实际上必须使用它。例如,当您编写获取文件的HTML时,它需要如下所示:

<li><img src="{{MEDIA_URL}}/160.jpg" /></li>

了解我如何告诉模板使用MEDIA_URL前缀?最终转化为'http://some-good-URL/galleries/160.jpg'

请注意,为了能够在模板中实际使用MEDIA_URL,您必须在settings.py文件中将'django.core.context_processors.media'行添加到TEMPLATE_CONTEXT_PROCESSORS设置中,如果我'我没弄错。

让您的开发服务器提供静态文件

在真实环境中,您将配置具有“static_media”等地址的文件,而无需通过Django。但是在开发环境中,你也想要从Django服务它们,所以你应该将这个通用行添加到urls.py文件的末尾:

if settings.DEBUG:
# Serve static files in debug.
urlpatterns += patterns('',
    (r'^site_media/(?P<path>.*)$', 'django.views.static.serve',
    {'document_root': settings.MEDIA_ROOT,
    'show_indexes' : True}),
)

注意如何使用url“site_media / *”(实际上是我的MEDIA_URL)并从我的MEDIA_ROOT文件夹(MEDIA_ROOT设置发挥作用的地方)提供它。

最后的注释

令我感到困惑的是,这里的很多东西都是为了方便。例如,MEDIA_ROOT仅用于您的调试URL模式,以告知Django从何处加载。 MEDIA_URL只是鼓励您不要在所有HTML文件中放入绝对URL,因为当您决定将文件移动到其他服务器时,您必须手动更改它们(而不是仅仅更改MEDIA_URL)常数)。

当然,这些都不是必需的:您可以使用自己的文件夹对调试url模式进行硬编码,确保静态文件确实是来自url的服务器(通过在浏览器中访问它),然后没有使用MEDIA_URL设置进入HTML文件的手动代码,只是为了确保工作正常。

答案 1 :(得分:5)

这看起来有点儿......:

r'^galleries/(landscapes)/(?P<path>.jpg)$'

此RE仅匹配具有单个字符的图像名称,而不是jpg后缀,而不是四个(例如,'160.jpg')。也许你的意思是......

r'^galleries/(landscapes)/(?P<path>.*jpg)$'

...

答案 2 :(得分:1)

将此作为前两个答案之间的交叉,两者都很好。首先,正如Alex指出的那样,你的正则表达式是不正确的。我建议将其设置为:

   (r'^local_media/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT}), # static content

因为您可能也想要服务器css和js文件,而不仅仅是图像。这个正则表达式会处理您可能想要提供的任何静态文件。

接下来,您需要为img标记指定MEDIA_URL。你现在有:

<img src=160.jpg />

相反,它需要像:

<img src=[YOUR MEDIA_URL]160.jpg />

我使用的技巧很简单。在views.py的顶部,我有以下代码:

from django.conf import settings
resp = {}
resp['MEDIA_URL'] = settings.MEDIA_URL

然后我将resp字典传递给我渲染的每个模板。现在我可以将这些相同的img标签写为:

<img src={{MEDIA_URL}}160.jpg />

最重要的是,这部分代码也可用于生产(不是正则表达式,只是MEDIA_URL位)。

相关问题