2012-08-13 14 views
5

पृष्ठभूमि:मैं Django के साथ शुरू कर रहा हूं, और पाइथन के साथ सीमित अनुभव है, इसलिए कृपया मेरे साथ सहन करें। मैंने एक पायथन स्क्रिप्ट लिखी है जो SQLite3 डेटाबेस में डेटा संग्रहीत करने के लिए समय-समय पर (क्रॉन जॉब में) चलाती है, जिसमें से मैं मैटलप्लॉब (अधिक विशेष रूप से, बेसमैप के साथ) से छवियों को पढ़ना और उत्पन्न करना चाहता हूं। यह पायथन सीखने और एक "दिलचस्प" पर्याप्त परियोजना बनाने में रुचि के रूप में शुरू हुआ। मैं Django ढांचे को चुन रहा हूं क्योंकि यह उचित रूप से अच्छी तरह से प्रलेखित प्रतीत होता है, हालांकि मैं इसकी आवश्यकताओं में "हल्केपन" की वजह से web.py द्वारा सुखद आश्चर्यचकित था (लेकिन web.py के स्पैस दस्तावेज़ से इसे शुरू करना थोड़ा मुश्किल हो जाता है) ; लेकिन फिलहाल, मैं एक ढांचे पर पूरी तरह से मृत सेट नहीं हूँ।Django टेम्पलेट्स में Matplotlib छवियों का उपयोग कैसे करें?

question 1874642 में उदाहरण लगभग जो कुछ मैं ढूंढ रहा हूं, डिस्क पर इसे लिखने की आवश्यकता के बिना ऑन-द-फ्लाई उत्पन्न किया जा रहा है (और इस प्रकार जेनरेट की गई फ़ाइलों को समय-समय पर सफाई करने के साथ निपटने के लिए) ।

हालांकि, मुझे यह स्पष्ट नहीं है कि ब्राउज़र को छवि को दिखाने के बजाए जेनरेट की गई छवि को टेम्पलेट में कैसे शामिल किया जा सकता है। ट्यूटोरियल सामग्री से, मैं अनुमान लगा रहा हूं कि django.template.Context में django.http.HttpResponse में शामिल चर के प्रतिनिधित्व करना संभव होना चाहिए, लेकिन संदर्भित उदाहरण इसे संदर्भ के साथ बनाने के बजाय सीधे माइम ऑब्जेक्ट के साथ प्रतिक्रिया देकर शॉर्टकट करता है।

तो क्या मैं पूछ रहा हूँ है:

  1. यह उत्पन्न matplotlib FigureCanvas वस्तु पर एक print_png आह्वान करने के लिए आवश्यक है? या FigureCanvas संदर्भ में "अप्रतिबंधित" की प्रतिलिपि बनाई गई है, ताकि Django टेम्पलेट में मैं स्पष्टता HTML img टैग लिखूं और टैग के गुणों को हाथ से रखूं?

  2. मैं धारणा है कि मैं है डिस्क के लिए कैनवास लिखने के तहत हूं (अर्थात एक canvas.print_figure("image.png") करते हैं), तो यह है कि एचटीएमएल img टैग Django टेम्पलेट में देखता है। लेकिन मैं यह सुनिश्चित करना चाहता हूं कि "अधिक प्रबंधनीय तरीका" नहीं है - यानी Context में छवि को पास करना और टेम्पलेट को "जादुई रूप से" उत्पन्न करना। यदि डिस्क पर लिखना वास्तव में जरूरी है, तो मुझे लगता है कि मैं जेनगो की फाइल सिस्टम कैशिंग सुविधा का उपयोग किसी भी तरह से जेनरेट की गई छवियों को लिखने के लिए कर सकता हूं (जांच कर रहा हूं कि एक छवि पहले से दिए गए इनपुट पैरामीटर सेट के लिए पहले से लिखी गई थी)। मैं इस संबंध में आपके सुझावों का स्वागत करता हूं, क्योंकि इस समय यह स्पष्ट नहीं हुआ है कि छवियों का आकार और संख्या जेनरेट की जाएगी, और इस प्रकार मैं डिस्क स्पेस खर्च करने से बचने के लिए देख रहा हूं और इसके बजाय किसी छवि को उत्पन्न करने की प्रतीक्षा करना पसंद करता हूं (भले ही इसमें कुछ सेकंड लगते हैं)।

अग्रिम धन्यवाद।

+0

डिस्क पर फ़ाइलों को लिखने से बचने का एक तरीका है डेटा यूआरआई योजना का उपयोग करना, जैसा कि http://en.wikipedia.org/wiki/Data_URI_scheme पर वर्णित है। छवि को बाइट सरणी के रूप में निर्यात करना आवश्यक है, इसे बेस 64 में एन्कोड करें जिससे छवि यूआरआई तैयार की जाती है। लिंक में कुछ डाउनसाइड्स भी नोट करते हैं। – jbatista

+1

इसका समाधान यहां दिखाया गया है: http://stackoverflow.com/questions/16819805/creating-html-wrapper-in-django-for-matplotlib-images –

उत्तर

2

आप StringIO ऑब्जेक्ट pyplot.savefig() पर ऑब्जेक्ट पास कर सकते हैं, और StringIO.getvalue() द्वारा पीएनजी फ़ाइल सामग्री प्राप्त कर सकते हैं।

1

यह दृश्य एक पीएनजी छवि प्रदान करेगा। बस इसे "img.png" जैसे कुछ यूआरएल से बांधें और img टैग में इसका इस्तेमाल करें।

def create_fig(request): 
    # MPL stuff 
    response = HttpResponse(content_type='image/png') 
    fig.savefig(response) 
    return response 

बेशक, यह मानता है कि आप मुख्य दृश्य से स्वतंत्र छवि उत्पन्न कर सकते हैं।create_fig को

url(r'^img(?P<nr>\d+).png$', create_fig), 

जो एक से गुजरता एक नंबर nr: आप छवि के लिए तर्क पारित कर सकते हैं (urls.py में) की तरह (स्ट्रिंग रेपर की।)।

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