Flask REST API记录发送者的IP地址

问题描述

我使用Flask,sqlAlchemy和棉花糖创建了一个最小的REST API。这是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,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": "<whatever-the-ip>"
    "name": "Product 1","qty": 100
}

如何在代码中实现此功能?我尝试使用request.remote_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)