调用其他vi时的Django授权

2024-04-25 04:18:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个django系统,用于在制冷系统上建立模板。你知道吗

我有一个模型叫做系统。你知道吗

我有很多代表表格的模型,很多模型有:

  1. 系统的外键称为anlage
  2. 一个名为get\u pdf\u url的方法,它将一个url返回给实例的pdf生成器
  3. 属性类名

这是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\u pdf\u url方法 并为列表创建上下文 你可以点击网址,并得到pdf(多达54)的看法,工作正常

现在我创建了一个ZIP视图来一次性下载所有的pdf 但是我的zip中的pdf文件只包含登录页面的html代码 因为请求查询未被授权。你知道吗

如何重用django会话以启动系统zip视图 所有pdf的请求?你知道吗


Tags: selfan视图hosturlgetpdfrequest
2条回答

正如我在评论中所说,您正在对自己的网站进行外部调用,您应该调用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

使用连接的客户端的会话和简单的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。这避免了异步头痛。你知道吗

相关问题 更多 >