python - flask+jinja2+sqlite3,如何保存markdown格式的文章
高洛峰
高洛峰 2017-04-17 17:38:35
0
2
693
  1. 背景:

    • 环境如题:win + python3 + flask + jinja。

    • 初学python,在做一个博客工具练习flask,sql目前只有入门知识。

    • 目标是想在发布文章的时候,支持markdown。

  2. 问题:标题/加粗等都没有问题,但是在插入图片/超链接的时候,拼接的sql语句会被文章(已经被转化为html)中的引号等符号破坏导致报错。

  3. 我做的尝试:

    • xxx.replace(""", "\"").replace("\\", "\"),实测并没有用。

    • 使用HTMLParser的时候,发现依赖的markupbase包没有(pip3 install 提示没找到,豆瓣源)。

  4. 想请教的是:

    • 是否需要把网页存到数据库中去?(或者只存markdown文本到数据库,展示的时候再渲染?)假如不应该,有什么好办法么?

    • 假如应该存数据库,有什么办法吧html代码转化成sql安全?比如还有需要替换的字符我没有注意到?或者有现成的库?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

répondre à tous(2)
阿神

Vous pouvez consulter mes réponses à des questions similaires sur la mise en œuvre de l'interface d'édition d'articles par Flask

FlaskIl existe déjà un plug-in pour le traitement des MD, Flask-Pagedown. Mais vous pouvez aussi simplement utiliser la bibliothèque mardown. Pour deux questions :

  1. Dois-je enregistrer la page Web dans la base de données ? (Ou simplement enregistrer le texte markdown dans la base de données, puis le restituer lors de l'affichage ?) Sinon, existe-t-il un bon moyen ?
    Dans le livre "Flask Web Development : Practical Web Application Development Based on Python" écrit par l'auteur Flask, le texte HTML et le texte markdown sont enregistrés dans la base de données. Le HTML est pris directement lors de la navigation, et le texte markdown est pris lorsque. édition, lors de l'enregistrement du démarque dans la base de données, analysez-le en HTML et enregistrez

  2. S'il doit être stocké dans la base de données, existe-t-il un moyen de convertir le code html en SQL en toute sécurité ? Par exemple, y a-t-il des caractères à remplacer que je n'ai pas remarqués ? Ou existe-t-il une bibliothèque prête à l'emploi ?
    Si vous utilisez la bibliothèque markdown, appelez directement :

html = markdown.markdown(md_text)

Si vous utilisez des plugins :

class Article(db.Model):
    ...
    @staticmethod
    def on_changed_body(target, value, oldvalue, initiator):
        # 需要转换的标签
        allowed_tags = [
            'a', 'abbr', 'acronym', 'b', 'blockquote', 'code',
            'em', 'i', 'li', 'ol', 'pre', 'strong', 'ul',
            'h1', 'h2', 'h3', 'p', 'img'
        ]
        # 需要提取的标签属性,否则会被忽略掉
        attrs = {
            '*': ['class'],
            'a': ['href', 'rel'],
            'img': ['src', 'alt']
        }
        target.content_html = bleach.linkify(
            bleach.clean(
                markdown(value, output_format='html'),
                tags=allowed_tags,
                attributes=attrs,
                strip=True
            )
        )
黄舟

Le texte Markdown est stocké dans la base de données et le serveur implémente un filtre dans jinja2 pour restituer le HTML et afficher le markdown. Le filtre que j'ai défini est le suivant :

from app import app
from flask import Markup
import markdown2

@app.template_filter('neomarkdown')
def neomarkdown(markdown_content):
    content=Markup(markdown2.markdown(markdown_content, extras=["tables"]))
    return content

Utilisation :

{{ html_content|neomarkdown }}
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal