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

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

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

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

Python

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

Azure

Azureは、マイクロソフトのクラウド プラットフォームで、旧称は Windows Azureです。PaaSとIaaSを組み合わせることで、 コンピューティング・ストレージ・データ・ネットワーキング・アプリケーションなど多くの機能を持ちます。

Q&A

解決済

1回答

1507閲覧

webappをazureにデプロイ後、2日程でデータベース関係のエラーが発生しだします。

kazuki19950107

総合スコア3

Flask

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

Python

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

Azure

Azureは、マイクロソフトのクラウド プラットフォームで、旧称は Windows Azureです。PaaSとIaaSを組み合わせることで、 コンピューティング・ストレージ・データ・ネットワーキング・アプリケーションなど多くの機能を持ちます。

0グッド

1クリップ

投稿2021/09/27 00:31

編集2021/09/29 08:40

Azure SQL Databaseを用いたウェブアプリを作成し、
同じくAzureのWebappにデプロイしました。
デプロイした後1日~2日ほどは正常に動作しますが、
その後key errorをはくようになります。
web app上では動作していない状態でもローカルで
デバッグ、実行すると正常に動作します。

関係ありそうなコードは

python

1# dao.py 2class DbManeger: 3 4 server = '〇〇.database.windows.net' 5 database = '〇〇' 6 username = '〇〇' 7 password = '〇〇' 8 9 driver= '{ODBC Driver 17 for SQL Server}' 10 11 cnxn = pyodbc.connect('DRIVER='+driver+';SERVER=tcp:'+server+';PORT=1433;DATABASE='+database+';UID='+username+';PWD='+ password) 12 13 cursor = cnxn.cursor() 14 15 select = "SELECT * FROM dbo.users" 16 17 def select_db(self, select): 18 self.cursor.execute(select) 19 rows = self.cursor.fetchall() 20 rows = [list(item) for item in rows] 21 return rows 22 23 def close_db(self): 24 self.cursor.close() 25 self.cnxn.close() 26 27 def execute(self, exe): 28 self.cursor.execute(exe) 29 self.cursor.execute("COMMIT") 30

python

1# app.py 2@app.route('/login', methods=["GET", "POST"]) 3def login(): 4 if(request.method == "POST"): 5 users = config.get_userlist() # ログイン用ユーザー 6 def nested_dict(): return defaultdict(nested_dict) 7 user_check = nested_dict() 8 for i in users.values(): 9 user_check[i.name]["password"] = i.password 10 user_check[i.name]["id"] = i.id 11 user_check[i.name]["data"] = i.data 12 # ユーザーチェック 13 if(request.form["username"] in user_check and request.form["password"] == user_check[request.form["username"]]["password"]): 14 # ユーザーが存在した場合はログイン 15 login_user(users.get(user_check[request.form["username"]]["id"])) 16 session["username"] = request.form["username"] 17 session["password"] = request.form["password"] 18 itemlist = config.ITEM_LIST 19 session["itemlist"] = itemlist[1] 20 21 data_state = user_check[request.form["username"]]["data"] 22 23 session["data_state"] = data_state 24 25 return render_template("index.html", 26 title="〇〇", 27 login_info=login_info_state()) 28 else: 29 return render_template("login.html", msg="パスワードが違います。", 30 title="〇〇", 31 login_info=login_info_state()) 32 else: 33 return render_template("login.html", 34 title="〇〇", 35 login_info=login_info_state())

python

1# config.py 2def get_itemlist(): 3 db_maneger = dao.DbManeger() 4 items = db_maneger.select_db("select * from dbo.hin_list ORDER BY hin_name") 5 items = np.array(items).T.tolist() 6 return items 7 8ITEM_LIST = get_itemlist() 9hin_code = ITEM_LIST[0][0] 10 11db_maneger = DbManeger() 12past_data = db_maneger.select_db(f"SELECT days.date, days.ave_temp, days.EUR_YEN, hin.tanka, hin.PCR FROM dbo.forecast_days AS days INNER JOIN dbo.forecast_{hin_code} AS hin ON days.date = hin.date") 13src_data = pd.DataFrame(past_data, columns=["日付", "平均気温(℃)", "ユーロ/円", "単価", "PCR"]) 14 15datelist = src_data["日付"].to_numpy().tolist() 16FORECAST_PERIOD = f"{datelist[0]}{datelist[-1]}" 17 18 19class User(UserMixin): 20 def __init__(self, id, name, password, data): 21 self.id = id 22 self.name = name 23 self.password = password 24 self.data = data 25 26 27def get_userlist(): 28 db_maneger = dao.DbManeger() 29 users = db_maneger.select_db("select * from dbo.users") 30 31 userlist = [] 32 33 i = 0 34 for row in users: 35 row.insert(0, i) 36 userlist.append(row) 37 i = i + 1 38 39 userlist = np.array(userlist).T.tolist() 40 41 USERS = {} 42 for i in range(len(userlist[0])): 43 Userr = User(i + 1, userlist[1][i], userlist[2][i], userlist[3][i]) 44 USERS[i + 1] = Userr 45 46 return USERS

