首页 > 其他分享 >django后端修改url,解决图片防盗链

django后端修改url,解决图片防盗链

时间:2024-12-20 22:54:18浏览次数:3  
标签:img get url django content fullpath type 防盗链 图片

目前大部分文章关于防盗链绕过办法,都是设置参数,使其不携带referrer

<meta name="referrer" content="no-referrer" />

或者使用标签的referrerpolicy属性‌进行局部设置

<img src="http://example.com/image.jpg" referrerpolicy="no-referrer" />

或者通过在一个不可见的 iframe 或嵌入页面中加载图片来绕过 Referer 检查。然而,这种方法并不总是有效,因为有些网站会检查图片的加载上下文,以确保它不是被嵌入在一个不可见的元素中。

但是现在根据referrer来防盗图片都是进行主域名匹配。如果没有携带referrer一样不能请求到图片。所以上述办法基本上都不行了,那就只能使用最原始的办法了。
使用Python中request库携带正确referrer,模拟用户访问活动打开图片,获取到图片数据,然后再传给前端页面
前端代码方面不改动,只需要操作后台返回的数据,利用re批量将img标签src中加上服务器地址即可,使其变为从自己的服务器上获取图片

#改变图片地址
html_content=re.sub(r'<img src="(.*?)".*?>', r'<img src="/get_img/\1" />', html_content)
# 此时前端的页面中img标签就是,
<img src="/get_img/http://example.com/image.jpg" />

然后在后端增加一个接口,专门处理请求,下面给出django的参考代码

from django.urls import re_path
import mimetypes
from django.http import HttpResponse
import requests

session = requests.Session()


def get_img(request, fullpath, *args, **kwargs):
    print("\n\t解析 %s 图片啦\n" % fullpath)
    if "XXXX" in fullpath:
        # 根据原始地址中的特殊字符,来设置相应的请求头,
        session.headers = XXX_header
    session.headers["Connection"] = "keep-alive"

    # 获取图片二进制数据
    img_bit = session.get(fullpath).content
    # 根据图片链接,判断类型,构造返回数据
    content_type, encoding = mimetypes.guess_type(fullpath)
    content_type = content_type or "application/octet-stream"
    response = HttpResponse(img_bit, content_type=content_type)
    # 设置浏览器缓存时间
    response["Cache-Control"] = "public, max-age=31536000"  # 缓存1年

    if encoding:
        response.headers["Content-Encoding"] = encoding
    return response


urlpatterns = [
    # 获取图片的接口,有名分组,将匹配到的图片地址命名fullpath
    re_path("get_img/(?P<fullpath>http.*)", get_img),
]

以后浏览器显示图片时,就自动会向我们的服务器发送get请求,并在/get_img/后面携带图片地址了,此时服务器会根据携带地址去拿到图片数据,然后返回给浏览器,并缓存1年。
当然,你也可以将解析过图片保存,下次直接返回图片,减少二次访问原始网站的次数

标签:img,get,url,django,content,fullpath,type,防盗链,图片
From: https://www.cnblogs.com/zdwzdwzdw/p/18620074

相关文章

  • SQLAlchemy与Pandas版本差异中的URL字符问题:quote_plus来解决
    在数据科学和工程领域,SQLAlchemy和Pandas是两个极其常用的Python库。SQLAlchemy是一个强大的SQL工具包和对象关系映射(ORM)库,而Pandas则是数据处理和分析的必备工具。然而,在使用这两个库进行数据库操作时,特别是当它们的版本之间存在较大差异时,你可能会遇到一些字符处理的问题,尤其是......
  • Python旅游信息管理系统v7c4w(Pycharm Flask Django Vue mysql)
    文章目录项目介绍和开发技术介绍具体实现截图开发技术开发与测试:设计思路系统测试可行性分析核心代码部分展示文章目录/写作提纲参考源码/演示视频获取方式项目介绍和开发技术介绍旅游信息管理系统的现状来进行开发的,具体根据现实的需求来实现旅游信息管理系统网络......
  • Python古玩玉器藏品交易系统(Pycharm Flask Django Vue mysql)
    文章目录项目介绍和开发技术介绍具体实现截图开发技术开发与测试:设计思路系统测试可行性分析核心代码部分展示文章目录/写作提纲参考源码/演示视频获取方式项目介绍和开发技术介绍实现了一个古玩玉器交易系统。古玩玉器交易系统的主要用户分为用户、管理员。管理员......
  • Django使用openpyxl实现数据的导入与导出
    将序列化后的数据导出成excel格式#导入依赖importiofromopenpyxlimportWorkbook#将格式化的数据导出为excel的方法defoutput_excel(data):#创建Excel工作簿wb=Workbook()ws=wb.activews.title="文件标题"#写入表头headers=......
  • Dubbo 3.x源码(27)—Dubbo服务引用源码(10)subscribeURLs订阅应用级服务url
    基于Dubbo3.1,详细介绍了Dubbo服务的发布与引用的源码。上文我们学习了Dubbo3的应用级服务发现订阅refreshServiceDiscoveryInvoker方法的源码,下面我们将会学习应用级服务发现订阅后半部分的源码,即在获取到服务应用名之后,通过subscribeURLs方法进行应用级别的服务url订阅......
  • 225Python大学生社团管理系统(Pycharm Flask Django Vue mysql)
    文章目录项目介绍和开发技术介绍具体实现截图开发技术开发与测试:设计思路系统测试可行性分析核心代码部分展示文章目录/写作提纲参考源码/演示视频获取方式项目介绍和开发技术介绍对于网站的前台设计,要保证主界面的整洁有序,能够抓住人的眼球,不会产生视觉疲劳,更重要......
  • 《Django 5 By Example》读后感
    一、为什么选择这本书?本人的工作方向为PythonWeb方向,想了解下今年该方向有哪些新书出版,遂上packt出版社网站上看了看,发现这本书出版时间比较新(2024年9月),那就它了。从2024年11月11日至2024年12月18日期间,花了22天阅读完《Django5ByExample》(《Django项目实例精解》)。......
  • 毕业设计:python二手车数据分析可视化系统 requests爬虫 Echarts可视化 Django框架(源码
    毕业设计:python二手车数据分析可视化系统requests爬虫Echarts可视化Django框架(源码)✅1、项目介绍技术栈:python语言、Django框架、MySQL数据库、requests爬虫技术、汽车之家二手车、Echarts可视化2、项目界面(1)中国地图–全国各地车辆数据(2)会员注册年份与等级(3)二......
  • 毕业设计:python车牌识别系统 HyperLPR车牌识别(深度学习) 可视化 Django框架 大数据毕业
    python车牌识别系统HyperLPR车牌识别(深度学习)可视化Django框架大数据毕业设计(源码+文档)1、项目介绍技术栈:Python语言、Django框架、MySQL数据库、HyperLPR库车牌识别(深度学习)、Echarts可视化系统功能:车牌号码识别,车牌所属省份,再给他搞个各省统计分析,柱状图,折线图......
  • Django中注册模型到Admin界面
    Django是一个高级的PythonWeb框架,它鼓励快速开发和干净、务实的设计。Django自带了一个强大的管理后台(Admin),可以让开发者轻松地管理数据库中的数据。在这篇博文中,我们将详细介绍如何在DjangoAdmin中注册一个模型,并定制其显示和管理方式。前提条件在开始之前,确保你......