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

use*_*503 2 python django image

我已经阅读了这篇文章(以及关于该主题的其他几篇文章),但仍然无法弄清楚如何显示图像,除非将链接到web服务上存在的文件硬编码到html模板中.

我进入了urls.py:

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

...
Run Code Online (Sandbox Code Playgroud)

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

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

...
<li><img src=160.jpg alt='' title='' /></li>
...
Run Code Online (Sandbox Code Playgroud)

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

http://127.0.0.1:8000/galleries/landscapes/160.jpg
Run Code Online (Sandbox Code Playgroud)

settings.py我有:

MEDIA_ROOT = 'C:/siteURL/galleries/'
MEDIA_URL = 'http://some-good-URL/galleries/'
Run Code Online (Sandbox Code Playgroud)

在文件系统中有一个文件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>
Run Code Online (Sandbox Code Playgroud)

浏览器中没有显示图像.

我究竟做错了什么?

Eda*_*aor 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>
Run Code Online (Sandbox Code Playgroud)

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

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

使您的dev服务器提供静态文件

在真实环境中,您将配置具有"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}),
)
Run Code Online (Sandbox Code Playgroud)

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

最后的说明

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

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


Ale*_*lli 5

这看起来很麻烦......:

r'^galleries/(landscapes)/(?P<path>.jpg)$'
Run Code Online (Sandbox Code Playgroud)

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

r'^galleries/(landscapes)/(?P<path>.*jpg)$'
Run Code Online (Sandbox Code Playgroud)

...?

  • 更好的是`(?P <path>.+ \.(jpg | png | gif))` (2认同)