rest - Flask REST API 记录发送者的 IP 地址
问题描述
我使用 Flask、SQLAlchemy 和 Marshmallow 创建了一个最小的 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, 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 有效负载的一部分。
示例:发布
{
"name": "Product 1",
"description": "This is product 1",
"price": 120.00,
"qty": 100
}
得到
{
"ip": "<whatever-the-ip>"
"name": "Product 1",
"description": "This is product 1",
"price": 120.00,
"qty": 100
}
如何在我的代码中实现此功能?我尝试使用request.remote_addr
,但没有得到预期的结果。
解决方案
您可以在返回之前以任何方式修改 GET 路由中的响应,我在序列化数据库结果后将请求的 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)
推荐阅读
- asp.net - Azure 服务器上的 Web 套接字连接失败
- spartacus-storefront - Spartacus 4.0.0 - “OutletPosition”类型上不存在“BEFORE”属性
- reactjs - Spring Cloud Gateway Webflux Okta
- mysql - 创建的模型未显示在 Django Atomic Trasaction 块中
- google-colaboratory - Google Colab yolov3 暗网停止从“插入暗网目录”加载权重完成!学习率:0.001,动量:0.9,衰减:0.0005
- python - 为什么交叉函数没有显示正确的结果?
- javascript - 将全局状态添加到我的 VueJS 应用程序
- android - Flutter 如何将一行中具有相同列的数据获取到卡片中?
- unity3d - Unity 如何记住特定的游戏对象
- javascript - 在 JS 中执行完另一个异步函数后,如何执行异步函数?