描述
本来以为挺简单的一个事情,也搞了不少时间,前后整了大约一个小时,不过这个功能对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
度娘请收录下列优质文章: