FLASK_APP = post.py FLASK_ENV = development FLASK_DEBUG = 0 In folder D:/task5/flask项目/hotel/flaskProject D:\task5\flask项目\hotel\flaskProject\.venv\Scripts\python.exe -m flask run * Serving Flask app 'post.py' * Debug mode: off 2025-06-03 16:18:53,797 - werkzeug - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Running on http://127.0.0.1:5000 2025-06-03 16:18:53,797 - werkzeug - INFO - Press CTRL+C to quit 2025-06-03 16:18:55,738 - post - ERROR - Exception on / [GET] Traceback (most recent call last): File "D:\task5\flask项目\hotel\flaskProject\.venv\Lib\site-packages\flask\app.py", line 1511, in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\task5\flask项目\hotel\flaskProject\.venv\Lib\site-packages\flask\app.py", line 919, in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\task5\flask项目\hotel\flaskProject\.venv\Lib\site-packages\flask\app.py", line 917, in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ File "D:\task5\flask项目\hotel\flaskProject\.venv\Lib\site-packages\flask\app.py", line 902, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\task5\flask项目\hotel\flaskProject\post.py", line 31, in index return render_template('dashboard.html') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\task5\flask项目\hotel\flaskProject\.venv\Lib\site-packages\flask\templating.py", line 150, in render_template return _render(app, template, context) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\task5\flask项目\hotel\flaskProject\.venv\Lib\site-packages\flask\templating.py", line 131, in _render rv = template.render(context) ^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\task5\flask项目\hotel\flaskProject\.venv\Lib\site-packages\jinja2\environment.py", line 1295, in render self.environment.handle_exception() File "D:\task5\flask项目\hotel\flaskProject\.venv\Lib\site-packages\jinja2\environment.py", line 942, in handle_exception raise rewrite_traceback_stack(source=source) File "D:\task5\flask项目\hotel\flaskProject\templates\dashboard.html", line 54, in top-level template code var categoryData = {{ category_counts | tojson }}; ^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\task5\flask项目\hotel\flaskProject\.venv\Lib\site-packages\jinja2\filters.py", line 1721, in do_tojson return htmlsafe_json_dumps(value, dumps=dumps, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\task5\flask项目\hotel\flaskProject\.venv\Lib\site-packages\jinja2\utils.py", line 669, in htmlsafe_json_dumps dumps(obj, **kwargs) File "D:\task5\flask项目\hotel\flaskProject\.venv\Lib\site-packages\flask\json\provider.py", line 179, in dumps return json.dumps(obj, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\ruanjian\py\pakge\Lib\json\__init__.py", line 238, in dumps **kw).encode(obj) ^^^^^^^^^^^ File "D:\ruanjian\py\pakge\Lib\json\encoder.py", line 200, in encode chunks = self.iterencode(o, _one_shot=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\ruanjian\py\pakge\Lib\json\encoder.py", line 258, in iterencode return _iterencode(o, 0) ^^^^^^^^^^^^^^^^^ File "D:\task5\flask项目\hotel\flaskProject\.venv\Lib\site-packages\flask\json\provider.py", line 121, in _default raise TypeError(f"Object of type {type(o).__name__} is not JSON serializable") TypeError: Object of type Undefined is not JSON serializable 2025-06-03 16:18:55,757 - werkzeug - INFO - 127.0.0.1 - - [03/Jun/2025 16:18:55] "GET / HTTP/1.1" 500 - 进程已结束,退出代码为 0
时间: 2025-06-03 19:19:45 浏览: 15
### 解决 Flask 项目中 `TypeError: Object of type Undefined is not JSON serializable` 的方法
在 Flask 项目中,当遇到 `TypeError: Object of type Undefined is not JSON serializable` 错误时,通常是因为试图将未定义或无法序列化的对象转换为 JSON 格式。以下是解决该问题的详细方法:
#### 1. 确保数据完整性
在 Flask 应用中,如果从数据库或其他来源获取的数据包含未定义值(如 `None` 或 SQLAlchemy 的 `Undefined` 对象),则需要在返回 JSON 响应之前对数据进行清理[^1]。
```python
from flask import jsonify
def clean_data(data):
if isinstance(data, dict):
return {k: clean_data(v) for k, v in data.items() if v is not None}
elif isinstance(data, list):
return [clean_data(item) for item in data if item is not None]
else:
return data
@app.route('/data')
def get_data():
raw_data = {"name": "Test", "value": None} # 示例数据
cleaned_data = clean_data(raw_data)
return jsonify(cleaned_data)
```
上述代码通过递归清理字典和列表中的 `None` 值,确保所有传递给 `jsonify` 的数据都是可序列化的。
#### 2. 使用自定义 JSON 编码器
Flask 提供了扩展 JSON 编码器的功能,可以定义如何处理特定类型的对象。例如,可以通过继承 `JSONEncoder` 来支持更多类型[^2]。
```python
from flask import Flask, jsonify
import json
class CustomJSONEncoder(json.JSONEncoder):
def default(self, obj):
if obj is None:
return ""
return super(CustomJSONEncoder, self).default(obj)
app = Flask(__name__)
app.json_encoder = CustomJSONEncoder
@app.route('/custom-json')
def custom_json():
data = {"key": None}
return jsonify(data)
```
此方法通过重写 `default` 方法来处理特殊对象,如 `None` 类型,将其替换为空字符串或其他默认值。
#### 3. 检查模板渲染逻辑
如果错误发生在使用 `render_template` 渲染模板时,则可能是模板中尝试访问未定义的变量。确保在模板中添加条件判断以避免访问未定义值[^3]。
```html
<!-- templates/example.html -->
{% if user %}
<p>User: {{ user.name }}</p>
{% else %}
<p>No user available</p>
{% endif %}
```
#### 4. 调试与日志记录
为了快速定位问题,可以在应用中启用调试模式并记录日志[^4]。
```python
import logging
app.config['DEBUG'] = True
logging.basicConfig(level=logging.DEBUG)
@app.route('/log-test')
def log_test():
app.logger.debug("This is a debug message")
return "Check logs for details"
```
通过查看日志文件,可以更清晰地了解哪些对象导致了序列化错误。
#### 5. 数据库查询优化
如果错误源于数据库查询结果,则需要检查查询语句是否正确,并确保返回的结果不包含未定义值[^5]。
```python
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
@app.route('/users')
def users():
query_result = User.query.all()
result = [{"id": u.id, "name": u.name or ""} for u in query_result]
return jsonify(result)
```
上述代码通过在生成 JSON 数据时对可能为 `None` 的字段提供默认值,避免了序列化错误。
---
###
阅读全文
相关推荐


















