【问题标题】:"Not Found" Error when uploading photo to website and submitting on flask python将照片上传到网站并在烧瓶 python 上提交时出现“未找到”错误
【发布时间】:2019-11-22 16:33:18
【问题描述】:

我正在尝试创建允许用户输入照片并将该照片保存到文件夹“/home/HassanSherien/mysite/Shape_Image”的代码。我已按照以下链接中给出的步骤操作,但我不断收到一条错误消息,指出“未找到,在服务中找不到请求的 URL。如果您手动输入了 URL,请检查您的拼写并重试。”

Python:

 import os
 from flask import Flask, request, redirect, url_for
 from werkzeug.utils import secure_filename
UPLOAD_FOLDER = '/home/HassanSherien/mysite/Shape_Image'
ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'])

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER

def upload_file():
    if request.method == 'POST':
    if 'file' not in request.files:
        flash('No file part')
        return redirect(request.url)
    file = request.files['file']
    if file.filename == '':
        flash('No selected file')
        return redirect(request.url)
    if file and allowed_file(file.filename):
        filename = secure_filename(file.filename)
        file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))

HTML:

<form action="myform.cgi"> 
<input type="file" name="fileupload" value="fileupload" 
id="file`upload"> 
<label for="fileupload"> Select a file to upload</label>
 <br>
<input type="image" src="/wp-content/uploads/sendform.png" 
alt="Submit" width="100"> 
</form>

我也在线上报错 如果文件和allowed_file(file.filename): 上面写着“未定义的名称'allowed_file'”

Upload image in Flask

【问题讨论】:

  • 我建议先阅读一个基本的 Flask 教程来学习如何在尝试编写之前指定 URL。这将是一个好的开始:blog.pythonanywhere.com/169
  • 谢谢!另外,如果我在此之后确实有后续问题,我应该在这里发表评论还是应该创建一个新线程? @GilesThomas
  • 您的代码是否尝试在图像完全上传之前对其执行 GET 操作?您是否定义了 GET http 路由以在上传文件后获取文件?将文件放在服务器上是不够的 - 您的服务需要安全地为它们提供服务。另外,您能否说明您是否已调试代码以及​​您在服务器端验证了什么? IE。文件被保存了吗?或者该方法永远不会被调用? POST 是在上传之前还是之后给你一个 404 还是别的什么?您是否打开了 Web 控制台并检查正在发生的呼叫?感谢您提供更多信息添加
  • 没有照片上传正常,但这是我第二次点击提交时收到错误消息。该文件未保存为我设置为输入这些照片的文件夹为空。 Ido 打开了一个网络控制台,但我不确定如何检查正在发生的呼叫!我觉得我的问题是在我的 python 和我的 html 代码之间,没有迹象表明显示在我的 html 代码上的提交按钮是应该触发保存在我的 python 代码中的按钮,如果这有意义的话。 @TheJeff

标签: pythonanywhere


【解决方案1】:

您尚未为upload_file 函数分配路由。这应该在函数定义正上方的行中完成:

@app.route('/upload', methods=['POST'])
def upload_file():
    # rest of your code

您还需要使表单的操作与此 URL 相对应:

<form action="/upload" method='POST'>

在 Flask 模板中,您可以根据函数名称自动生成此 URL:

<form action="{{ url_for('upload_file') }}" method='POST'>

表单中的唯一输入字段应该是:

<input type="file" name="file" id="file_upload" /> 
<input type="submit />

请注意,我已设置 name="file",它与您的 Python 代码接受的内容相对应。请参阅this answer 我刚刚发布了为什么会这样。这方面的官方文档有点令人困惑,因为他们在多个地方重复使用“文件”一词,我认为这会让人们感到困惑,尤其是新手。


if file and allowed_file(file.filename): that say "undefined name 'allowed_file'" 的行上我也收到错误提示

听起来您还没有按照文档定义该函数:

def allowed_file(filename):
    return '.' in filename and \
           filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

根据评论编辑

现在我的网站将允许人们上传照片,它会自动提交(因为尽管没有提交按钮,但代码知道在上传内容后立即提交)

抱歉:您需要为提交按钮添加第二个输入标签:只需在表单末尾添加&lt;input type='submit' /&gt;

一旦用户选择了他们想要上传的文件,他们就会点击这个按钮,然后一个 POST 请求将连同数据一起发送到服务器。

到 url_for('upload_file'),在我的例子中是 '/home/HassanSherien/mysite/Shape_Image'。

当实际呈现表单时(在任何上传活动之前),表单的action 属性将是{{url_for('file_upload')}} 的返回值,这将是/upload(在@app.route 行中设置)。这使得表单提交到:http://example.com/upload。不要将其与在服务器端 UPLOAD_FOLDER 中输入的路径混淆。

在处理上传的代码中,以下行将指定为UPLOAD_FOLDER 的路径连接到filename 的值:

file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))

为了便于阅读,如下:

full_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
file.save(full_path)

第二行是调用file 对象的save 方法,提供完整路径作为参数。这实际上将文件保存到磁盘。

如果您发现这没有发生,请检查服务器控制台,因为您可能需要设置目录权限等。

这个函数还应该返回类似重定向到网站其他地方的东西。

【讨论】:

  • 非常感谢您花时间和我一起解决这个问题!我确实是一个新人,但我有学习的动力哈哈。虽然,我对一部分感到困惑。所以基本上现在我的网站将允许人们上传照片,它会自动提交(因为尽管没有提交按钮,代码知道在上传内容后立即提交)到 url_for('upload_file') 是'/home/HassanSherien /mysite/Shape_Image' 就我而言。那么,我不应该能够在我的文件夹 shape_image 中看到这些照片吗?我想现在的事件顺序让我感到困惑@v25
  • 谢谢!!现在我只收到错误消息“方法不允许:请求 URL 现在允许该方法。”我搜索到的意思是一切都处理得很好,但我没有你说的可能发生的前提。由于我在任何地方都通过 python 执行此操作,并且无法更改目录权限,因此我将尝试与他们联系,看看是否有任何方法可以绕过此问题。虽然,再次感谢您的所有帮助:D @v25
  • 您可能在您的@app.route drecorators 中忘记了method=['POST']
  • 我确保他们所有人都有,但同样的错误仍然存​​在!我在一个在线线程中看到,将我的@app.route 部分中的"/login/" 更改为"/" 应该可以解决我尝试过的问题,而不是出现405 错误,它只是刷新了我的应用程序的主页@v25跨度>
  • 小心您将methods=['POST'] 传递到哪条路线。如果必须在浏览器中点击该路由并使用表单呈现模板,您将得到“方法不允许”。如果所述路由仅处理上传,这很好。如果您在那里执行一些逻辑来接受上传或呈现表单,那么您可能想要methods=['POST','GET'] 如果您根本不指定methods,它默认为GET。如果它是只呈现表单的路由,这很好。如果你明白我的意思的话,你可以用一个路由来处理这两个,或者两个路由每个处理一个请求方法。
猜你喜欢
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-30
  • 2020-09-05
  • 2014-07-09
相关资源
最近更新 更多