使用Django提供随机图像

时间:2014-08-22 18:28:29

标签: javascript python django

我有约。 100.000图片和我的目标是生成一个Django支持的网页,每次页面加载时随机显示其中一张图片(实际上它有点复杂,但这是我的最小例子)。我现在的方法如下:

  1. 我将所有100.000个文件放入我的应用程序的静态文件夹中。
  2. 我手动生成一个包含所有图像路径的数据库。
  3. 与URL相关的视图随机选择数据库条目(即路径)并从模板生成页面。
  4. 我的视图模板如下所示:

    ...
    <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画布上。这是Python中相应的Django视图:

    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 个答案:

答案 0 :(得分:1)

由于评论ImageField实际上并未将图像存储在数据库中,因此它会链接到文件系统中的图像,并生成适当的图像网址,以便在模板中使用。

您可以使用rImage = Images.objects.order_by('?')[0]获取随机图像,但请记住,根据您使用的数据库后端(例如mysql),它可能会很昂贵并且运行速度很慢。然后你可以将图像对象传递给模板并使用{{rImage.image_field.url}}(图像字段为你处理url生成,只需在项目设置中设置正确的值)