Flask - Errno 13的许可被拒绝

时间:2014-05-16 20:19:04

标签: python flask

我正在写一个小网页,其任务是让用户上传他的输入文件并上传我想在python中执行我的计算程序,这将为我提供输出。

我的代码如下所示:

import os
import os.path
import datetime
import subprocess
from flask import Flask, render_template, request, redirect, url_for
from werkzeug import secure_filename

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = 'uploads'
app.config['ALLOWED_EXTENSIONS'] = set(['txt', 'gro', 'doc', 'docx'])

current_time = datetime.datetime.now()
file_time = current_time.isoformat()
proper_filename = file_time

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

def run_script():
    subprocess.call(['/home/martyna/Dropbox/programowanie/project_firefox/topologia.py', '/uploads/proper_filename'])

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

@app.route('/upload', methods = ['POST'])
def upload():
    file = request.files['file']
    if file and allowed_file(file.filename):
        file.save(os.path.join(app.config['UPLOAD_FOLDER'], proper_filename))
        run_script().start()
        return "Thank you for uploading"


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

上传顺利,但问题是,当我点击上传时,我收到消息OSError: [Errno 13] Permission denied,导致问题的行是:

subprocess.call(['/home/martyna/Dropbox/programowanie/project_firefox/topologia.py', '/uploads/2014-05-16T22:08:19.522441'])

程序topologia.py从命令python topologia.py input_file

运行

我不知道如何解决这个问题。

2 个答案:

答案 0 :(得分:1)

你有两个问题:

  • 您的脚本可能未标记为可执行文件。您可以使用当前的Python可执行路径来解决这个问题;使用sys.executable获取该路径。

  • 您告诉脚本要处理/uploads/proper_filename,但您实际上传文件的文件名根本不相同;您应该使用proper_filename引用的字符串的内容

将这两者放在一起:

import sys
from flask import current_app

def run_script():
    filename = os.path.join(current_app.config['UPLOAD_FOLDER'], proper_filename)
    subprocess.call([
        sys.executable, 
        '/home/martyna/Dropbox/programowanie/project_firefox/topologia.py', 
        filename])

需要就.start()的结果致电run_script();您将在NoneType上收到属性错误。只需致电run_script()并完成它:

run_script()

答案 1 :(得分:0)

使用相同的权限不能从命令行和服务器执行脚本。

user@mycomputer:~$ ./script

在此示例中,./scriptuser启动。因此,如果它执行某些输入/输出,则访问权限将取决于user权限。

当它是运行脚本的服务器时,在您的情况下 Flask ,可能www-data启动脚本。因此访问权限不一样。

因此,要在文件夹中创建文件,执行该脚本的用户应具有该文件夹的权限。