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

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

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

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

Apache

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

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

5532閲覧

Apache2上でpythonプログラムを動かした時に,ファイルが生成されない

notyou111

総合スコア12

Flask

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

Apache

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

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2017/08/09 01:12

編集2017/08/09 01:50

同一Ubuntu内で下記の一つ目のファイル(post.py)を動作させ,Apache/2.4.7(Ubuntu)で下記の二つ目のファイル(flask_script.py)を動かしているのですが,flask_script.pyのposr_requestがうまく動きません.apacheのエラーを見たところ,PermissonError:[Errno 13]Permisson denied :".copy.png"と出ています.

flask_script.pyのpost_request以外のメソッドはうまく動き,curlコマンドでjsonを送った場合にも受信できているようです.ただ,ファイルの書き出し(copy.pngの作成)ができません.

cgiファイルは#flask_app.wsgiのようになっています.

ディレクトリ構成は,var/www/flaskフォルダにflask_script.pyとflask_app.cgiを配置してます

※追記
apacheの設定ファイルは下記の/etc/apache2/sites-available/flask.confのようになっています.

このサイトをhttp://blog.akashisn.info/entry/%3Fp%3D258を元にflaskとapacheを連携させています.

www以下のパーミッションはこのようになっています。
:/var/www$ ls -l
合計 8
drwxrwxrwx 3 www-data www-data 4096 8月 8 22:14 flask
drwxr-xr-x 2 root root 4096 8月 8 16:23 html

echoでflask以下にファイルが作成できるか試しました

$ echo "test" > /var/www/flask/hoge.txt $ cd /var/www $ cd flask/ $ ls __pycache__ flask_app.wsgi flask_script.py flask_script.py~ hoge.txt $ more hoge.txt test

python

1#post.py 2import urllib.request, json 3import base64 4 5def convert_b64(file_path): 6 """ 7 b64にエンコード 8 """ 9 return base64.encodestring(open(file_path, 'rb').read()).decode("utf-8") 10 11if __name__ == '__main__': 12 url = "http://0.0.0.0/post_request" 13 image = "test.jpg" 14 method = "POST" 15 headers = {"Content-Type" : "application/json"} 16 value = convert_b64(image) 17 # PythonオブジェクトをJSONに変換する 18 obj = {"key" : value} 19 json_data = json.dumps(obj).encode("utf-8") 20 # httpリクエストを準備してPOST 21 request = urllib.request.Request(url, data=json_data, method=method, headers=headers) 22 with urllib.request.urlopen(request) as response: 23 response_body = response.read().decode("utf-8") 24

python

1#flask_script.py 2# app.py 3from flask import Flask 4from flask import request 5import base64 6 7app = Flask(__name__) 8 9def convert_b64_to_file(b64,outfile_path): 10 """ 11 b64をデコードしてファイルに書き込む 12 """ 13 s = base64.decodestring(b64) 14 with open(outfile_path,"wb") as f : 15 f.write(s) 16 17@app.route("/") 18def index(): 19 return "convert to image" 20 21#base64でエンコードされたjsonファイルをデコード 22@app.route('/post_request', methods=['POST']) 23def post_request(): 24 #request.jsonでにPOSTされたデータを取ってくる 25 temp = request.json["key"] 26 #byteに変換 27 temp = bytes(temp,"utf-8") 28 #デコード 29 convert_b64_to_file(temp,"./copy1.png") 30 return temp 31 32 33if __name__ == "__main__": 34 app.debug = True 35 app.run(host="0.0.0.0") 36 # curl http://127.0.0.1:5000/post_request -X POST -H "Content-Type: application/json" -}''{"key": "value"} 37

python

1#flask_app.wsgi 2import os,sys 3 4sys.path.insert(0, os.path.abspath(os.path.dirname(__file__))) 5 6from flask_script import app as application
#flask.conf <VirtualHost *:80> ServerName localhost WSGIDaemonProcess flask_app user=www-data group=www-data threads=5 WSGIScriptAlias / /var/www/flask/flask_app.wsgi <Directory /var/www/flask> WSGIProcessGroup flask_app WSGIApplicationGroup %{GLOBAL} Order deny,allow Allow from all </Directory> </VirtualHost>

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

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

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

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

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

miyahan

2017/08/09 01:18

Apache と Flask をどう連携しているか教えて下さい。また可能であればApacheの設定ファイルも本文に貼り付けて下さい。
notyou111

