【问题标题】:After flask redirect i have invalid data烧瓶重定向后,我的数据无效
【发布时间】:2019-09-12 19:00:34
【问题描述】:

我想将 Dropzone.js 与 Flask 一起使用。上传文件后,我想保存文件并在另一个页面中显示上传的文件名(重定向后)。但在浏览器中,我收到的文件名等于“sample_value”。如何解决这个问题?

Python

import os
from flask import Flask, render_template, request,redirect, url_for

app = Flask(__name__)
app.config['UPLOADED_PATH'] = os.getcwd() + '/upload'

@app.route('/')
def index():
    # render upload page
    return render_template('index.html')


@app.route('/upload', methods=['GET', 'POST'])
def upload():
    n='sample_value'
    if request.method == 'POST':
        for f in request.files.getlist('file'):
            n=f.filename
            f.save(os.path.join(app.config['UPLOADED_PATH'], f.filename))
            print(f.filename)
            # There i get real file name
            n=f.filename
    return redirect(url_for('found', file_name=n), code=307)

@app.route('/found',methods=['GET', 'POST'])
def found():
        #There my file name is "sample_value"
    print('File name after redirect ', request.args.get('file_name'))
    return request.args.get('file_name')

if __name__ == '__main__':
    app.run(host='0.0.0.0', port =5000, debug=True, threaded=True)

模板

<html>
<body>
<script src="{{ url_for('static', filename='js/dropzone.js') }}"></script>
<script src="{{ url_for('static', filename='js/jquery.js') }}"></script>
<form action="{{ url_for('upload') }}" class="dropzone" id="my-dropzone" method="POST" enctype="multipart/form-data">
</form>
<script>
Dropzone.autoDiscover = false;

$(function() {
  var myDropzone = new Dropzone("#my-dropzone");
  myDropzone.on("queuecomplete", function(file) {
    // Called when all files in the queue finish uploading.
  window.location = "{{ url_for('upload') }}";
  });
})
</script>
</body>
</html>

我如何理解重定向在处理请求之前执行?

【问题讨论】:

    标签: python jquery flask dropzone.js


    【解决方案1】:

    我假设你没有在你的 Dropzone 中指定方法,那么它默认使用 GET 方法。检查Dropzone documentation并将方法指定为POST

    n="sample_value"
    if request.method == 'POST': # This is always false.
        ...
    
    >>> print(n) # n has never been replaced
    sample_value
    

    【讨论】:

    • 如果 request.method == 'POST': 为真并且当我打印(f.filename)时我收到真实的文件名。但是当我重定向时(url_for('found', file_name=n), code=307) - 文件名是sample_value
    • 网页浏览器解析重定向的HTTP代码302的问题。许多网络浏览器只是使用 GET 方法进行重定向。一个解决方案可能是指定请求的代码:flask.redirect(flask.url_for('operation'), code=307) See explications and solutions here
    • 我在前面的示例中指出了这一点。返回重定向(url_for('found', file_name=n), code=307)
    • 我已经测试了你的代码,127.0.0.1 - POST /upload HTTP/1.1 307 - 重定向后的文件名 test.py 127.0.0.1 - POST /found?file_name=test.py HTTP/1.1 200 - 重定向后我收到了正确的文件名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 2023-03-21
    • 2013-10-08
    相关资源
    最近更新 更多