我有一个用于在制冷系统上制作表格的django系统。
我有一个名为System的模型。
我有很多代表表格的模型,很多都有:
这是zip视图中的get方法:
def get(self, request, *args, **kwargs):
print('# AnlageZip GET NEU ###################################################################################################')
self.pk=self.kwargs.get('pk')
self.template_name = "stammdat/Anlage/info.html"
self.user=self.request.user
#
host=self.request.get_host()
try :
an=Anlage.objects.filter(user=self.request.user).get(pk=self.pk)
except ObjectDoesNotExist :
an=None
#
tfile=BytesIO()
zf = zipfile.ZipFile( tfile, "w" )
# Leere Liste erzeugen
AnlageFiles=[]
#
seq=1
x={}
x['Filename'] = '{:02d}_{}.pdf'.format(seq,an.CLASSNAME)
x['pdf_url'] = 'http://'+host+an.get_pdf_url()
x['data'] = urllib.request.urlopen( x['pdf_url'] )
#x['data1'] =
AnlageFiles.append(x)
print(x['Filename'],x['pdf_url'])
zf.writestr( x['Filename'],x['data'].read())
seq+=1
# Jetzt Dokumentation suchen
# Alle diese modelle benötigen einen foreign Key zu Anlage namens anlage
#
DokuModels = [KurzBetrAnleitA1, KurzBetrAnleitA3, KurzBetrAnleitNH3, UebernahmeUebergabeKurz,UebernahmeUebergabe,
SichDruckBegrenz,DruckFestPruef,AbnahmPruefDruckbeh,WiederPruefDruckbeh,AbnahmPruefRohr,WiederPruefRohr,
PruefListSicht,PruefBeschWK8901,Wartungsvertrag,Einbauerklaerung,
EGKonformErkl,Instandhaltungsvertrag,RisikoBeurteilung]
#
for doku in DokuModels :
docs=doku.objects.filter(anlage=an)
if len(docs) > 0 :
for item in docs :
x={}
x['Filename'] = '{:02d}_{}.pdf'.format(seq,item.CLASSNAME)
x['pdf_url'] = 'http://'+host+item.get_pdf_url()
x['data'] = urllib.request.urlopen( x['pdf_url'] )
AnlageFiles.append(x)
zf.writestr( x['Filename'],x['data'].read())
seq+=1
zf.close()
#
response = HttpResponse(content_type='application/x-zip-compressed')
response['Content-Disposition'] = 'attachment; filename="Anlage_{}.zip'.format(self.pk)
response.write(tfile.getvalue())
tfile.close()
return response
有一个名为SytemOverView的视图 它检查所有模型的外键到系统 如果他们有一个, 它调用get_pdf_url方法 并为列表创建上下文 您可以点击网址并在视图中获取pdf(最多54个),工作正常
现在我创建了一个ZIP视图,可以一次性下载所有pdf 但我在zip中的pdf文件只包含登录页面的html代码 因为请求查询未被授权。
如何重新启动系统zip视图的django会话 所有pdf的请求?
答案 0 :(得分:0)
就像我在评论中说的那样,你正在对你自己的网站进行外部调用,你应该调用pdf视图直接传递请求对象以保留会话,如下所示,但似乎有点难以修改请求反对构建不同的PDF
def pdf_view(request):
...
# construct pdf
...
return pdf_response
def zipview(request):
pdf1 = pdf_view(request)
pdf2 = pdf_view(request)
# do the zip
我建议重构pdf函数,如下所示:
def generate_pdf(...):
...
return pdf
def pdf_view(request):
...
return generate_pdf(..)
def zip_view(request):
pdf1 = generate_pdf(params)
pdf2 = generate_pdf(params)
# do the zip
答案 1 :(得分:0)
使用来自已连接客户端的会话和一个简单的javascript函数来收集文件。
在django视图的模板中,我创建了一个脚本,该脚本从页面中收集所有pdf文件并从中构建一个zip文件。
<input id="zipme" type="button" value="Create Zip File (takes some time ...)" onclick="CreateZip();" class="btn btn-primary hidden-print btn-block" />
<script src="/static/js/jszip.min.js"></script>
<script src="/static/js/FileSaver.min.js"></script>
<script type="text/javascript">
function CreateZip(){
var zip = new JSZip();
var zaehler=0
{% for formdata in Doku %}
var {{formdata.blob}} = null;
var {{formdata.request}} = new XMLHttpRequest();
{{formdata.request}}.open("GET", "{{ formdata.pdf_url }}" );
//{{formdata.request}}.onload = function(){
// {{formdata.blob}} = {{formdata.request}}.responseText;
//}
{{formdata.request}}.send();
zaehler=zaehler+1;
//
{{formdata.request}}.onreadystatechange = function () {
if ({{formdata.request}}.readyState == 4) {
zaehler=zaehler-1;
{{formdata.blob}} = {{formdata.request}}.responseText;
zip.file("{{formdata.Filename}}", {{formdata.blob}});
//console.log("{{formdata.Filename}}");
if ( zaehler==0 ) {
zip.generateAsync({type:"blob"})
.then(function(content) {
// see FileSaver.js
saveAs(content, "Anlage.zip");
});
}
}
};
{% endfor %}
};
</script>
在视图中,我刚刚添加了一个上下文列表变量Doku,其中包含要处理的单个和uniq变量名称的dict。这可以避免异步头痛。