実現したいこと
webページのテキストボックスからjavascriptコードを受け取り,受け取ったコードの実行でエラーが出る場合はエラー名とエラー内容をデータベースに保存するというwebアプリケーションを作りたいです
発生している問題・分からないこと
明らかにエラーが発生するコードを入力してもPython側で用意したlog_error関数が呼び出されている気配がなく,またデバッグ用に記述したconsole.log("test1")などのメッセージがターミナル側で表示されません
エラーメッセージ
error
1特にエラーは発生しなかったのですが,ログはこんな感じでした 2 * Serving Flask app 'test' 3 * Debug mode: on 4WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. 5 * Running on http://127.0.0.1:5000 6Press CTRL+C to quit 7 * Restarting with stat 8 * Debugger is active! 9 * Debugger PIN: 119-491-145 10127.0.0.1 - - [15/Jan/2025 15:16:39] "POST /test_code HTTP/1.1" 405 - 11127.0.0.1 - - [15/Jan/2025 15:16:44] "GET / HTTP/1.1" 200 - 12127.0.0.1 - - [15/Jan/2025 15:16:48] "POST / HTTP/1.1" 302 - 13127.0.0.1 - - [15/Jan/2025 15:16:48] "GET /test_code HTTP/1.1" 200 -
該当のソースコード
test.py
1 2from flask import Flask, render_template, request, jsonify, session, redirect, url_for 3from flask_sqlalchemy import SQLAlchemy 4from datetime import datetime 5import json 6import os 7 8# test.py 9 10app = Flask(__name__) 11 12app.config["SECRET_KEY"] = os.urandom(24) 13base_dir = os.path.dirname(__file__) 14error_log = "sqlite:///" + os.path.join(base_dir, "error_log.sqlite") 15app.config["SQLALCHEMY_DATABASE_URI"] = error_log 16app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False 17 18from jinja2 import StrictUndefined 19app.jinja_env.undefined = StrictUndefined 20 21db = SQLAlchemy(app) 22 23class ErrorLog(db.Model): 24 id = db.Column(db.Integer, primary_key=True) 25 error_name = db.Column(db.String(100), nullable=False) 26 error_message = db.Column(db.Text, nullable=False) 27 source = db.Column(db.Text, nullable=True) 28 line_number = db.Column(db.Integer, nullable=True) 29 column_number = db.Column(db.Integer, nullable=True) 30 31 def __repr__(self): 32 return f"<ErrorLog('{self.error_name}', {self.error_message})>" 33 34@app.route("/", methods=["GET", "POST"]) 35def index(): 36 if request.method == "POST": 37 code = request.form.get("code") 38 session["code"] = code 39 print(code) 40 return render_template("view_test.html", code=code) 41 return render_template("view_test.html", code = "") 42 43# @app.route("/test_code", methods=["GET"]) 44# def test_code(): 45# code = session.get("code", "") 46# return render_template("view_test.html", code=code) 47 48@app.route('/log_error', methods=['POST']) 49def log_error(): 50 print("log_error") 51 try: 52 data = request.get_json() 53 error_name = data.get('error_name', 'Unknown Error') 54 error_message = data.get('error_message', '') 55 line_number = data.get('line_number', None) 56 column_number = data.get('column_number', None) 57 source = session.get("code", "") 58 59 new_error = ErrorLog( 60 error_name=error_name, 61 error_message=error_message, 62 source=source, 63 line_number=line_number, 64 column_number=column_number 65 ) 66 db.session.add(new_error) 67 db.session.commit() 68 69 return jsonify({"message": "Error logged successfully"}), 200 70 71 except Exception as e: 72 return jsonify({"message": f"Error logging failed: {str(e)}"}), 500 73 74if __name__ == "__main__": 75 with app.app_context(): 76 db.create_all() 77 app.run(debug=True) 78
view_test.html
1 2<!DOCTYPE html> 3<html lang="en"> 4<head> 5 <meta charset="UTF-8"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <title>Test JavaScript Execution</title> 8</head> 9<body> 10 <h1>JavaScript Execution Test</h1> 11 <form method="POST" enctype="multipart/form-data"> 12 <label for="code">JavaScript Code:</label><br> 13 <textarea id="code" name="code" rows="10" cols="50"></textarea><br> 14 <input type="submit" value="Execute"> 15 </form> 16 17 <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.11.2/p5.js"></script> 18 <script> 19 window.addEventListener('error', async function(event) { 20 const errorData = { 21 error_name: event.error ? event.error.name : 'Error', 22 error_message: event.error ? event.error.message : '', 23 line_number: event.lineno || null, 24 column_number: event.colno || null, 25 }; 26 27 await fetch('/log_error', { 28 method: 'POST', 29 headers: { 30 'Content-Type': 'application/json', 31 }, 32 body: JSON.stringify(errorData), 33 }); 34 console.log('Error logged successfully:', errorData); 35 }); 36 37 // エラーハンドリングを追加 38 try { 39 console.log("test1"); 40 const jsCode = `{{ code|safe }}`; 41 eval(jsCode); 42 } catch (error) { 43 console.log("test2") 44 console.error('Error executing code:', error); 45 } 46 </script> 47</body> 48</html>
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
最初はtry-catch文でエラーが発生しているかどうか調べていたのですが,window.addEventListenerでエラーを検知するよう変更してみたりしました
補足
実行OS: Mac OS Sequoia 15.1.1
コードの記述,実行はvscodeで行いました
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2025/01/16 05:43 編集
2025/01/16 07:02
2025/01/16 13:45
2025/01/16 15:29 編集
2025/01/16 15:38
2025/01/16 16:20
2025/01/16 17:04