recherche

Maison  >  Questions et réponses  >  le corps du texte

python - flask+jinja2+sqlite3,如何保存markdown格式的文章

  1. 背景:

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

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

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

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

  3. 我做的尝试:

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

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

  4. 想请教的是:

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

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

高洛峰高洛峰2887 Il y a quelques jours699

répondre à tous(2)je répondrai

  • 阿神

    阿神2017-04-17 17:40:35

    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
                )
            )
    

    répondre
    0
  • 黄舟

    黄舟2017-04-17 17:40:35

    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 }}

    répondre
    0
  • Annulerrépondre