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

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

ただいまの
回答率

90.50%

  • Python

    11650questions

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

  • Apache

    2097questions

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

  • Ubuntu

    1800questions

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

  • Flask

    341questions

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

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 807

notyou111

score 3

同一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
#post.py
import urllib.request, json
import base64

def convert_b64(file_path):
    """
    b64にエンコード
    """
    return base64.encodestring(open(file_path, 'rb').read()).decode("utf-8")

if __name__ == '__main__':
    url = "http://0.0.0.0/post_request"
    image = "test.jpg"
    method = "POST"
    headers = {"Content-Type" : "application/json"}
    value = convert_b64(image)
    # PythonオブジェクトをJSONに変換する
    obj = {"key" : value}
    json_data = json.dumps(obj).encode("utf-8")
    # httpリクエストを準備してPOST
    request = urllib.request.Request(url, data=json_data, method=method, headers=headers)
    with urllib.request.urlopen(request) as response:
        response_body = response.read().decode("utf-8")
#flask_script.py
# app.py
from flask import Flask
from flask import request
import base64

app = Flask(__name__)

def convert_b64_to_file(b64,outfile_path):
    """
    b64をデコードしてファイルに書き込む
    """
    s = base64.decodestring(b64)
    with open(outfile_path,"wb") as f :
        f.write(s)

@app.route("/")
def index():
    return "convert  to image"

#base64でエンコードされたjsonファイルをデコード
@app.route('/post_request', methods=['POST'])
def post_request():
    #request.jsonでにPOSTされたデータを取ってくる
    temp = request.json["key"]
    #byteに変換
    temp = bytes(temp,"utf-8")
    #デコード
    convert_b64_to_file(temp,"./copy1.png")
    return temp


if __name__ == "__main__":
    app.debug = True
    app.run(host="0.0.0.0")
    # curl http://127.0.0.1:5000/post_request -X POST -H "Content-Type: application/json" -}''{"key": "value"}
#flask_app.wsgi
import os,sys

sys.path.insert(0, os.path.abspath(os.path.dirname(__file__)))

from 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>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • notyou111

    2017/08/09 11:34 編集

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

    キャンセル

  • CHERRY

    2017/08/09 11:41

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

    キャンセル

  • notyou111

    2017/08/09 11:43

    ありがとうございます!

    キャンセル

回答 3

checkベストアンサー

+1

まず、「./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 11:42

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

    キャンセル

+1

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というファイルが存在するなら、そのファイルのパーミッションがどうなっているか
といった事を調べ、必要に応じてパーミッションを変更すれば問題は解決すると思われます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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

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

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

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

とすれば動くはずです。


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/09 11:47

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

    キャンセル

  • 2017/08/09 11:51

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

    キャンセル

同じタグがついた質問を見る

  • Python

    11650questions

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

  • Apache

    2097questions

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

  • Ubuntu

    1800questions

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

  • Flask

    341questions

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