لغة الترميز خفيفة الوزن لبيثون
سؤال
وبرمجة تطبيق بيثون على شبكة الإنترنت، وأريد أن إنشاء منطقة النص حيث يمكن للمستخدمين إدخال نص في لغة الترميز خفيفة الوزن. سيتم استيراد النص إلى قالب HTML وعرضها على الصفحة. اليوم وأنا استخدم هذا الأمر لإنشاء جزء النص، والذي يسمح للمستخدمين بإدخال أي (HTML) النص:
my_text = cgidata.getvalue('my_text', 'default_text')
ftable.AddRow([Label(_('Enter your text')),
TextArea('my_text', my_text, rows=8, cols=60).Format()])
وكيف يمكنني تغيير هذا بحيث يتم السماح فقط بعض (آمنة، وخفيفة الوزن في نهاية المطاف) العلامات؟ جميع الاقتراحات بما في ذلك مطهرات هي موضع ترحيب، طالما أنه يدمج بسهولة مع بيثون.
المحلول
استخدم الثعبان تخفيض السعر تنفيذ
import markdown
mode = "remove" # or "replace" or "escape"
md = markdown.Markdown(safe_mode=mode)
html = md.convert(text)
وأنها مرنة جدا، يمكنك استخدام الإضافات المختلفة، وخلق الخاصة بك وغيرها.
نصائح أخرى
هل يمكن استخدام إعادة هيكلة النص . لست متأكدا إذا كان لديه خيار التعقيم، لكنها مدعومة جيدا بيثون، وأنه يولد جميع أنواع الأشكال.
وهذه وظيفة التعقيم بسيطة يستخدم القائمة البيضاء وهي تقريبا نفس حل بيثون أتش تي أم أل -sanitizer-الغسيل تصفية ، ولكنه يسمح أيضا للحد من استخدام السمات (منذ ربما كنت لا تريد شخص ما للاستخدام، من بين أمور أخرى، السمة style
):
from BeautifulSoup import BeautifulSoup
def sanitize_html(value):
valid_tags = 'p i b strong a pre br'.split()
valid_attrs = 'href src'.split()
soup = BeautifulSoup(value)
for tag in soup.findAll(True):
if tag.name not in valid_tags:
tag.hidden = True
tag.attrs = [(attr, val) for attr, val in tag.attrs if attr in valid_attrs]
return soup.renderContents().decode('utf8').replace('javascript:', '')