2017/08/09 01:28

回答ありがとうございます.追記しましたorz
CHERRY

2017/08/09 01:37

「./copy1.png」を生成しようとしている ディレクトリの オーナー、グループ、パーミッションは、どうなっているでしょうか? 「/からの絶対パス」で、記載すると書き込めたりしますか?
notyou111

2017/08/09 01:53

回答ありがとうございます。絶対パスで書き込めたことを、追記しましたorz
CHERRY

2017/08/09 02:10

convert_b64_to_file(temp,"./copy1.png") を絶対パスに書き換えたのではなくて コマンドラインから 書き込めたのでしょうか?
notyou111

2017/08/09 02:30

コマンドラインからです.convert_b64_to_file(temp,"/var/www/flask/copy1.png")としたところcopy1.pngが作れたのですが,画像ビューアーで読み込めませんorz
notyou111

2017/08/09 02:40 編集

すいません.firefoxのビューアーで見たところ無事見れました 助かりました!!!ありがとうございましたorz ubuntuの画像ビューアーで見れないのはなぜかわかりませんが,ありがとうございました!
CHERRY

2017/08/09 02:41

とりあえず、うまくいったようでなりよりです。 コメント欄のやり取りをもとに、推測される原因とともに回答欄に記載しました。
notyou111

2017/08/09 02:43

ありがとうございます!
guest

回答3

0

Permisson denied と言われてるので、"./copy1.png" のおよび同ディレクトリの権限がないのだと思います。

mod_wsgi をデーモンモードで起動した場合、カレントディレクトリは実行ユーザー(今回だとwww-data)のホームディレクトリになるはずですので、全然場違いなところに保存しようとしているのだと思います。

今回のように相対パスの使用はトラブルやバグの原因になるため、可能限り絶対パスで指定する習慣を付けましょう。

python

1convert_b64_to_file(temp,"/var/www/flask/copy1.png")

とすれば動くはずです。


余談ですが test.jpg とJPEGファイルを渡しているのに、それを copy1.png とPNGファイルとして保存していますが大丈夫ですか?

投稿2017/08/09 02:47

miyahan

総合スコア3095

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

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

miyahan

2017/08/09 02:47

出遅れました。失礼しました
notyou111

2017/08/09 02:51

いえいえ!ありがとうございます! pngとjpegの混同を直したところ無事ビューアーで見えました! 助かりました!
guest

0

ベストアンサー

まず、「./copy1.png」は、カレントディレクトリにある 「copy1.png」を指します。

apache のカレントディレクトリがどこかわからなかったので、単純な cgi や php を書いて、pwd コマンドを実行させて、カレントディレクトリを表示してみました。

ruby : cgi プログラムのあるディレクトリ php : /

という結果になりました。

ということで...

「./copy1.png」で、ファイルを指定した場合、おそらく /var/www/flask/ じゃないディレクトリに「copy1.png」 に書き込みをしようとしているのではないかと推測されます。

convert_b64_to_file 関数のファイル名を指定している部分を絶対パス表記で、「/var/www/flask/」のディレクトリを追加してファイル名を指定することで解決できるのではないかと思います。

投稿2017/08/09 02:37

CHERRY

総合スコア25171

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

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

notyou111

2017/08/09 02:42

回答ありがとうございます.おっしゃる通りでした!パスを間違えていたのですね... 本当にありがとうございましたorz
guest

0

Permisson deniedというエラーなのですから、post_request()の下記の場所で問題が起きているのでしょう。

convert_b64_to_file(temp,"./copy1.png")

./copy1.pngをPermisson deniedで開くことができないのは、

  1. ./copy1.png というファイルが既に存在しているが、書き込みのパーミッションが無い
  2. ./ というディレクトリに書き込み及び実行のパーミッションが無い

のいずれかだと思われます。

・convert_b64_to_fileの実行の際のユーザは誰か(apacheを実行しているユーザと同じはず)
・convert_b64_to_fileの実行時のデフォールトディレクトリ(./)の場所(フルパス)は何か
・./ のパーミッションはどうなっているか
・./copy1.pngというファイルが存在するなら、そのファイルのパーミッションがどうなっているか
といった事を調べ、必要に応じてパーミッションを変更すれば問題は解決すると思われます。

投稿2017/08/09 01:44

coco_bauer

総合スコア6915

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問