Django 在将模板图像保存到服务器存储后更新模板图像
Django update template image after save it on server storage
我对文件上传有疑问,请在模板上刷新。
在我看来,我有一个文件保存系统的自定义变体:
sp = os.path.join(os.path.dirname(__file__), '../media/avatars')
av_name = os.path.join(sp, u.username + "_avatar.jpg")
dataUrlPattern = re.compile('data:image/(png|jpeg);base64,(.*)$')
ImageData = request.POST.get('u_avatar')
ImageData = dataUrlPattern.match(ImageData).group(2)
ImageData = base64.b64decode(ImageData)
ava = open(av_name, 'wb')
ava.write(ImageData)
ava.close()
而且效果很好。我可以上传和更新头像并使用自定义名称将其保存在媒体文件夹中。但是当我尝试保存新文件时,它不会在模板上刷新!我的意思是文件保存正确,我在服务器文件夹中看到一个新图像,但模板渲染了它们的旧版本。当我尝试打开图片 link 时,我仍然看到一个旧文件。
我认为原因是某种缓存,但我不明白它是如何工作的。
你能帮我吗,每次上传后如何刷新图像?
编辑:
这是我的完整观点:
def edit(request):
u = request.user
p = get_object_or_404 (Profile, user=request.user)
if request.method == 'POST':
profile_form = ProfileForm(request.POST)
if profile_form.is_valid():
if request.POST.get('u_avatar'):
sp = os.path.join(os.path.dirname(__file__), '../media/avatars')
av_name = os.path.join(sp, u.username + "_avatar.jpg")
os.remove(av_name)
dataUrlPattern = re.compile('data:image/(png|jpeg);base64,(.*)$')
ImageData = request.POST.get('u_avatar')
ImageData = dataUrlPattern.match(ImageData).group(2)
ImageData = base64.b64decode(ImageData)
ava = open(av_name, 'wb')
ava.write(ImageData)
ava.close()
profile = profile_form.save(commit=False)
profile.user = u
profile.avatar = str("/media/avatars/" + u.username + "_avatar.jpg")
profile.filled = True
if p.rate < 0.5:
profile.rate = 0.5
else:
profile.rate = p.rate
profile.save()
return HttpResponseRedirect('profile')
else:
profile_form = ProfileForm()
return render(request, 'profile_edit.html', {'profile_form': profile_form})
这是我在模板上的头像:
<div class="lavatar"><a href="/profile"><img src="{{ user.profile.avatar }}" class="img-circle"></a></div>
顺便说一句,我使用 CharField 作为头像,而不是 ImageField 或 FileField。也许有问题。
EDIT2
现在我发现了一个有趣的新事实:图像会在一段时间后更新。我上传了一张新图片,大约 1.5 - 2 小时没有访问网站。而且头像刷新了
终于找到问题了!
云焰!我在页面规则上设置了 "Bypass cache",它似乎运行良好。
我对文件上传有疑问,请在模板上刷新。 在我看来,我有一个文件保存系统的自定义变体:
sp = os.path.join(os.path.dirname(__file__), '../media/avatars')
av_name = os.path.join(sp, u.username + "_avatar.jpg")
dataUrlPattern = re.compile('data:image/(png|jpeg);base64,(.*)$')
ImageData = request.POST.get('u_avatar')
ImageData = dataUrlPattern.match(ImageData).group(2)
ImageData = base64.b64decode(ImageData)
ava = open(av_name, 'wb')
ava.write(ImageData)
ava.close()
而且效果很好。我可以上传和更新头像并使用自定义名称将其保存在媒体文件夹中。但是当我尝试保存新文件时,它不会在模板上刷新!我的意思是文件保存正确,我在服务器文件夹中看到一个新图像,但模板渲染了它们的旧版本。当我尝试打开图片 link 时,我仍然看到一个旧文件。
我认为原因是某种缓存,但我不明白它是如何工作的。
你能帮我吗,每次上传后如何刷新图像?
编辑:
这是我的完整观点:
def edit(request):
u = request.user
p = get_object_or_404 (Profile, user=request.user)
if request.method == 'POST':
profile_form = ProfileForm(request.POST)
if profile_form.is_valid():
if request.POST.get('u_avatar'):
sp = os.path.join(os.path.dirname(__file__), '../media/avatars')
av_name = os.path.join(sp, u.username + "_avatar.jpg")
os.remove(av_name)
dataUrlPattern = re.compile('data:image/(png|jpeg);base64,(.*)$')
ImageData = request.POST.get('u_avatar')
ImageData = dataUrlPattern.match(ImageData).group(2)
ImageData = base64.b64decode(ImageData)
ava = open(av_name, 'wb')
ava.write(ImageData)
ava.close()
profile = profile_form.save(commit=False)
profile.user = u
profile.avatar = str("/media/avatars/" + u.username + "_avatar.jpg")
profile.filled = True
if p.rate < 0.5:
profile.rate = 0.5
else:
profile.rate = p.rate
profile.save()
return HttpResponseRedirect('profile')
else:
profile_form = ProfileForm()
return render(request, 'profile_edit.html', {'profile_form': profile_form})
这是我在模板上的头像:
<div class="lavatar"><a href="/profile"><img src="{{ user.profile.avatar }}" class="img-circle"></a></div>
顺便说一句,我使用 CharField 作为头像,而不是 ImageField 或 FileField。也许有问题。
EDIT2
现在我发现了一个有趣的新事实:图像会在一段时间后更新。我上传了一张新图片,大约 1.5 - 2 小时没有访问网站。而且头像刷新了
终于找到问题了!
云焰!我在页面规则上设置了 "Bypass cache",它似乎运行良好。