我已经阅读了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>
浏览器中没有显示图像。
我做错了什么?
答案 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位)。