質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

1回答

5142閲覧

flaskでpost fileをしようとするとinternal server errorが発生してしまう

dampo_t

総合スコア25

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2016/10/17 14:45

aws ec2 ubuntuにて、flaskでアプリケーションを構築しているのですが、ファイルアップロードをうまく行うことができません。

  • ローカル(Mac OS)で実行すると期待通りの動作をしますので、apache2の設定に問題があるのではないかと思っています。

  • 現在の状態としては最初のページは表示される(Upload new Fileのページ)のですが、ファイルアップロードをしようとすると、Internal Server Errorとなってしまい、SAVEDが帰ってきません。

python

1import os 2from flask import Flask, request, redirect, url_for 3from werkzeug.utils import secure_filename 4 5UPLOAD_FOLDER = './upload_pdf' 6ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif']) 7 8app = Flask(__name__) 9app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER 10 11def allowed_file(filename): 12 return '.' in filename and \ 13 filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS 14 15@app.route('/', methods=['GET', 'POST']) 16def upload_file(): 17 if request.method == 'POST': 18 # check if the post request has the file part 19 if 'file' not in request.files: 20 flash('No file part') 21 return redirect(request.url) 22 file = request.files['file'] 23 # if user does not select file, browser also 24 # submit a empty part without filename 25 if file.filename == '': 26 flash('No selected file') 27 return redirect(request.url) 28 29 if file and allowed_file(file.filename): 30 filename = secure_filename(file.filename) 31 print os.path.join(app.config['UPLOAD_FOLDER'], filename) 32 file.save(os.path.join(app.config['UPLOAD_FOLDER'], "upload.pdf")) 33 return "SAVED" 34 35 return ''' 36 <!doctype html> 37 <title>Upload new File</title> 38 <h1>Upload new File</h1> 39 <form action="" method=post enctype=multipart/form-data> 40 <p><input type=file name=file> 41 <input type=submit value=Upload> 42 </form> 43 ''' 44 45if __name__ == '__main__': 46 app.debug = True 47 app.run(host='0.0.0.0')

apache2 設定ファイル

<VirtualHost *:80> # The ServerName directive sets the request scheme, hostname and port that # the server uses to identify itself. This is used when creating # redirection URLs. In the context of virtual hosts, the ServerName # specifies what hostname must appear in the request's Host: header to # match this virtual host. For the default virtual host (this file) this # value is not decisive as it is used as a last resort host regardless. # However, you must set it for any further virtual host explicitly. #ServerName www.example.com ServerAdmin webmaster@localhost DocumentRoot /var/www/html WSGIDaemonProcess flaskapp threads=5 WSGIScriptAlias / /var/www/html/flaskapp/flaskapp.wsgi WSGIPassAuthorization on <Directory flaskapp> WSGIProcessGroup flaskapp WSGIApplicationGroup %{GLOBAL} Order deny,allow Allow from all </Directory> # Available loglevels: trace8, ..., trace1, debug, info, notice, warn, # error, crit, alert, emerg. # It is also possible to configure the loglevel for particular # modules, e.g. #LogLevel info ssl:warn ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined # For most configuration files from conf-available/, which are # enabled or disabled at a global level, it is possible to # include a line for only one particular virtual host. For example the # following line enables the CGI configuration for this host only # after it has been globally disabled with "a2disconf". #Include conf-available/serve-cgi-bin.conf </VirtualHost>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ドキュメントに気になる記述を見つけました。

http://flask.pocoo.org/docs/0.11/patterns/fileuploads/

MAX_CONTENT_LENGTHの項目を追加してみてはいかがでしょうか?

python

1import os 2from flask import Flask, request, redirect, url_for 3from werkzeug.utils import secure_filename 4 5UPLOAD_FOLDER = './upload_pdf' 6ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif']) 7 8app = Flask(__name__) 9app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER 10app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024

問題の箇所はどうやら、
return "SAVED"

の場所のようです。

下記変更後に動作しました。:
return redirect(url_for('index'))
※ソース変更後にhttpd を再起動しています。

python

1import os 2from flask import Flask, request, redirect, url_for 3from werkzeug import secure_filename 4 5UPLOAD_FOLDER = '/var/www/html/flaskapp/upload_pdf' 6ALLOWED_EXTENSIONS = set(['txt']) 7 8app = Flask(__name__) 9app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER 10 11def allowed_file(filename): 12 return '.' in filename and \ 13 filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS 14 15@app.route("/", methods=['GET', 'POST']) 16def index(): 17 if request.method == 'POST': 18 file = request.files['file'] 19 if file and allowed_file(file.filename): 20 filename = secure_filename(file.filename) 21 file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) 22 return redirect(url_for('index')) 23 return """ 24 <!doctype html> 25 <title>Upload new File</title> 26 <h1>Upload new File</h1> 27 <form action="" method=post enctype=multipart/form-data> 28 <p><input type=file name=file> 29 <input type=submit value=Upload> 30 </form> 31 <p>%s</p> 32 """ % "<br>".join(os.listdir(app.config['UPLOAD_FOLDER'],)) 33 34if __name__ == "__main__": 35 app.run(host='0.0.0.0', debug=True)

投稿2016/10/17 15:27

編集2016/10/18 13:43
nagaetty

総合スコア1106

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dampo_t

2016/10/18 03:21

またまたありがとうございます。 >>MAX_CONTENT_LENGTHの項目を追加してみてはいかがでしょうか? 残念ながらまだ対処には至らないですね。 ちなみに今回テストでアップロードしようとしていたのが、20KBほどの小さいデータでした。
nagaetty

2016/10/18 03:24

デバックオプションを付けてみて、詳細なエラーメッセージもここにUPされてはいかがでしょうか? なんとなく、禅問答みたいになりそうなので!
dampo_t

2016/10/18 05:29

ご助言ありがとうございます。 >>デバックオプションを付けてみて... 実は自分もそうしたかったのですが、知識不足でaws ec2で実行した時にはdebugオプションをつけてもinternal server errorとなるばかりで、エラーメッセージが表示されなかったです。 解決策を探ってはいるのですが、なかなか出てこないという状態でして、、 Elastic Beans CLIを使用した方法ならなくはなさそうなのですが。
dampo_t

2016/10/18 12:15

ちなみに先ほど答えていませんでしたが、"./upload_pdf"のディレクトリは作ってあります。また絶対パスで指定してもエラーとなってしまいます。
dampo_t

2016/10/18 13:58

すみません、自分も試してみましたが、対処はできなかったです。 return "SAVED" 自体は問題とはならないはず(ファイルセーブの文の前に問題の文を挿入すると、問題なく、SAVEDがweb上で出力されたため)です。 >>ソース変更後にhttpd を再起動しています。 こちらが気になりました。というのも、自分はいつも sudo apachectl restart で再起動をかけていましたので。serviceコマンドは使っていない(というかインストールさえしていない)のですが、そこらへんで問題になったりするんでしょうか?
nagaetty

2016/10/18 14:01

さくらVPSで動作確認は実施ました。変更点は、保存場所をFullPathに変更したところの上記のreturnの部分です。環境差分ですかね?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問