Python中使用Flask和PostgreSQL,在shell下操作正常但Postman请求无法返回数据的问题

小弟写的代码中因为有外键约束的原因,所以没有选择 mysql 而是 postgresql,在服务器的 flask shell 下可以正常的进行增删改查,数据库的连接正常。但是不明白为什么使用 postman 访问接口的时候是返回 Could not get any response。网上很多都是说 ssl 的问题,但是我的接口是有 ssl 证书的,之前用 sqlite 的时候也是可以正常访问接口的,只是出现了问题所以才换 postgresql。 还请了解的兄台解答,小弟先向解答的各位表示感谢。


Python中使用Flask和PostgreSQL,在shell下操作正常但Postman请求无法返回数据的问题

7 回复

我之后试了一下用 requests 库请求了一下服务器地址,发现被拒绝连接了。
>>> requests.get(‘https://www.danzzzz.xyz/’).status_code
Traceback (most recent call last):
File “/root/Python-3.6.1/www/venv/lib/python3.6/site-packages/urllib3/connection.py”, line 171, in _new_conn
(self._dns_host, self.port), self.timeout, **extra_kw)
File “/root/Python-3.6.1/www/venv/lib/python3.6/site-packages/urllib3/util/connection.py”, line 79, in create_connection
raise err
File “/root/Python-3.6.1/www/venv/lib/python3.6/site-packages/urllib3/util/connection.py”, line 69, in create_connection
sock.connect(sa)
ConnectionRefusedError: [Errno 111] Connection refused


我遇到过类似的问题,通常是因为Flask应用在shell环境和HTTP请求环境下的运行方式不同导致的。

最常见的原因是数据库连接没有正确配置或请求上下文问题。让我给你一个完整的解决方案:

from flask import Flask, jsonify
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.exc import SQLAlchemyError

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://username:password@localhost/dbname'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

@app.route('/users', methods=['GET'])
def get_users():
    try:
        # 确保在请求上下文中操作
        users = User.query.all()
        result = [{'id': u.id, 'username': u.username, 'email': u.email} for u in users]
        return jsonify(result)
    except SQLAlchemyError as e:
        return jsonify({'error': str(e)}), 500

# 关键点:确保应用上下文正确设置
@app.before_first_request
def create_tables():
    db.create_all()

if __name__ == '__main__':
    app.run(debug=True)

主要检查以下几点:

  1. 应用上下文问题:在shell中你可能手动创建了应用上下文,但Postman请求时没有。确保路由函数在正确的上下文中执行。

  2. 数据库连接配置:检查PostgreSQL连接字符串是否正确,特别是主机名、端口和数据库名。

  3. 请求超时:PostgreSQL连接可能需要更长时间,增加连接超时设置:

app.config['SQLALCHEMY_ENGINE_OPTIONS'] = {
    'pool_recycle': 300,
    'pool_pre_ping': True,
    'connect_args': {'connect_timeout': 10}
}
  1. CORS问题:如果前端和API不同源,需要配置CORS:
from flask_cors import CORS
CORS(app)
  1. 检查Postman设置:确保请求方法正确(GET/POST等),Content-Type设置为application/json。

在shell中测试时使用:

with app.app_context():
    users = User.query.all()
    print(users)

这样能模拟HTTP请求的上下文环境。

建议先用最简单的路由测试连接是否正常。

这还需要用 requests 试?
难道第一反应不是用浏览器试吗?

postman…只支持 http 吧…
postgresql 没有 http 的接口吧…

sorry 我孤陋寡闻了 Orz

没日志的化很难回答,网络问题千奇百怪

curl --insecure https://domain 试试看

接口测试工具客户端,我一般用 Advanced REST client,很好用

回到顶部