Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在django中编写自定义重定向修饰符_Python_Django - Fatal编程技术网

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,但也没有成功: