2015-05-25 8 views
5

मुझे डीजेंगो आराम ढांचे का उपयोग करके एपीआई कॉल प्राप्त करने के जवाब में पीडीएफ फ़ाइल और कुछ अन्य पैरामीटर भेजने की आवश्यकता है।प्रतिक्रिया में फ़ाइल भेजने के लिए मैं django आराम ढांचे का उपयोग कैसे करूं?

मैं यह कैसे कर सकता हूं? मैंने this की कोशिश की लेकिन यह <django.http.HttpResponse object at 0x7f7d32ffafd0> is not JSON serializable त्रुटि देता है।

@detail_route(methods=['get']) 
def fetch_report(self, request, *args, **kwargs): 
    short_report = open("somePdfFile", 'rb') 
    response = HttpResponse(FileWrapper(short_report), content_type='application/pdf') 
    return Response({'detail': 'this works', 
     'report': response}) 
+0

आप इसे एक ही चरण में नहीं कर सकते हैं। या तो जवाब पीडीएफ है, या जवाब JSON है। आप पीडीएफ की सामग्री को JSON स्ट्रिंग में एन्कोड कर सकते हैं, लेकिन यह क्लाइंट पर सहेजने के लिए कठिन (करने योग्य लेकिन) होगा। आम तौर पर इस तरह की चीजें 2-चरणीय प्रक्रिया में की जाती हैं: पहले JSON उत्तर प्राप्त करें, फिर, यदि यह सफल हुआ, तो वास्तविक फ़ाइल का अनुरोध करें। – spectras

उत्तर

2

आप PDFFileResponse साथ DRF-PDF परियोजना का उपयोग कर सकते हैं:

from rest_framework import status 
from rest_framework.views import APIView 
from drf_pdf.response import PDFFileResponse 
from drf_pdf.renderer import PDFRenderer 


class PDFHandler(APIView): 

    renderer_classes = (PDFRenderer,) 

    def get(self, request): 
     return PDFFileResponse(
      file_path='/path/to/file.pdf', 
      status=status.HTTP_200_OK 
     ) 

लेकिन, हो सकता है आप दोनों प्रारूपों (json और स्ट्रीम) में प्रतिक्रिया नहीं दे सकता।

7

समस्या यह है कि आप जेएसओएन और पीडीएफ का मिश्रण वापस करने की कोशिश कर रहे हैं, जो कि आप जो खोज रहे हैं वह नहीं है या विशाल बेस 64-एन्कोडेड प्रतिक्रिया वापस करने जा रहा है। पीडीएफ एक बाइनरी प्रारूप है और जेएसओएन एक टेक्स्ट प्रारूप है, और आप वास्तव में उन्हें अच्छी तरह से मिश्रण नहीं कर सकते हैं।

एक डीआरएफ व्यू के भीतर आप सीधे एक Django प्रतिक्रिया वापस कर सकते हैं, जिसे आप पहले ही उत्पन्न कर रहे हैं (HttpResponse), और डीआरएफ इसे प्रस्तुत करेगा और प्रस्तुतकर्ताओं को छोड़ देगा। यह इस तरह के मामलों में उपयोगी है, क्योंकि यह आपको डीआरएफ की प्रतिपादन परत के बारे में चिंता किए बिना किसी छवि या पीडीएफ जैसी बाइनरी प्रतिक्रिया वापस करने की अनुमति देता है।

@detail_route(methods=['get']) 
def fetch_report(self, request, *args, **kwargs): 
    short_report = open("somePdfFile", 'rb') 
    response = HttpResponse(FileWrapper(short_report), content_type='application/pdf') 
    return response 

वैकल्पिक पाठ के रूप में पीडीएफ एन्कोड करने के लिए, base64 encoding की तरह कुछ का उपयोग कर रहा है। यह नाटकीय रूप से आपके प्रतिक्रिया आकार में वृद्धि करेगा, लेकिन यह आपको समस्याओं के बिना डीआरएफ की प्रतिपादन परत का उपयोग करने की अनुमति देगा।

@detail_route(methods=['get']) 
def fetch_report(self, request, *args, **kwargs): 
    import base64 
    short_report = open("somePdfFile", 'rb') 
    report_encoded = base64.b64encode(short_report.read()) 
    return Response({'detail': 'this works', 
     'report': report_encoded}) 

लेकिन मार्ग मैं यहाँ की सिफारिश करेंगे पीडीएफ पैदा करते हैं और या तो अपने मीडिया भंडारण, या एक विकल्प के निजी स्थान में संग्रहीत है, और अपने जवाब में यह करने के लिए एक सीधा लिंक प्रदान करना है। इस तरह आपको एन्कोडिंग समस्याओं के बारे में चिंता करने की आवश्यकता नहीं है, सीधे पीडीएफ वापस करने की आवश्यकता नहीं है, और सीधे पीडीएफ की सेवा करने की चिंता करने की आवश्यकता नहीं है।

संबंधित मुद्दे