समस्या यह है कि आप जेएसओएन और पीडीएफ का मिश्रण वापस करने की कोशिश कर रहे हैं, जो कि आप जो खोज रहे हैं वह नहीं है या विशाल बेस 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})
लेकिन मार्ग मैं यहाँ की सिफारिश करेंगे पीडीएफ पैदा करते हैं और या तो अपने मीडिया भंडारण, या एक विकल्प के निजी स्थान में संग्रहीत है, और अपने जवाब में यह करने के लिए एक सीधा लिंक प्रदान करना है। इस तरह आपको एन्कोडिंग समस्याओं के बारे में चिंता करने की आवश्यकता नहीं है, सीधे पीडीएफ वापस करने की आवश्यकता नहीं है, और सीधे पीडीएफ की सेवा करने की चिंता करने की आवश्यकता नहीं है।
स्रोत
2015-05-27 01:47:42
आप इसे एक ही चरण में नहीं कर सकते हैं। या तो जवाब पीडीएफ है, या जवाब JSON है। आप पीडीएफ की सामग्री को JSON स्ट्रिंग में एन्कोड कर सकते हैं, लेकिन यह क्लाइंट पर सहेजने के लिए कठिन (करने योग्य लेकिन) होगा। आम तौर पर इस तरह की चीजें 2-चरणीय प्रक्रिया में की जाती हैं: पहले JSON उत्तर प्राप्त करें, फिर, यदि यह सफल हुआ, तो वास्तविक फ़ाइल का अनुरोध करें। – spectras