用Django随机显示图片

3 投票
1 回答
1852 浏览
提问于 2025-04-18 18:13

我有大约10万张图片,我的目标是创建一个基于Django的网站,每次页面加载时随机显示一张图片(其实事情比这复杂一点,但这是我的最简单例子)。我现在的做法是这样的:

  1. 我把这10万张图片都放进了我应用的静态文件夹里。
  2. 我手动生成了一个数据库,里面包含了所有图片的路径。
  3. 一个与URL相关的视图随机选择数据库中的一条记录(也就是一个路径),然后从模板生成页面。

我的视图模板看起来是这样的:

...
<body>
<H1>'Hello World' from the template!</H1>
Here's a random image: "{{rImage}}"<p>
<canvas class="stream" id="canvas" style="z-index: 1; outline: 1px solid red;" width=505px height=336px></canvas>
<script>
var canvas = document.getElementById("canvas");
var cxt = canvas.getContext("2d");

img = new Image();
img.onload = function(){};
img.src = "/static/rim/{{rImage}}";

cxt.drawImage(img,0,0,canvas.width,canvas.height);
</script>
</body>
...

{{rImage}} 是随机图片的路径。正如你所看到的,我实际上是用JavaScript把图片绘制到一个HTML5画布上。这是对应的Django视图的Python代码:

def index(request):
    rImage = Images.objects.all()[random.randint(0, 100000)].relativeUrl
    template = loader.get_template('rim/index.html')
    context = RequestContext(request,{'rImage':rImage})
    return HttpResponse(template.render(context))

虽然这样确实能工作,但我觉得我可能违反了一些基本的设计原则。这样提供静态图片算不算好做法?还是说我应该把整个图片(而不仅仅是路径)直接放到数据库里,比如用一个ImageField?正确的做法应该是什么呢?

1 个回答

2

正如评论所说,ImageField 实际上并不是把图片存储在数据库里,它只是存储了指向文件系统中图片的链接,并为在模板中使用这些图片生成了合适的 URL。

你可以用 rImage = Images.objects.order_by('?')[0] 来获取一张随机图片,但要注意,这个操作可能会比较耗费资源和时间,具体取决于你使用的数据库类型(比如说 MySQL)。然后,你可以把这个图片对象传递给模板,并使用 {{rImage.image_field.url}} (图片字段会为你处理 URL 的生成,只需在项目设置中设置好相应的值)。

撰写回答