繁体   English   中英

Python Flask:在投入生产时获取 URL

[英]Python Flask: getting URL when moving to production

我使用 Python 已经有一段时间了,但我是 Flask 的新手。 你能帮我解决我这两天纠结的两个简单问题吗?

我有一个简单的 Flask 应用程序,它应该导入 XLSX 或 CSV,解析它并创建一个 zip 文件以供下载。 当我开始解析部分的工作时,上传文件时出现错误,我发现应用程序没有保存文件,尽管它在本地运行 flask 时工作 这是代码:

测试2.py

``` from flask import Flask, render_template, request
from werkzeug.utils import secure_filename
import pandas as pd

app = Flask(__name__)

def work(arquivo):
    df = pd.read_excel(arquivo)
    return(str(df.shape))

@app.route('/')
def start():
   return "acesse /upload"


@app.route('/upload')
def upload_file():
   return render_template('upload.html')

@app.route('/uploader', methods = ['GET', 'POST'])
def upload_file():
   if request.method == 'POST':
       f = request.files['file']
       f.save('./inbox/'+secure_filename(f.filename))
       a = work('./inbox/'+secure_filename(f.filename))
       return 'file uploaded successfully '+a

if __name__ == '__main__':
   app.run(debug = True)
```

这是我在生产中放在模板文件夹中的upload.html文件(应用程序在http上运行://www.fabianocastello.com.br/test2/

    <html>
       <body>
          <form action = "http://www.fabianocastello.com.br/test2/uploaded" method = "POST" 
             enctype = "multipart/form-data">
             <p>Arquivo</p>
             <input type = "file" name = "file" accept=".csv, .xlsx" </input>
             <input type = "submit" value="Enviar arquivo"/>
          </form>   
       </body>
    </html>

在本地时,有效的 upload.html 文件是这样的:

    <html>
       <body>
          <form action = "http://localhost:5000/uploader" method = "POST" 
             enctype = "multipart/form-data">
             <p>Arquivo</p>
             <input type = "file" name = "file" accept=".csv, .xlsx" </input>
             <input type = "submit" value="Enviar arquivo"/>
          </form>   
       </body>
    </html>

上传文件后我得到的错误是: Not Found The requested URL was not found on the server. 如果您手动输入了 URL,请检查您的拼写并重试。

我的问题是: 1. 为什么生产应用程序没有将上传的文件保存在“收件箱”文件夹中? 2. 有没有一种方法可以将upload.html 文件中的URL 替换为变量,这样我就不必在上传前手动更改文件?

谢谢大家。

这就是url_for方法的用途。 这将自动为您修复"http://localhost:5000/uploader"

但是, <form action = "http://www.fabianocastello.com.br/test2/uploaded"...>指出了更大的误解。 如果您必须更改模板中从开发到生产的每条路线,那将是可怕的。 您的 Flask 路由不必指向您正在运行应用程序的特定域; 它们只需要指向运行您的应用程序的服务器的端点(例如可能是gunicorn )。 Mega Tuorial在这里可能有助于部署。 部署文档中还有更多信息。

有了这些,还有其他问题需要处理:

  1. 您有两个同名的路由函数 - upload_file 为什么? 用不同的 URL 修饰它们并不重要,在同一个命名空间中不能有两个同名的函数。
  2. 第二个upload_file设置为接受GETPOST请求,但您只处理POST情况。 向该路由发送GET请求会出错。

这修复了表单:

<html>
   <body>
      <form action = "{{ url_for('upload_file') }}" method = "POST" 
         enctype = "multipart/form-data">
         <p>Arquivo</p>
         <input type = "file" name = "file" accept=".csv, .xlsx" </input>
         <input type = "submit" value="Enviar arquivo"/>
      </form>
   </body>
</html>

这将两个路由功能合并为一个:

@app.route('/uploader', methods = ['GET', 'POST'])
def upload_file():
   if request.method == 'POST':
       f = request.files['file']
       f.save('./inbox/'+secure_filename(f.filename))
       a = work('./inbox/'+secure_filename(f.filename))
       return 'file uploaded successfully '+a
   else:
       return render_template('upload.html')

return 'file uploaded successfully '+a会给出一个垃圾结果,如果有的话。 它不会用消息呈现模板,它只是无样式的文本。 看起来你想要 AJAX,它看起来像这样:

<html>
   <body>
      <form action = "{{ url_for('upload_file') }}" method = "POST" 
         enctype = "multipart/form-data" id="upload_file_form">
         <p>Arquivo</p>
         <input type = "file" name = "file" accept=".csv, .xlsx" </input>
         <input type = "submit" value="Enviar arquivo"/>
      </form>
      <div id="response_div"></div>
   </body>
   <script>
   $("#upload_file_form").submit(function(e) {
       e.preventDefault();
       var form = $(this);
       var url = form.attr('action');

       $.ajax({
           type: "POST",
           url: url,
           data: form.serialize(),
           context: form,
           success: function(resp) {
               $("#response_div").html(resp);   
           }
       });
   });
</script>
</html>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM