代码之家  ›  专栏  ›  技术社区  ›  claudiadast

重定向到同一页面后,Flask Flash消息不显示

  •  -1
  • claudiadast  · 技术社区  · 8 年前

    我有一个简单的网页,用户从他们的计算机中选择一个文件,然后按下“上传”按钮,然后启动一个python脚本,将该文件作为输入。

    然而,我正在尝试获取它,这样,如果用户正在上传一个会抛出错误的文件,则会在同一页面上显示一条Flash消息(没有任何重定向)。在我目前的尝试中,当我选择上传一个故意错误的文件时,flash消息没有显示出来。

    另外,作为另一个问题,是否可以(在app.py中)检查某些后端 python 启动脚本后将出现的错误消息(将在终端中显示的错误消息)?

    无论如何,以下是相关代码:

    应用程序。py:

    @app.route("/", methods=['GET', 'POST'])
    def upload():
        if request.method == 'POST':
            if 'file' not in request.files:
                flash("No file chosen", 'danger')
                return redirect(request.url)
            file = request.files['file']
            if file.filename == '':
                flash('No selected file', 'danger')
                return redirect(request.url)
            elif not allowed_file(file.filename):
                flash('Incorrect file extenstion. Must be .TXT!', 'danger')
                return redirect(request.url)
            elif file:
                filename = secure_filename(file.filename)
                file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
                #
                # Process the file (omitted here)
                #
    
                proc = subprocess.Popen('python author_script.py {} -p {} -s {} -m {}'.format(file.filename, period, space, affiliation), shell=True, stdout=subprocess.PIPE)
                time.sleep(0.5)
                return redirect(url_for('results'))
            else:
                # THIS PART IS NOT WORKING!
                return redirect(request.path)
                flash('There is an affiliation missing from your Place list.', 'danger')
        return render_template('index.html', template_file=app.config['TEMPLATE_FILE'])
    

    html模板(layout.html):

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title>Author Script</title>
            <link rel="stylesheet" type="text/css" href="static/main.css" />
        </head>
        <body>
            {% include 'includes/_navbar.html' %}
            {% block body %}{% endblock %}
            {% with messages = get_flashed_messages(with_categories=true) %}
                {% if messages %}
                    {% for category, message in messages %}
                        <div class="alert alert-{{ category }}">
                            {{ message }}
                        </div> 
                    {% endfor %}
                {% endif %}
            {% endwith %}
            </div>
    
            <!-- Scripts -->
                <script src="js/jquery.min.js"></script>
                <script src="js/skel.min.js"></script>
                <script src="js/util.js"></script>
                <script src="js/main.js"></script>
        </body>
    </html>
    
    2 回复  |  直到 8 年前
        1
  •  3
  •   gittert    8 年前

    如果你先发快闪信息,然后再重定向,会有帮助吗?这样地:

            flash('There is an affiliation missing from your Place list.', 'danger')
            return redirect(request.path)
    

    编辑:

    @app.route("/", methods=['GET', 'POST'])
    def upload():
    if request.method == 'POST':
        if 'file' not in request.files:
            flash("No file chosen", 'danger')
            return redirect(request.url)
        file = request.files['file']
        if file.filename == '':
            flash('No selected file', 'danger')
            return redirect(request.url)
        elif not allowed_file(file.filename):
            flash('Incorrect file extenstion. Must be .TXT!', 'danger')
            return redirect(request.url)
        elif file:
            filename = secure_filename(file.filename)
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            try:
                #
                # Process the file (omitted here)
                #
    
                proc = subprocess.Popen('python author_script.py {} -p {} -s {} -m {}'.format(file.filename, period, space, affiliation), shell=True, stdout=subprocess.PIPE)
                time.sleep(0.5)
                return redirect(url_for('results'))
    
            except Exception as e:
                print("type error: " + str(e)) # --> to answer your question on showing errors in console
                flash('There is an affiliation missing from your Place list.', 'danger')
                return redirect (request.path)
        return render_template('index.html', template_file=app.config['TEMPLATE_FILE'])
    
        2
  •  2
  •   murat yalçın    8 年前

    要显示flash消息,需要为其指定一个空间。可能你忘了给flash消息添加空间。我鼓励你退房 docs .

    你可以通过创建

    messages.html

    将下面的代码粘贴到其中

    {% with messages = get_flashed_messages(with_categories=true) %}
      {% if messages %}
        {% for category, message in messages %}
          <div class="alert alert-{{ category }}">{{ message }}</div>
        {% endfor %}
      {% endif %}
    {% endwith %}
    
    {% if error %}
      <div class="alert alert-danger">{{error}}</div>
    {% endif %}
    
    {% if msg %}
      <div class="alert alert-success">{{msg}}</div>
    {% endif %}
    

    你一定要打电话给我。布局中的html。html。这样地

    {% include 'includes/_messages.html' %}
    

    为了让它看起来更美,你可以把它放在这样一个盒子里

    <div class='container'>
                {% include 'includes/_messages.html' %}
                {% block body %}{% endblock %}
            </div>
    

    希望这能解决你的问题。

    最好的

        3
  •  1
  •   cranberrysauce    6 年前

    https://github.com/pallets/flask/issues/1168

    此链接建议配置application_ROOT或缓存可以解决/修复该问题。先试试这些。

    但真正为我做的是在方法中添加get_Flash_消息。

    from flask import get_flashed_messages
    
    
    @app.route('/')
    def upload():
        get_flashed_messages()
        ....
    
    推荐文章