FastAPI (starlette) 获取客户端真实IP

新手上路,请多包涵

我在 FastAPI 上有一个 API,当他请求我的页面时,我需要获取客户端的真实 IP 地址。

我很想使用 starlette Request。但它返回我的服务器 IP,而不是客户端远程 IP。

我的代码:

 @app.post('/my-endpoint')
async def my_endpoint(stats: Stats, request: Request):
    ip = request.client.host
    print(ip)
    return {'status': 1, 'message': 'ok'}

我做错了什么?如何获得真实 IP(如 Flask 中的 request.remote_addr)?

原文由 Nataly Firstova 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 4.2k
2 个回答

request.client 应该可以工作,除非你在代理(例如nginx)后面运行,在这种情况下使用uvicorn 的 --proxy-headers 标志来接受这些传入的标头并确保代理转发它们。

原文由 Hedde van der Heide 发布,翻译遵循 CC BY-SA 4.0 许可协议

FastAPI using-request-directly 文档页面显示了这个例子:

 from fastapi import FastAPI, Request

app = FastAPI()

@app.get("/items/{item_id}")
def read_root(item_id: str, request: Request):
    client_host = request.client.host
    return {"client_host": client_host, "item_id": item_id}

有了这个例子,我就可以节省十分钟的时间来 讨论 Starlette 的 Request 类

原文由 harrolee 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题