@suzukitakeshi19 (t suzuki)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

python flask レンタルサーバー上でのエラーデバッグ方法について

解決したいこと

windowsのローカル環境上では問題なく動作するpython flaskのアプリケーションをレンタルサーバー(lolipop)で動作させようとするとエラーが出ます。

エラー内容は 500 Internal Server Error です。
パーミッションや改行コードなどを見直して部分的に表示できるようになりましたが、100%動作するところまではできていません。

ファイル構成は下記になります。
app.py
cgi.index
static
templates/index.html

.pyファイルは1つ、index.html も1つの構成です。
formによるpostによって1つのページを更新しています。
それぞれのエラー個所の抜粋は下記になります。

3つあるformのうち1つは機能します。ルーティンも機能しています
残り2つのformのpost、ルーティンがレンタルサーバー上では機能していません。

index.html
  <form action="/gamestart" method="post">
       <input class="start_button" type="submit" value="game start">
   </form>

  <form action="/play_step2" method="post">
      <input type="radio" name="position" value="1"  id="item-1" required >
      <label class="radio-inline__label" for="item-1">1</label>                
   </form>

  <form action="/play_step3" method="post">
     <input input" type="radio" name="player_select" value="1"  id="item-a" >
     <label class="radio-inline__label" for="item-a">もう1枚カードをもらう</label>
   </form>        
app.py
@app.route('/')
def index():
      
    return render_template('index.html')

@app.route('/gamestart' , methods=['POST'])
def gamestart():
      
    return render_template('index.html') 

@app.route('/play_step2' , methods=['POST'])
  
    return render_template('index.html') 

@app.route('/play_step3' , methods=['POST'])
  
    return render_template('index.html') 


レンタルサーバー上だけで、コード内にエラーが発生しているのだろうと思いますが、エラー詳細を確認する方法がないため、どこが問題なのかわかりません。
何かやりようがあれば教えてください。

※windowsローカル環境上では問題なく動作します。

0 likes

5Answer

実際に動かしてはいませんが、グローバル変数を使っているのが問題のように見えます。 CGI は1リクエストごとに index.cgi を実行して Flask アプリケーションを起動するため、異なるリクエストの間でグローバル変数は引き継がれません。

たとえば2つめのフォームから POST すると、サーバ側で新しい Flask アプリケーションが起動し、そして play_step2() が呼び出されます。このとき play_step2() から呼ばれる add_new_card(i) が未初期化のグローバル変数 x を参照し、おそらくここでエラーが出ます。

一方、ローカル環境で flask run または python App.py で起動した場合は1つの Flask アプリケーションが実行され続けるので、あるリクエストの処理中にグローバル変数がセットされれば以降のリクエストでも参照できます。それでエラーが起きないのでしょう。1

リクエストの間で状態を引き継ぎたいときはセッションと何かしらのデータベースを使ってください。

  1. エラーが起きないとはいえ、一般的に web アプリケーションでグローバル変数は使うべきではありません。アプリケーションを止めればデータが消えたり、(特に今の実装では)異なるユーザーのアクセスに対して同じ途中経過を表示してしまったりと問題が多いからです。

1Like

app.py の省略された部分にエラーがありそうです。コードをすべて質問に書いてください。

0Like

こんにちわ。さっそくコメントありがとございます。
ファイルは少ないのですが、コードの量が多いので下記にファイル保存しました。

ファイル一式ダウンロードすると動作確認できると思います。

0Like

ちなみに、リクエスト中に起きたエラーの内容を手っ取り早く表示したいときは以下のようにしてください。

import traceback

@app.route('/play_step2' , methods=['POST'])
    try:
        
        return render_template('index.html')
    except Exception:
        return traceback.format_exc(), 500, {'Content-Type': 'text/plain'}
0Like

丁寧に回答オありがとうございました。
cgiだとグローバル変数の情報が保持されないのですね。(知りませんでした)
再度コードを見直してみます。

0Like

Your answer might help someone💌