我有一个 django 项目,它正在(例如)上运行localhost:8000
。
我在这个地址有一张图片localhost:8000/static/test.jpg
。用户可以通过转到它的 url 来打开这个图像,而不是打开包含页面。
我想知道该图像是否已加载到用户的浏览器中(通过加载包含页面或仅输入图像的 url),并且我想获取该请求的请求对象。
我可以在我的视图中有一个仅针对该特定图像的方法吗?我在互联网上搜索,但没有找到任何有用的东西。任何想法或解决方案?
我有一个 django 项目,它正在(例如)上运行localhost:8000
。
我在这个地址有一张图片localhost:8000/static/test.jpg
。用户可以通过转到它的 url 来打开这个图像,而不是打开包含页面。
我想知道该图像是否已加载到用户的浏览器中(通过加载包含页面或仅输入图像的 url),并且我想获取该请求的请求对象。
我可以在我的视图中有一个仅针对该特定图像的方法吗?我在互联网上搜索,但没有找到任何有用的东西。任何想法或解决方案?
你是说禁止盗链吗?这可以更容易 - 更有效地 - 使用运行在 Django 服务器前面的网络服务器来完成。
有关 Apache 的一些示例,请查看https://wiki.apache.org/httpd/DisableImageHotLinking
这只能通过为您的图像提供自定义视图来实现。例如,您应该编写自己的视图来返回静态资源,并且您不会使用标准的 django 静态处理程序
首先,请注意,在生产环境中提供静态文件不应该首先由 Django 处理。来自contrib/staticfiles/views.py
:
用于提供静态文件的视图和函数。这些只能在开发过程中使用,不应该在生产环境中使用。
如果您确实想使用它,那么您可以编写一个自定义中间件来连接process_view
或process_request
做您的事情。
我终于做到了。例如,我有一个文件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
你的方式很好,但机器人流量很大。在这种情况下,您可以使用XSendFile
与 Apache 一起使用的库女巫