0

我有一个 django 项目,它正在(例如)上运行localhost:8000

我在这个地址有一张图片localhost:8000/static/test.jpg。用户可以通过转到它的 url 来打开这个图像,而不是打开包含页面。

我想知道该图像是否已加载到用户的浏览器中(通过加载包含页面或仅输入图像的 url),并且我想获取该请求的请求对象。

我可以在我的视图中有一个仅针对该特定图像的方法吗?我在互联网上搜索,但没有找到任何有用的东西。任何想法或解决方案?

4

5 回答 5

0

你是说禁止盗链吗?这可以更容易 - 更有效地 - 使用运行在 Django 服务器前面的网络服务器来完成。

有关 Apache 的一些示例,请查看https://wiki.apache.org/httpd/DisableImageHotLinking

于 2013-05-13T10:41:37.190 回答
0

这只能通过为您的图像提供自定义视图来实现。例如,您应该编写自己的视图来返回静态资源,并且您不会使用标准的 django 静态处理程序

于 2013-05-13T10:49:42.643 回答
0

首先,请注意,在生产环境中提供静态文件不应该首先由 Django 处理。来自contrib/staticfiles/views.py

用于提供静态文件的视图和函数。这些只能在开发过程中使用,不应该在生产环境中使用。

如果您确实想使用它,那么您可以编写一个自定义中间件来连接process_viewprocess_request做您的事情。

于 2013-05-13T11:43:21.780 回答
0

我终于做到了。例如,我有一个文件localjost:8000/media/1.jpg,我想获取输入此 url 以加载1.jpg.

我在我的网址中添加了这一行: url(r'^media/(?P<path>.*)$', 'project.views.serve','document_root': settings.MEDIA_ROOT,}),并且我已经设置了 MEDIA_ROOT。然后在project.views.serve我打电话时django.views.static.serve,我将结果作为 HttpResponse 返回。我有一个请求参数,我project.views.serve这样做是为了从中获取用户的 IP:

x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
    ip = x_forwarded_for.split(',')[-1].strip()
else:
    ip = request.META.get('REMOTE_ADDR')
print ip
于 2013-05-20T04:19:49.913 回答
0

你的方式很好,但机器人流量很大。在这种情况下,您可以使用XSendFile与 Apache 一起使用的库女巫

于 2013-05-27T06:40:37.703 回答