फ्लास्क / जिन्जा 2 का उपयोग करके टेम्पलेट को HTML पास करना


163

मैं फ्लास्क और SQLAlchemy के लिए एक व्यवस्थापक का निर्माण कर रहा हूं, और मैं अपने विचार का उपयोग करके विभिन्न इनपुट के लिए HTML पास करना चाहता हूं render_template। टेम्प्लेटिंग ढाँचा HTML को स्वचालित रूप से बचने लगता है, इसलिए सभी <"'> HTML संस्थाओं में परिवर्तित हो जाते हैं। मैं इसे कैसे अक्षम कर सकता हूं ताकि HTML सही तरीके से प्रस्तुत हो सके?

जवाबों:


344

आदर्श तरीका है

{{ something|safe }}

पूरी तरह से ऑटो से भागने से।


2
हाय @Armin Ronacher, क्या आप कृपया अधिक समझायेंगे और एक उदाहरण देंगे? धन्यवाद।
समोथ

मेरा मतलब है, उदाहरण के लिए, मेरे पास एक फाइल है जिसे कॉल किया गया है userHome.html, और मैं इसका उपयोग करना चाहूंगा return render_template('userHome.html'), लेकिन यह सही ढंग से प्रस्तुत नहीं करता है और मेरे क्रोम कंसोल में HTML एंटिटीज में बदल जाता है।
समोथ

में transटैग इस रूप में इस्तेमाल किया जा करने के लिए है{% trans something=something|safe %}A {{something}} B{% endtrans %}
Kangur

1
यह ध्यान देने योग्य है कि जब आप ऐसा करते हैं तो आपको क्रॉस-साइट स्क्रिप्टिंग कमजोरियों से बचने के लिए सावधान रहना चाहिए , क्योंकि आप इसके खिलाफ अस्थायी लायब्रेरी के अंतर्निहित सुरक्षा को अक्षम कर रहे हैं।
हैरी कट्स

108

आप इसे HTML को कोड से सुरक्षित भी घोषित कर सकते हैं:

from flask import Markup
value = Markup('<strong>The HTML String</strong>')

फिर उस मान को टेम्प्लेट में पास करें और वे उसके पास न हों |safe


4
मार्कअप एक जिन्जा 2 वर्ग है, हाँ। यह कई अजगर पुस्तकालयों (दुर्भाग्य से नहीं Django) द्वारा समर्थित एक सामान्य इंटरफ़ेस लागू करता है। आप मार्कअप सुरक्षित पैकेज का भी उपयोग कर सकते हैं जो समान ऑब्जेक्ट को लागू करता है: pypi.python.org/pypi/MarkupSafe
Armin Ronacher

यह jinja2 में मौजूद है
Giovanni G. PY

23

जीजा डॉक्स अनुभाग HTML से बचने से :

जब स्वचालित रूप से भागने को सक्षम किया जाता है, तो डिफ़ॉल्ट रूप से सुरक्षित रूप से चिह्नित मानों को छोड़कर सब कुछ डिफ़ॉल्ट रूप से बच जाता है। इन्हें या तो एप्लिकेशन द्वारा या टेम्पलेट में चिह्नित किया जा सकता है। सुरक्षित फ़िल्टर का उपयोग करके।

उदाहरण:

 <div class="info">
   {{data.email_content|safe}}
 </div>

5

जब आपके पास बहुत सारे चर होते हैं जिन्हें भागने की आवश्यकता नहीं होती है, तो आप एक autoescapeब्लॉक का उपयोग कर सकते हैं :

{% autoescape off %}
{{ something }}
{{ something_else }}
<b>{{ something_important }}</b>
{% endautoescape %}

1

कुछ लोग ऑटोस्कोप को बंद करने लगते हैं जो स्ट्रिंग डिस्प्ले में हेरफेर करने के लिए सुरक्षा जोखिम उठाते हैं।

यदि आप केवल कुछ लाइनब्रेक को एक स्ट्रिंग में सम्मिलित करना चाहते हैं और लाइनब्रेक को में बदलना <br />चाहते हैं, तो आप एक जिन्ना मैक्रो ले सकते हैं जैसे:

{% macro linebreaks_for_string( the_string ) -%}
{% if the_string %}
{% for line in the_string.split('\n') %}
<br />
{{ line }}
{% endfor %}
{% else %}
{{ the_string }}
{% endif %}
{%- endmacro %}

और अपने टेम्पलेट में बस इसके साथ कॉल करें

{{ linebreaks_for_string( my_string_in_a_variable ) }}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.