エラーは以下の通りです。
File "/tmp/8d967a1d088906d/app.py", line 286, in login
users = config.get_userlist()
File "/tmp/8d967a1d088906d/config.py", line 65, in get_userlist
users = db_maneger.select_db("select * from dbo.users")
File "/tmp/8d967a1d088906d/model/dao.py", line 20, in select_db
self.cursor.execute(select)
pyodbc.OperationalError: ('08S01', '[08S01] [Microsoft][ODBC Driver 17 for SQL Server]Communication link failure (0) (SQLExecDirectW)')
"POST /login HTTP/1.1" 500 290 "https://〇〇.azurewebsites.net/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"

2021-09-01T00:21:58.555787350Z key error

ローカル環境ではこのエラーは起きず、デプロイすると発生します。

サブスクリプション:Visual Studio Enterprise – MPN
場所:西日本
App Serviceプラン:B1

なおpython はver3.7.9です。

お力添えを頂けますと幸いです。

以下使用ライブラリ、バージョン等転載いたします。
click==8.0.1
colorama==0.4.4
et-xmlfile==1.1.0
Flask==2.0.1
Flask-Login==0.5.0
importlib-metadata==4.6.3
itsdangerous==2.0.1
Jinja2==3.0.1
joblib==1.0.1
MarkupSafe==2.0.1
numpy==1.21.1
openpyxl==3.0.7
pandas==1.3.1
pyodbc==4.0.32
python-dateutil==2.8.2
pytz==2021.1
scikit-learn==0.24.2
scipy==1.7.1
six==1.16.0
sklearn==0.0
threadpoolctl==2.2.0
typing-extensions==3.10.0.0
Werkzeug==2.0.1
xlrd==2.0.1
zipp==3.5.0

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

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

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

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

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

FiroProchainezo

2021/09/27 02:41

さすがにこれだけだと回答できる人は凄く少ないと思います。 webappsにデプロイしているコードやAzureで使っているサービス一覧(サイズや構成等含む)、吐き出されているエラー(吐き出されているサービス、どのようにそのエラーを見ているのか、Portalの場所等含めて)などがあれば回答できる人が増えると思いいます。
FiroProchainezo

2021/09/29 07:20

一応追記します。 まず、以下を見てください。 https://azure.microsoft.com/ja-jp/product-categories/databases/ これは全てAzure上で使用可能なデータベースです。 AzureのDatabaseですね。 kazuki19950107さんが、「azure database」と書いてますが、「Azure SQL Database」かもしれないし、Azure Databaseで始まる「Azure Database for MySQL」かもしれません。 これはkazuki19950107さんにしかわかりません。 同様に「デプロイした後1日~2日ほどは正常に動作しますが、その後key errorをはくようになります。」も、どこでエラーが出ているのかわかりません。 現状わかっているのはAzureのWebAppsに、Python Flaskを使ったWebアプリをデプロイし、1-2日後にKey Errorが出るようになったという情報だけです。 まず、エラーメッセージ全文とソースコードは最低限貼る必要があります。 また、デプロイした1-2日後という話なのでAzureが悪さをしている可能性があるため、Azureのサービス構成が必須です。 ローカル環境で現象が再現するのかなども合わせて必要と思います。 さらに、そのエラーを確認する方法も最低限必要です。
kazuki19950107

2021/09/29 08:41

ご丁寧に追記まで頂き、ありがとうございます。 分かる範囲で質問を変更致しましたので、ご査収いただけますと幸いです。
guest

回答1

0

ベストアンサー

pyodbcは使った事が無いので想像ですが、

pyodbc.OperationalError: ('08S01', '[08S01] [Microsoft][ODBC Driver 17 for SQL Server]Communication link failure (0) (SQLExecDirectW)')

あたりの印象から行くと、接続できていないように感じます。

データベースに対してクエリを実行するコードを作成する
掲載いただいたコードは上記サンプルと酷似していますが、withが無かったりするようです。

明確にconnectionを切断していないからセッションが足りなくなっている等の問題が発生している可能性があります。
flaskでDBを操作する場合、flask-sqlalchemyを使うのが一般的ですので、そちらに対応した書き方にすればセッション周りを勝手に管理してくれて便利になる可能性があります。

適当に調べたら以下の様な出だしで書けば対応できるようです。
https://gist.github.com/timmyreilly/f4a351eda5dd45aa9d56411d27573d7c

投稿2021/09/30 08:41

FiroProchainezo

総合スコア2402

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

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

kazuki19950107

2021/10/01 09:00

ありがとうございます。withを付けたりconnectionを切断しようとするとエラーに なっていたので、その可能性が高そうです...... flask-sqlalchemy、初耳だったので調べてみます。 ご丁寧にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問