質問の背景と質問者の知識レベル
Webアプリケーションを作りたいと思い、
html, css, js, python, シェルスクリプトあたりを勉強しています(1ヶ月ほど)。
ローカル環境にてhtmlのフォームからPOSTした内容を結果として表示するような挙動を実現したく、
Pythonのformat関数を利用して実装を試みたものの上手くいかず、
検索してみても現状解決できていないため、みなさまのお力をお借りできればと思います。
前提・実現したいこと
Vagrant + VirtualBoxを利用して構築したローカルのWebサーバー上でhtmlフォームからPythonへ値をPOSTし、
その値を反映した複数行のhtmlコードをPythonのformat関数を利用して出力したいです。
作りたいもののイメージは自分のニックネームを入れると、「◯◯さんにおすすめの趣味は××」です、と結果を返してくれる診断アプリのようなものになります。
該当のソースコード
ディレクトリの構造は
index.html
cgiserver.py
cgi-bin
┗result.py
として上で、
python cgiserver.py
を実行しています。
なお各種ソースは下記になります。
参考にした過去の質問、サイトは下記です。
https://teratail.com/questions/95635
https://qiita.com/kento_y/items/fb7944084e410a607679
index.html
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>あなたの趣味診断</title> </head> <body> <h1>あなたの趣味診断</h1> <form method="POST" action="cgi-bin/result.py"> <label for="name">ニックネーム</label> <input name="name" type="text" id="name"> <button type="submit">診断する</button> </form> </body> <footer> </footer> </html>
reslut.py
#!/usr/bin/python3 # -*- coding: utf-8 -*- import cgi html_format = """ <html lang="ja"> <head> <meta http-equiv="Content-Type" content=\"text/html\"; charset="UTF-8\" /> </head> <body> {}さんの趣味は </body> </html> """ form = cgi.FieldStorage() name = form.getvalue("name") print("Content-Type: text/html; charset=UTF-8") print("") html = html_format.format(name) print(html)
cgiserver.py
# -*- coding: utf-8 -*- import http.server http.server.test(HandlerClass=http.server.CGIHTTPRequestHandler)
発生している問題・エラーメッセージ
上記を実行した際に、ターミナルに
192.168.33.1 - - [22/Oct/2020 21:20:54] "POST /cgi-bin/result.py HTTP/1.1" 200 - Traceback (most recent call last): File "/home/vagrant/.pyenv/versions/3.5.2/lib/python3.5/http/server.py", line 1135, in run_cgi os.execve(scriptfile, args, env) FileNotFoundError: [Errno 2] No such file or directory: '/home/vagrant/syumi/cgi-bin/result.py' 192.168.33.1 - - [22/Oct/2020 21:20:54] CGI script exit status 0x7f00
とメッセージが表示され、ブラウザでは真っ白のページが表示されます。
試したこと
result.pyの内容を下記に変更した場合は問題なく入力した値が表示されているため、ディレクトリやファイルがない、というわけではないのではと思っています。
#!/usr/bin/python # -*- coding: utf-8 -*- import cgi import cgitb import sys cgitb.enable() form = cgi.FieldStorage() print("Content-Type: text/html; charset=UTF-8") print("") if "name" not in form: print("<h1>Error!</h1>") print("<br>") print("テキストを入力してください!") print("<a href='/'><button type='submit'>戻る</button></a>") sys.exit() text = form.getvalue("name") print(text)
また参考にした過去の質問では今回のresult.pyに当たるファイルの拡張子が「.cgi」だったので、result.cgiとして各パスなども修正したものの同じ結果でした。
補足情報
Pythonは3.5.2を利用しています。
何卒よろしくお願いいたします!
回答1件
あなたの回答
tips
プレビュー