调用其他视图时的Django授权

时间:2016-07-14 22:21:13

标签: python django session url request

我有一个用于在制冷系统上制作表格的django系统。

我有一个名为System的模型。

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

  1. 系统的外键称为anlage
  2. 一个名为get_pdf_url的方法,它返回一个url到实例的pdf生成器
  3. 属性CLASSNAME
  4. 这是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的请求?

2 个答案:

答案 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。这可以避免异步头痛。