postgresql数据库一只是我挺喜欢的一个数据库,做WEB编程时一直作为首选。现在有了python语言,就想使用python语言建立网站,并使用post协议,提交json数据到数据库中。
一、准备安装环境
这次尝试需要准备以下软件:
1、postgresql 数据库 V9.6(其他版本的应该也可以)
2、python V3.14
3、flask框架,这是一个WEB框架
4、postgresql的驱动:psycopg2
前两个的安装略。3和4的安装需要执行:
pip install flask pip install psycopg2-binary
二、建立网站代码(含数据库建表处理)app.py
# -*- coding: utf-8 -*-
from flask import Flask, request, jsonify
import psycopg2
from psycopg2 import extras
import os
app = Flask(__name__)
# --- 1. 数据库配置区域(请务必修改这里)---
DB_CONFIG = {
"host": "localhost", # PostgreSQL 服务器地址,本地默认 localhost
"port": 5432, # 默认端口
"database": "postgres", # 数据库名称(请先在pgAdmin里创建好)
"user": "postgres", # 用户名
"password": "postgres" # 密码
}
# ------------------------------------------
def get_db_connection():
"""建立与PostgreSQL的连接"""
try:
conn = psycopg2.connect(**DB_CONFIG)
return conn
except Exception as e:
print(f"数据库连接失败: {e}")
return None
def init_db():
"""初始化:创建一张数据表(如果表不存在)"""
conn = get_db_connection()
if not conn:
return
cursor = conn.cursor()
# SQL语句:创建一张名为 received_data 的表
#no 自增,wendu 温度,shidu 湿度,created_datetime 记录时间
create_table_sql = """
CREATE TABLE IF NOT EXISTS t1 (
id BIGSERIAL PRIMARY KEY,
wendu TEXT NOT NULL,
shidu TEXT NOT NULL,
created_datetime TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
"""
try:
cursor.execute(create_table_sql)
conn.commit()
print("数据库表初始化完成")
except Exception as e:
print(f"建表失败: {e}")
finally:
cursor.close()
conn.close()
# 启动时执行一次建表
init_db()
# --- 3. 核心功能:接收数据并保存 ---
@app.route('/submit', methods=['POST'])
def handle_submit():
"""
接收前端传来的数据(支持表单和JSON),存入PostgreSQL
"""
conn = get_db_connection()
if not conn:
return jsonify({"status": "error", "message": "服务器数据库连接错误"}), 500
cursor = conn.cursor()
# 尝试获取数据(兼容两种常见请求格式)
wendu = None
shidu = None
# 情况1:客户端发送的是 JSON (application/json)
if request.is_json:
json_data = request.get_json()
# 假设JSON格式为 {"wendu": "温度数据", "shidu": "湿度数据"}
wendu = json_data.get('wendu')
shidu = json_data.get('shidu')
else:
# 情况2:客户端发送的是普通表单 (application/x-www-form-urlencoded)
# 假设表单字段名为 'wendu', 'shidu'
wendu = request.form.get('wendu')
shidu = json_data.get('shidu')
# 数据验证:确保不为空
if not wendu:
return jsonify({"status": "error", "message": "温度数据不能为空"}), 400
if not shidu:
return jsonify({"status": "error", "message": "湿度数据不能为空"}), 400
try:
# 执行插入操作
# 使用参数化查询 %s 防止SQL注入攻击 [citation:10]
insert_sql = "INSERT INTO t1 (wendu, shidu) VALUES (%s,%s) RETURNING id;"
cursor.execute(insert_sql, (wendu,shidu))
# 获取新插入记录的自增ID
new_id = cursor.fetchone()[0]
# 提交事务(这一步非常重要,否则数据不会真正存到硬盘)[citation:10]
conn.commit()
print(f"数据保存成功,ID: {new_id},内容: {wendu},{shidu}")
return jsonify({
"status": "success",
"message": "数据接收并保存成功",
"saved_id": new_id
}), 201
except Exception as e:
# 如果发生错误,回滚事务,撤销本次操作
conn.rollback()
print(f"数据库写入错误: {e}")
return jsonify({"status": "error", "message": f"存储失败: {str(e)}"}), 500
finally:
cursor.close()
conn.close()
# --- 4. 根路径测试,验证服务是否正常 ---
@app.route('/', methods=['GET'])
def index():
return "Flask 服务已启动!请使用 POST 方法请求 /submit 接口。"
# --- 5. 启动服务器 ---
if __name__ == '__main__':
# debug=True 方便开发调试,修改代码后自动重启
# host='0.0.0.0' 允许局域网内其他设备访问
app.run(host='0.0.0.0', port=5000, debug=True)代码以UTF8方式存储。
三、开放端口
程序中使用了端口5000,因此需要在防火墙中开放这个端口。打开防火墙设置,建立新的入站规则:






四、执行代码
python app.py
五、检查数据库中该表(t1)是否被建立

如果没建立,根据提示修改代码后,重新执行
六、测试上传数据
执行以下代码:
curl -X POST http://127.0.0.1:5000/submit -H "Content-Type: application/json" -d "{\"wendu\":\"25.6\",\"shidu\":\"54\"}"注意观察返回信息,出现“success”,表示成功

七、检查数据库中是否已经追加了这条数据

至此,测试完成。
八、总结
python语言,相对于java、C等语言,无论编写还是测试,由于大量库的支持,都是非常方便的,代码也简洁,不需要启动专门的IDE。灵活、好用。
我要赚赏金
