烧瓶REST API记录发送器';IP地址

烧瓶REST API记录发送器';IP地址,rest,flask,sqlalchemy,flask-sqlalchemy,flask-restful,Rest,Flask,Sqlalchemy,Flask Sqlalchemy,Flask Restful,我使用Flask、SQLAlchemy和棉花糖创建了一个最小的RESTAPI。下面是app.py文件: from flask import Flask, request, jsonify from flask_sqlalchemy import SQLAlchemy from flask_marshmallow import Marshmallow import os # Initialize App app = Flask(__name__) basedir = os.path.abspat

我使用Flask、SQLAlchemy和棉花糖创建了一个最小的RESTAPI。下面是
app.py
文件:

from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow
import os

# Initialize App
app = Flask(__name__)
basedir = os.path.abspath(os.path.dirname(__file__))

# Database Setup
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'db.sqlite')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# Init db
db = SQLAlchemy(app)
# Init marshmallow
ma = Marshmallow(app)


# Product Class/Model
class Product(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100), unique=True)
    description = db.Column(db.String(200))
    price = db.Column(db.Float)
    qty = db.Column(db.Integer)

    def __init__(self, name, description, price, qty):
        self.name = name
        self.description = description
        self.price = price
        self.qty = qty


# Product Schema
class ProductSchema(ma.Schema):
    class Meta:
        fields = ('id', 'name', 'description', 'price', 'qty')


# Init Schema
product_schema = ProductSchema()
products_schema = ProductSchema(many=True)


# Create Product
@app.route('/product', methods=['POST'])
def add_product():
    name = request.json['name']
    description = request.json['description']
    price = request.json['price']
    qty = request.json['qty']

    new_product = Product(name, description, price, qty)

    db.session.add(new_product)
    db.session.commit()

    return product_schema.jsonify(new_product)


# Get All Products
@app.route('/receive', methods=['GET'])
def get_products():
    all_products = Product.query.all()
    result = products_schema.dump(all_products)
    return jsonify(result)


# Run the Server
if __name__ == '__main__':
    app.run(debug=True)
我想通过
GET
方法提取发送者的IP地址。但是,发送方的IP不需要是JSON负载的一部分

示例:POST

{
    "name": "Product 1",
    "description": "This is product 1",
    "price": 120.00,
    "qty": 100
}
得到

{
“ip”:”
“名称”:“产品1”,
“说明”:“这是产品1”,
“价格”:120.00,
“数量”:100
}

如何在代码中实现此功能?我尝试使用
请求。remote\u addr
,但我没有得到我期望的结果。

在返回响应之前,您可以在GET路由中以任何方式修改响应,在序列化db结果之后,我将请求的IP添加到响应中,如下所示:

# Get All Products
@app.route('/receive', methods=['GET'])
def get_products():
    all_products = Product.query.all()
    results = products_schema.dump(all_products)
    for product in results
        product.update({"ip": str(request.remote_addr)})
    return jsonify(results)

request.remote\u addr有什么问题?这就是我使用的,我得到了正确的IP、本地、生产等。。。您是否尝试过使用request.user\u代理对其进行双重检查?通过这种方式,您可能会认识到请求不是来自正确的源代码好的,这很好,但是我如何按照问题描述的方式在代码中实现它。基本上,您想将GET请求的IP添加到GET响应中吗?是,因此,当我发送GET请求时,输出将以问题中所示的JSON格式抛出。当使用它运行时
result.update({“ip”:str(request.remote\u addr)})
抛出错误:
AttributeError:'list'对象没有属性“update”
哦,是的,我猜您正在返回多个产品(“产品列表”,从而解释更新失败的原因)。这正是我建议将产品详细信息与您想要返回的IP分开的原因。或者,您必须遍历所有产品,并使用.update()函数将IP分别添加到每个产品中。update将向现有字典(一个产品)中添加一个键值对。我编辑了我的答案,这样你就可以循环浏览所有的产品(一个列表,来自你的数据库),它将IP添加到所有的产品中。
# Get All Products
@app.route('/receive', methods=['GET'])
def get_products():
    all_products = Product.query.all()
    results = products_schema.dump(all_products)
    for product in results
        product.update({"ip": str(request.remote_addr)})
    return jsonify(results)