Python 在django中编写自定义重定向修饰符
我正在尝试编写以下重定向装饰器的变体:Python 在django中编写自定义重定向修饰符,python,django,Python,Django,我正在尝试编写以下重定向装饰器的变体: def permanent_redirect(url): def outer(f): @wraps(f) def inner(request, *args, **kwargs): f(request, *args, **kwargs) return HttpResponseRedirect(url if not callable(u
def permanent_redirect(url):
def outer(f):
@wraps(f)
def inner(request, *args, **kwargs):
f(request, *args, **kwargs)
return HttpResponseRedirect(url if not callable(url) else url())
return inner
return outer
我的目标是这样使用它:
#@permanent_redirect('/dash2.html')
def generate_pdf_assembly(request):
data = request.session['sale']
invoice_number = data[0]['invoice_number']
print("this is data from generate pdf assembly", data)
#total_ht = request.session['sale'].get('NetAmount')
rate_list = []
for index in range(len(data)):
rate_list.append(round(data[index]['NetAmount']/data[index]['Quantity'],1))
total_ht = []
for index in range(len(data)):
total_ht.append(data[index]['NetAmount'])
print('total_ht', total_ht)
total_ht = sum(total_ht)
my_company = MyCompany.objects.get(id = 1)
tva = MyCompany.objects.aggregate(Sum('TVA'))['TVA__sum']
tva_value = round(total_ht * tva,1)
total_ttc = total_ht + tva_value
tableau = zip(rate_list, data)
context = {'data' : data,
'my_company' : my_company,
'total_ht':total_ht,
'tva_value':tva_value,
'total_ttc':total_ttc,
'rate_list':rate_list,
'tableau':tableau,
'invoice_number':invoice_number,
}
print("context",context)
pdf = render_to_pdf(url, context)
if pdf:
response = HttpResponse(pdf, content_type='application/pdf')
print("response ok")
filename = "Melt_Invoice_{}.pdf".format(data[0]['customer_name'])
print("filename ok")
content = "inline; filename={}".format(filename)
print("content ok")
content = "attachment; filename={}".format(filename)
print("content 2 ok")
response['Content-Disposition'] = content
print("response ok")
return response
else:
print("fuck this shit")
return HttpResponse("Not found")
尽管这种重定向很好,但问题是它忽略了所放置视图上的渲染值或通用文件
老实说,我在这里有点不在行,我该如何修改这个装饰器,以便它考虑视图输出的内容
更新:我设法写了两个版本的装饰,但我仍然挣扎,其中一个重定向罚款和其他下载罚款,但没有重定向
重定向和下载装饰程序版本1:
这一个重定向用户没有问题,但不下载文件
def download_and_redirect(url, view):
def outer(f):
@wraps(view)
def inner(request, *args, **kwargs):
def inner_inner(request, *args, **kwargs):
data = request.session['sale']
print(data)
context = request.session['context']
print(context)
pdf = render_to_pdf('pdf/invoice_generator_assembly.html', context)
if pdf:
response = HttpResponse(pdf, content_type='application/pdf')
print("response ok")
#filename = "Melt_Invoice_{}.pdf".format(data[0]['customer_name'])
filename = "Melt_Invoice_{}.pdf"
print("filename ok")
content = "inline; filename={}".format(filename)
print("content ok")
content = "attachment; filename={}".format(filename)
print("content 2 ok")
response['Content-Disposition'] = content
print("response ok")
return response
else:
print("fuck this shit")
return HttpResponse("Not found")
f(request, *args, **kwargs)
return HttpResponseRedirect(url if not callable(url) else url())
return inner
return outer
下载并重定向装饰程序版本2:
这一个可以很好地下载文件,但无法进行重定向:
def download_and_redirect(url, view):
def outer(f):
@wraps(view)
def inner(request, *args, **kwargs):
data = request.session['sale']
print(data)
context = request.session['context']
print(context)
pdf = render_to_pdf('pdf/invoice_generator_assembly.html', context)
if pdf:
response = HttpResponse(pdf, content_type='application/pdf')
print("response ok")
#filename = "Melt_Invoice_{}.pdf".format(data[0]['customer_name'])
filename = "Melt_Invoice_{}.pdf"
print("filename ok")
content = "inline; filename={}".format(filename)
print("content ok")
content = "attachment; filename={}".format(filename)
print("content 2 ok")
response['Content-Disposition'] = content
print("response ok")
return response
else:
print("fuck this shit")
return HttpResponse("Not found")
f(request, *args, **kwargs)
return HttpResponseRedirect(url if not callable(url) else url())
return inner
return outer
为什么不起作用?
让我们简化您的功能:
def generate_pdf_assembly(request):
pdf = maybe_generate_a_pdf(request)
if pdf:
response = HttpResponse(pdf, content_type='application/pdf')
response['Content-Disposition'] = get_content(request)
return response
else:
return HttpResponse("Not found")
请注意,此函数没有副作用,生成的pdf通过返回值返回。现在看看你的装饰师
def permanent_redirect(url):
def outer(f):
@wraps(f)
def inner(request, *args, **kwargs):
f(request, *args, **kwargs) # This line is the problem
return HttpResponseRedirect(url if not callable(url) else url())
return inner
return outer
看看这里发生了什么f(请求,*args,**kwargs)
。这就是调用视图的地方,返回的值不会分配给任何对象(您不会执行x=f(request,*args,**kwargs)
。因此,带有pdf附件的HttpResponse将永远丢失。然后,您将相应地重定向
如何修复它?
这并不是很直截了当。老实说,这取决于你想做什么,但看起来你想做的是下载文件,然后在下载文件后将用户重定向到新页面
如果是这种情况,那么这不是后端可以实现的,您需要使用一些聪明的javascript来处理这一点。最好提出一个单独的问题,专门解决这个问题,因为它超出了这个问题的范围。您想对返回值做些什么?让我来upda这篇文章是为了更好地向您展示我的目标。基本上,这个当前的装饰程序阻止文件被下载。谢谢您的回答,我是django的初学者,在这个问题上我真的很头疼,看看这个,我今天下午已经尝试使用javascript,但也没有成功: