fastapi获取访客真实ip

929次阅读
没有评论

最近一时兴起想好好搞一下我的 API 项目,用的自然是 python 的 fastapi 库。没做几个 API 就想到个问题:我怎么知道我的 API 有没有人用?解决方案当然就是统计一下 API 调用次数啦。网上搜了一下貌似没有 fastapi 简单可行的统计方案,没办法只能自己写了。那么首先我需要知道访客的 ip,这样相当于有个 key,也可以大致了解调用情况。去 fastapi 文档上查了一下,有相关代码!

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}

赶紧复制到 python 里试试效果,没想到,它给我返回 127.0.0.1?我想让它给我返回用户的真实 ip 而不是 本地 ip 啊。想必部署到服务器上显示的也是服务端的 ip 吧,试了一下果然如此。

那没办法了,万事不决求助 Google。很快在 Stack Overflow 上找到了类似的提问,整合了一下几个回答,终于摸索出了解决方案。具体来说分为三步:

首先使用 nginx 进行反代,因为我这个项目本身就是用的 nginx 所以这一步跳过。

然后修改 nginx 的配置文件如下:

server {
# the port your site will be served on
listen 80;
# the domain name it will serve for
server_name <your_host_name>; # substitute your machine's IP address or FQDN

# add_header Access-Control-Allow-Origin *;
# add_header Access-Control-Allow-Credentials: true;
add_header Access-Control-Allow-Headers Content-Type,XFILENAME,XFILECATEGORY,XFILESIZE;
add_header access-control-allow-headers authorization;
# Finally, send all non-media requests to the Django server.
location / {
proxy_pass http://127.0.0.1:8000/; # the uvicorn server address
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}本人小白,只会用宝塔,同样用宝塔的同学可以在反向代理中找到配置文件,不过宝塔的反代貌似不用做任何修改。反正我是这一步也跳过了。

最后,也是最重要的一步,使用 uvicorn 启动服务,但是要加上 --proxy-headers --forwarded-allow-ips='*',也即:

uvicorn main:app --host 0.0.0.0 --port 8000 --proxy-headers --forwarded-allow-ips='*'

这样就可以成功获取访客 ip 啦。但是测试下来,我另外一个网站调用的这个 API,打开网站时日志输出的是我电脑的 ip,而非网站服务器的 ip,目前仍然不知道解决方案……

Read More 

正文完
可以使用微信扫码关注公众号(ID:xzluomor)
post-qrcode
 
评论(没有评论)
Generated by Feedzy