给Django新增了图片地址重写,302跳转的功能


描述

本来以为挺简单的一个事情,也搞了不少时间,前后整了大约一个小时,不过这个功能对SEO来说还是有点用的. 大致的需求就是 : 图片表面上看都是本地图片,也可以正常访问,但是实际访问的时候,是做302跳转,跳转到图床上.

这样做有什么好处? 目前也不知道,总是感觉如果用太多的外链图片不是很好,其他的倒也没有刻意去注意了

大致的效果就是:http://www.zhangte.org/image/aHR0cDovL3Fpbml1a2FmZWkuemhhbmd0ZS5vcmcvbXdlYi8xNjA5MTkwOTMxODIwNS5qcGc=.jpg 你访问这个图片,实际上调用的是七云牛的远程图床图片...,减少本地的流量消耗!

实现流程

1. Django的Views的写法

这里做了bsase64的解密,主要是想看起来更正规一点

import base64
from django.shortcuts import redirect
class ImgScr(View):
    def get(self, request,img_src):
        # 对传入的图片进行base64加密,然后解析出来
        img_url = base64.b64decode(img_src).decode("utf-8")
        return redirect(img_url)

2. Django urls的写法

from . import views
from django.urls import path,re_path #新版的django需要用到
urlpatterns = [
    re_path(r'^image/(?P<img_src>.+).[jpg|png]$', views.ImgScr.as_view(), name='imgsrc'),
    ...

这里对图片的img或是png格式进行识别...

3. admin.py的写法

需要重写save_model的方法,具体这里不讨论,只写核心逻辑部分,用的是makedown的文本图片格式,html格式道理一样...

all_domain = request.scheme + '://' + str(Site.objects.get_current())
        P_img = '\((.+?)\)'
        # 找到所有的图片
        for my_src in re.findall('(!\[.+?\]\(.+?\))', content):
            # 对图片进行加密处理
            if all_domain in my_src:
                print(my_src, '加密过了,不处理')
            else:
                # 这里的find_all方法就不对,需要把原始图片地址提取出来
                原始图片地址 = re.findall(P_img, my_src)[0].encode("utf-8")
                print('开始加密', 原始图片地址)
                加密地址 = base64.b64encode(原始图片地址).decode()
                print('加密地址', 加密地址)

                print(my_src, '要开始替换')
                替换 = re.sub(P_img, f'({all_domain}/image/{加密地址}.jpg)', my_src)
                print(替换, '这是替换过的图片地址')
                content = content.replace(my_src, 替换)


本文关键词: | 图片地址重写 | 图片302 | Django图片重写
转载请注明链接 : http://www.zhangte.org/python/14.html
度娘请收录下列优质文章:
  • 反思,以及重新规划时间的安排