Flask中的Markdown语法高亮

1 投票
1 回答
2503 浏览
提问于 2025-04-18 11:12

我正在尝试用Python实现一个和Stack Overflow一样的文本区域,并且带有语法高亮功能。我已经做到了一些,但还没有成功。

app.py

from flask import Flask, render_template, request
import preview

app = Flask(__name__)

@app.route('/',methods=['GET','POST'])
def index():
    if request.method == 'POST':
        markdown_content = request.args.get['wdd-input']
        post_preview = preview.markdown(markdown_content['data'])
        return render_template('test.html', result=post_preview)
    if request.method == 'GET':
        return render_template('demo.html')

if __name__ == '__main__':
    app.run()

preview是一个可以进行语法高亮的功能,它是基于Pygments这个库的。

test.html

<!DOCTYPE html>

<html lang="en">
<head>
  <meta charset="utf-8">
  <title>PageDown Demo Page</title>

  <link rel="stylesheet" type="text/css" href="/static/css/bootstrap.min.css">
  <link rel="stylesheet" type="text/css" href="/static/css/highlighting.css">
  <link rel="stylesheet" type="text/css" href="/static/css/demo.css" />
  <script type="text/javascript" src="/static/js/jquery-1.9.1.min.js"></script>
  <script type="text/javascript" src="/static/js/bootstrap.min.js"></script>
  <script type="text/javascript" src="/static/js/hycus-textarea.js"></script>
  <script type="text/javascript" src="/static/js/Markdown.Editor.js"></script>
  <script type="text/javascript">
    (function (m) {
      m(document).ready(function () {
        m('textarea.wmd-input').TextAreaResizer();
      });
    })(jQuery);
  </script>
</head>

<body>
  <div class="container">
      <div id="pagedwon">
        <div id="tabnav">
          <ul class="nav nav-tabs" id="markdown_tab" style="padding: 0 10px; margin-bottom: 10px;">
            <li class="active"><a href="#edit" data-toggle="tab">Edit</a></li>
            <li><a href="#markdownpreview" data-toggle="tab">Preview</a></li>
          </ul>
        </div>

        <div class="tab-content">
          <div class="tab-pane active" id="edit">
            <div class="wmd-panel">
              <div id="wmd-button-bar"></div>
<textarea class="wmd-input" id="wmd-input" rows="10" name="text-input">
This is the *pagedown* editor.
------------------------------

**Note**: Just plain **Markdown**, except that the input is sanitized: **HTML** is not allowed.
</textarea>
            </div>
            <script type="text/javascript">
              (function () {
                  var pagedown_editor = new Markdown.Editor();
                  pagedown_editor.run();
              })();
            </script>

            <script type="text/javascript">
              (function (m) {
                m("#markdown_tab a").click(function () {
                  if (m(this).html() == "Preview"){
                    var markdown_content = m("#wmd-input").val();
                    if (!markdown_content) {
                      m("div#markdownpreview").html("Empty Markdown Content.");
                    } else {
                      content_to_preview = {
                        "data": markdown_content
                      }
                      m.post("/", content_to_preview)
                        .success( function(preview_content){
                          if (preview_content == 'None'){
                            m("div#markdownpreview").html("No content received.");
                          } else {
                            m("div#markdownpreview").html(preview_content);
                          }
                        })
                        .error( function () {
                          m("div#markdownpreview").html("Sorry, error occurred. Please retry.");
                        });
                    }
                  }
                });
              })(jQuery);
            </script>
          </div>

          <div class="tab-pane markdown-body" id="markdownpreview">
            Loding preview content ...
          </div>
        </div>
      </div>
  </div>
</body>
</html>

这是控制台的日志:

127.0.0.1 - - [26/Jun/2014 20:25:01] "POST / HTTP/1.1" 500 -

请问怎么才能让它正常工作呢?我对Flask还很陌生。

1 个回答

3
  • 首先,request.args 是用来获取查询字符串参数的,但你现在是通过 POST 发送数据。你应该使用request.form 来获取数据。
  • 其次,MultiDict.get 是一个函数,它不支持 __getitem__ 这个协议(这就是你出现500错误的原因)。
  • 第三,正如 @Doobeh 在评论中提到的,你是通过键 data 发送数据的,但你却试图通过键 "wdd-input" 来访问它,这样会导致 BadRequest 错误。
  • 最后,从request.form 中提取的值会是一个字符串(字符串不支持作为 __getitem__ 的值),而且你其实也不需要它,因为你已经有了整个字符串。

POST 部分的重写版本:

if request.method == 'POST':
    markdown_content = request.form.get('data', 'No content yet ...')
    post_preview = preview.markdown(markdown_content)
    return render_template('test.html', result=post_preview)

撰写回答