Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Xサーバーでflaskをデプロイすると500エラーが発生してしまいます。

解決したいこと

下記記事を参考にflaskで作成したサイトをxサーバーで公開するためにデプロイ作業を行っています。
https://chikaraemon.com/wordpress/2020/09/26/xserver_flask_mysql_1/

xサーバーにコマンドでのPythonとFlaskのインストールや、
db作成、tableの作成は行いました。

xサーバーのエラーログに出力されている下記エラーを解消して画面表示とCRUD機能が使えるようにしたいのですが、
下記エラーで詰まってしまいました。

[Mon May 27 20:23:33.510466 2024] [cgid:error] [pid 2420657:tid 2420703] [client ■■■.■■.■■■.■■■:■■■■■] End of script output before headers: index.cgi

該当するソースコード

index.cgi
#! /home/■■■■■■■■■■/anaconda3/bin/python3
from wsgiref.handlers import CGIHandler
from app import app
CGIHandler().run(app)
app.py
import datetime

from flask import Flask, render_template, request, redirect, url_for
import mysql.connector
from mysql.connector import Error
from dotenv import load_dotenv
load_dotenv()
import os

app = Flask(__name__)

"""
*DB接続用メソッド
*引数(ホスト名、ユーザー名、パスワード、DB名)
*接続を返す
"""
def server_connection(HOST_NAME, USER_NAME, USER_PASSWORD, DATABASE_NAME):
    connection = None
    try:
        connection = mysql.connector.connect(
            host=HOST_NAME,
            user=USER_NAME,
            passwd=USER_PASSWORD,
            database=DATABASE_NAME
        )
    except Error as e:
        with open('error_log.txt', 'a') as f:
                f.write("%s\n" % e)
    return connection

"""
*全講習情報取得用メソッド
*引数(DB名)
*全講習情報を返却
"""
def select_item(DATABASE_NAME, seminar_name):
    conn = server_connection(HOST_NAME, USER_NAME, USER_PASSWORD, DATABASE_NAME)
    cursor = conn.cursor()
    try:
        cursor.execute('SELECT * FROM item_master WHERE ItemName=%s ', (item_name,))
        items = cursor.fetchall()
        cursor.close()
        conn.close()
    except Error as e:
        with open('error_log.txt', 'a') as f:
            f.write("%s\n" % e)
    return items

"""
*items_select遷移時に表示する情報取得
*引数なし
*各講習の一覧を返す
"""
@app.route('/items_select/')
def schedule_select():
    DATABASE_NAME ='■■■■■■■■■■_itemsdb'
    items = select_items(DATABASE_NAME, items_name)
    return render_template('items_select.html', items=items)

@app.errorhandler(404)
def page_not_found(error):
    return render_template('404.html'), 404

if __name__ == "__main__":
    app.run(host='0.0.0.0')
.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /admin/index.cgi/$1 [QSA,L]
<Files ~ "\.py$">
    deny from all
</Files>

最後まで読んでいただきありがとうございます。
もしわかる方がいらっしゃいましたら教えていただけますと幸いです。

0 likes

1Answer

参考先にもありますがファイルのパーミッションを設定するのを忘れていないか確認してください.

参考にした記事と同じことをやって動かない場合は8割がた何かを間違えています.闇雲に代替案を探す前に検証は時間をかけて慎重に行ってください.そうでないとどうせ同じハマり方をするのが目に見えています.

0Like

Comments

  1. @Kobayashi0620

    Questioner

    https://chikaraemon.com/wordpress/2020/09/26/xserver_flask_mysql_1/
    上記記事を参考に環境構築作業を行っていたのですが、linuxbrewがすでにサービス終了?したみたいで記事と同じ環境が作れなかったため、下記記事を参考に環境構築を行いました。
    一つ目の記事の動画は上記記事の制作者と同じ方が運営されているYouTubeでこちらも参考にしていたのですが、見返したところ、
    cmdでimport flaskで処理が通るようにして500エラーを解消していたのですが、
    pythonが記事と違っているためどのように行えばいいのかわからず、詰まってしまっています。

    現状下記のpathにpython3とpipがある状態になります。

    .ファイルがあるPath
    /home/■■■■■■■■■■/anaconda3/bin/python3
    /home/■■■■■■■■■■/anaconda3/bin/pip
    /home/■■■■■■■■■■/anaconda3/bin/pip3
    

    SSH接続をした状態で

    .cmd
    /home/■■■■■■■■■■/anaconda3/bin/pip list
    

    または

    .cmd
    /home/■■■■■■■■■■/anaconda3/bin/pip3 list
    

    を実施するとpipコマンドが通る(ここでFlaskがインストールされていることは確認済み)のですが、pathを指定していない状態だと

    .エラー
    -bash: pip: コマンドが見つかりません
    

    というエラーが発生してしまいます。
    この状態で

    .cmd
    $ python
    >>>import flask
    

    を行ってしまうと

    .エラー
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ImportError: No module named flask
    

    というエラーが発生してしまいます。

    これはPathが通っていないということだと思うので

    .cmd
    export PATH="/home/■■■■■■■■■■/anaconda3/bin/pip:$PATH"
    

    を実施してみたのですが実施した後に

    .cmd
    $ pip list
    

    を実施しても下記エラーが発生してしまいます。

    .エラー
    -bash: pip: コマンドが見つかりません
    

    下記コマンドが通るようにするにはどうしたらよいでしょうか?

    .cmd
    $ python
    >>>import flask
    
    .参考記事
    1. SSH接続
    https://youtu.be/5o9HJGPlSgk
    
    2.コマンドでのPythonとFlaskのインストール
    メイン:https://science-log.com/pc%E9%96%A2%E9%80%A3/xserver%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%ABpython%E3%82%92%E5%B0%8E%E5%85%A5%E3%81%99%E3%82%8B/
    補助:https://qiita.com/yuu_1st/items/2860af31518827da10e3
    
    3.db作成手順
    https://www.xserver.ne.jp/manual/man_db_setting.php
    
    4.table作成手順(SSH接続を行った後)
    https://prog-8.com/docs/mysql-database-setup
    
  2. PATHに指定するのはディレクトリだからです.

    ただどうせCGIなのでPATHを通しているのがカギになるかというとそうではないです.
    結局使用するpython環境でモジュールをインストールできればいいだけです.

    $ /home/■■■■■■■■■■/anaconda3/bin/pip install flask
    

    ちなみにlinuxbrewは本家homebrewにマージされました.

  3. @Kobayashi0620

    Questioner

    ありがとうございます

    export PATH="/home/■■■■■■■■■■/anaconda3/bin/pip:$PATH"
    

    ではなく

    export PATH="/home/■■■■■■■■■■/anaconda3/bin:$PATH"
    

    ということでしょうか?

  4. ということでしょうか?

    さすがにメンターほど面倒は見ていられないので,そのレベルで理解が怪しいのであれば一度linuxの操作を勉強しなおしてください.

    先程も言ったように今回はCGIなので,PATHが通ってるかどうかが問題解決に重要になるということは少ないです.
    /home/■■■■■■■■■■/anaconda3/bin/python3を実行したうえでimport flaskが通る状態にしてください.

  5. @Kobayashi0620

    Questioner

    全体的に学習が足りていないので、この作業が終わりましたら初歩的な個所から学習をやり直してみます。

    以下の処理エラーなく通りました

    $ /home/offersweb88/anaconda3/bin/python3.11
    >>> import flask
    >>>
    

Your answer might help someone💌