ফ্লাস্ক / জিনজা 2 ব্যবহার করে টেমপ্লেটে এইচটিএমএল পাস করা


163

আমি ফ্লাস্ক এবং এসকিউএএলএলচেমির জন্য একটি প্রশাসক তৈরি করছি এবং আমি আমার ভিউ ব্যবহার করে ভিন্ন ভিন্ন ইনপুটগুলির জন্য এইচটিএমএল পাস করতে চাই render_template। টেম্প্লেটিং ফ্রেমওয়ার্কটি এইচটিএমএল থেকে স্বয়ংক্রিয়ভাবে পালাতে পারে বলে মনে হয়, তাই সমস্ত <"'> এইচটিএমএল সত্তায় রূপান্তরিত হয় I এইচটিএমএলকে সঠিকভাবে রেন্ডার করে আমি কীভাবে এটি অক্ষম করব?

উত্তর:


344

আদর্শ উপায় হয়

{{ something|safe }}

সম্পূর্ণরূপে অটো পলায়ন বন্ধ করার চেয়ে।


2
হাই @ আর্মিন রোনাচার, আপনি কি আরও ব্যাখ্যা করে একটি উদাহরণ দেবেন? ধন্যবাদ।
সামথ

আমি বোঝাতে চাইছি, উদাহরণস্বরূপ, আমার কাছে একটি ফাইল রয়েছে userHome.htmlএবং আমি return render_template('userHome.html')এটি ব্যবহার করতে চাই তবে এটি সঠিকভাবে রেন্ডার করে না এবং সমস্তই আমার ক্রোম কনসোলের এইচটিএমএল সত্তায় ফিরে আসে ।
সামথ

ইন transট্যাগ এই হিসাবে ব্যবহার করতে হবে{% trans something=something|safe %}A {{something}} B{% endtrans %}
Kangur

1
এটি উল্লেখ করার মতো যে আপনি যখন এটি করেন তখন ক্রস-সাইট স্ক্রিপ্টিং দুর্বলতাগুলি এড়াতে আপনার সতর্ক হওয়া উচিত , কারণ আপনি এর বিরুদ্ধে টেম্প্লেটিং লাইব্রেরির অন্তর্নির্মিত সুরক্ষাগুলি অক্ষম করছেন।
হ্যারি কাটস

108

আপনি কোড থেকে এটিকে এইচটিএমএল নিরাপদ হিসাবে ঘোষণা করতে পারেন:

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

তারপরে সেই মানটি টেমপ্লেটগুলিতে পাস করুন এবং তাদের |safeএটির দরকার নেই।


4
মার্কআপ একটি জিনজা 2 ক্লাস, হ্যাঁ। এটি বহু অজগর লাইব্রেরি দ্বারা সমর্থিত একটি সাধারণ ইন্টারফেস প্রয়োগ করে (দুর্ভাগ্যক্রমে জ্যাঙ্গো নয়)। আপনি একই চিহ্নটি
আর্মিন রোনাচার


23

জিনজা ডক্স বিভাগ থেকে এইচটিএমএল এসকেপিং :

যখন স্বয়ংক্রিয়ভাবে পলায়ন সক্ষম হয় তখন স্পষ্টভাবে নিরাপদ হিসাবে চিহ্নিত মানগুলি বাদ দিয়ে সমস্ত কিছু ডিফল্টরূপে পালিয়ে যায়। সেগুলি অ্যাপ্লিকেশন দ্বারা বা টেমপ্লেটে | নিরাপদ ফিল্টার ব্যবহার করে চিহ্নিত করা যেতে পারে।

উদাহরণ:

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

5

আপনার যখন প্রচুর ভেরিয়েবল থাকে যাতে পালানোর দরকার হয় না, আপনি একটি autoescapeব্লক ব্যবহার করতে পারেন :

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

1

কিছু লোক অটোরস্কেপটি বন্ধ করে বলে মনে হচ্ছে যা স্ট্রিং ডিসপ্লেতে হস্তক্ষেপ করতে সুরক্ষা ঝুঁকি বহন করে ।

আপনি যদি কেবল কিছু লাইনব্রেকগুলি একটি স্ট্রিংয়ে sertোকাতে এবং লাইনব্রেকগুলি রূপান্তর করতে চান <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 ) }}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.