这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » python下建立网站,连接postgresql数据库及提交数据

共1条 1/1 1 跳转至

python下建立网站,连接postgresql数据库及提交数据

专家
2026-06-08 14:30:37     打赏

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,因此需要在防火墙中开放这个端口。打开防火墙设置,建立新的入站规则:

图片6.png

四、执行代码

python app.py

五、检查数据库中该表(t1)是否被建立

图片8.png

如果没建立,根据提示修改代码后,重新执行

六、测试上传数据

执行以下代码:

curl -X POST http://127.0.0.1:5000/submit -H "Content-Type: application/json" -d "{\"wendu\":\"25.6\",\"shidu\":\"54\"}"

注意观察返回信息,出现“success”,表示成功

图片9.png

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

图片10.png

至此,测试完成。

八、总结

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



共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]