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

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

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

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

Q&A

解決済

1回答

5026閲覧

pythonのWebアプリのファイル読み込みに関してです

onceupon05

総合スコア13

Python

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

0グッド

1クリップ

投稿2016/06/08 11:17

編集2016/06/09 23:35

pythonを利用したWebアプリの開発を行いたいです。
そのために、このサイトを使用して、

Webサーバを起動→簡単なサイト(拡張子がhtmlではなくpy)を表示する、ということをしようとしておりました。

ソースは以下です。

lang

1#!/usr/bin/env python 2html_body = """ 3<html><body> 4foo = %s 5</body></html>""" 6import cgi 7form=cgi.FieldStorage() # (1) 8print "Content-type: text/html¥n" 9print html_body % foo # (2)

この際、サイトが表示されると、
「foo = xxx」の部分のみが出力されるものと思われますが、
「#!/usr/bin/env python」から「print html_body % foo # (2)」まで全てブラウザ上に出力されてしまいます。

おそらく、「#!/usr/bin/env python」の読み込みがおかしいのもしれないと考え、「/usr/bin/env」のパスを調べましたが、そのようなパスはありませんでした。
そういった場合、ここにはなんと記述する必要がありますでしょうか。

pythonのバージョンは

lang

1Python 3.4.1 :: Anaconda 2.1.0 (64-bit)

です。

回答お待ちしております。

【追記】

lang

1>>> import sys 2>>> print(sys.path) 3['', '/home/mluser/.pyenv/versions/anaconda3-2.1.0/lib/python34.zip', '/home/mluser/.pyenv/versions/anaconda3-2.1.0/lib/python3.4', '/home/mluser/.pyenv/versions/anaconda3-2.1.0/lib/python3.4/plat-linux', '/home/mluser/.pyenv/versions/anaconda3-2.1.0/lib/python3.4/lib-dynload', '/home/mluser/.pyenv/versions/anaconda3-2.1.0/lib/python3.4/site-packages', '/home/mluser/.pyenv/versions/anaconda3-2.1.0/lib/python3.4/site-packages/Sphinx-1.2.3-py3.4.egg', '/home/mluser/.pyenv/versions/anaconda3-2.1.0/lib/python3.4/site-packages/runipy-0.1.1-py3.4.egg', '/home/mluser/.pyenv/versions/anaconda3-2.1.0/lib/python3.4/site-packages/setuptools-5.8-py3.4.egg']

【追記2016/06/10 8:30】
querytest.pyアクセス時に出てくる画面

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

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

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

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

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

lightson

2016/06/08 11:29

利用しているOSとWebサーバを教えて下さい。
onceupon05

2016/06/08 11:47 編集

OSはLinux mint(特に他のLinuxOSの違いはないかと。。。)を使用しております。 Webサーバは、 import http.server server_address = ("", 8000) handler_class = http.server.SimpleHTTPRequestHandler #ハンドラを設定 simple_server = http.server.HTTPServer(server_address, handler_class) simple_server.serve_forever() を実行したものをWebサーバとしております。
onceupon05

2016/06/08 11:48

Webサーバの部分のコードが開業されずに、見づらくなってしまいまして申し訳御座いません。
guest

回答1

0

ベストアンサー

httpサーバが不適切です。
SimpleHTTPRequestHandlerができるのは、ファイルの内容をテキストとして返すことだけです。
http://docs.python.jp/3/library/http.server.html

class http.server.SimpleHTTPRequestHandler(request, client_address, server)(原文)

このクラスは、現在のディレクトリ以下にあるファイルを、HTTP リクエストにおけるディレクトリ構造に直接対応付けて提供します。

プログラムを動かした結果をwebサーバに渡して表示するには、GIHTTPRequestHandlerを使う必要があります。
onceupon05さんが参照しているサイトでもそのようになっています。
http://coreblog.org/ats/stuff/minpy_web/03/02.html

ただ、これを直したとしても、使っているのがAnacondaのpythonなので、その点を考慮しないとうまく動かないかもしれません。

題材にしているサイトは、2.7用に書かれたものなので、そのままでは動きません。改行も¥nと間違っていました。
少なくとも私ところでは、これで動きました。

python

1#!/usr/bin/env python3 2html_body = """ 3<html><body> 4foo = %s 5</body></html>""" 6import cgi 7form=cgi.FieldStorage() 8foo = form["foo"].value 9print("Content-type: text/html\n") 10print(html_body % foo)

投稿2016/06/08 12:29

編集2016/06/11 13:18
lightson

総合スコア553

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

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

onceupon05

2016/06/08 22:32

回答をいただきましてありがとうございます。 サイトを見て、あぁ、そうなっているのだなと理解することができました。 しかしながら、サーバを回答いただいたものに差し替え、再度自作のWebページにアクセスをしたところ、Webページが開かれるのではなく、pythonファイルのダウンロードが始まってしまいます。。。
lightson

2016/06/09 09:50

コンソールで/usr/bin/env python と打った時に立ち上がるpythonのインタラクティブシェルがanacondaかどうかを教えてもらえますか。
onceupon05

2016/06/09 11:19

$ /usr/bin/env python Python 3.4.1 |Anaconda 2.1.0 (64-bit)| (default, Sep 10 2014, 17:10:18) [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux Type "help", "copyright", "credits" or "license" for more information. と、出力されました。anacondaでした。
onceupon05

2016/06/09 14:04

お返事をいただきましてありがとうございます。 コメントいただきましたサイトの通りに行いましたら、問題なく動きました。 しかしながら、このページの「次:Webアプリケーションに値を渡す」という部分を行っていただけますでしょうか。こちらの、querytest.pyは実行できますでしょうか。 実行の際に、ページに記載されているコードをそのままコピペをしてquerytest.pyに書いてみたり、 python3を使用しているので、 #!/usr/bin/env python3 html_body = """ <html><body> foo = %s </body></html>""" import cgi form=cgi.FieldStorage() # (1) print("Content-type: text/html¥n") print(html_body % foo) # (2) というように変形したりしたのですが、 querytest.pyにアクセスした際に、ページがダウンロードされる、といった状況は依然変わりません。。。
lightson

2016/06/09 21:30

問題なく動くという意味は、List04 test.pyやList05 test.py(改)は動くということですか? querytest.pyにはhttp://127.0.0.1:8000/cgi-bin/querytest.py?foo=bar 形でアクセスしているでしょうか?
onceupon05

2016/06/09 23:40

おっしゃいます通り、List04 test.pyやList05 test.py(改)は動きました。 querytest.pyにはhttp://127.0.0.1:8000/cgi-bin/querytest.py?foo=barという形でアクセスをしましたが、質問文に追加いたしました画像のようなものが出てきてしまいます。 querytest.pyにはhttp://127.0.0.1:8000/cgi-bin/querytest.pyにアクセスした際も同じ画像のものが表示されました。 http://127.0.0.1:8000/cgi-bin/query.py(誤ったファイル名) にアクセスをした際は、404になったので、正しいファイル名は指定できているものと思っております。
lightson

2016/06/11 13:23

同じ環境で動作の確認をしました。このサイトはもとは2.7用に作られたものを 3用に直しているので間違いが有ります。他のサイトを参考にするか、bottleなどを使ったほうがいいかもしれません。 http://symfoware.blog68.fc2.com/blog-entry-1068.html
lightson

2016/06/11 13:38

もし、コピペでダメなら改行コードの問題の可能性がありますので、手打ちして確認してみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問