我正在创建一个网站,用户可以使用该网站登录和下载文件 烧瓶微框架 (基于 Werkzeug)使用Python(我的情况下为2.6)。

当用户登录时,我需要获取IP地址(出于记录目的)。有谁知道如何做到这一点?当然有一种方法可以与Python一起做吗?

有帮助吗?

解决方案

查看文档 如何访问请求对象 然后从同一请求对象中获取属性 remote_addr.

代码示例

from flask import request
from flask import jsonify

@app.route("/get_my_ip", methods=["GET"])
def get_my_ip():
    return jsonify({'ip': request.remote_addr}), 200

有关更多信息,请参见 Werkzeug文档.

其他提示

代理可以使这一点变得有些棘手,请确保退房 proxyfix (烧瓶文档)如果您使用的是。看一眼 request.environ 在您的特定环境中。使用nginx,我有时会做这样的事情:

from flask import request   
request.environ.get('HTTP_X_REAL_IP', request.remote_addr)   

当代理(例如nginx)远期地址时,它们通常在请求标题中的某个地方包含原始IP。

更新 请参阅烧瓶安全实现. 。同样,在实施之前查看有关ProxyFix的文档。您的解决方案可能会根据您的特定环境而异。

实际上,您会发现的是,仅仅获得以下内容将为您提供服务器的地址:

request.remote_addr

如果您想要客户端IP地址,请使用以下内容:

request.environ['REMOTE_ADDR']

可以使用以下片段检索用户的IP地址:

from flask import request
print(request.remote_addr)

我有 nginx 以及以下 nginx配置:

server {
    listen 80;
    server_name xxxxxx;
    location / {
               proxy_set_header   Host                 $host;
               proxy_set_header   X-Real-IP            $remote_addr;
               proxy_set_header   X-Forwarded-For      $proxy_add_x_forwarded_for;
               proxy_set_header   X-Forwarded-Proto    $scheme;

               proxy_pass http://x.x.x.x:8000;
        }
}

@tirtha-r 解决方案对我有用

#!flask/bin/python
from flask import Flask, jsonify, request
app = Flask(__name__)

@app.route('/', methods=['GET'])
def get_tasks():
    if request.environ.get('HTTP_X_FORWARDED_FOR') is None:
        return jsonify({'ip': request.environ['REMOTE_ADDR']}), 200
    else:
        return jsonify({'ip': request.environ['HTTP_X_FORWARDED_FOR']}), 200

if __name__ == '__main__':
    app.run(debug=True,host='0.0.0.0', port=8000)

我的要求和回应:

curl -X GET http://test.api

{
    "ip": "Client Ip......"
}

httpbin.org 使用此方法:

return jsonify(origin=request.headers.get('X-Forwarded-For', request.remote_addr))

以下代码始终为客户端提供公共IP(而不是代理背后的私有IP)。

from flask import request

if request.environ.get('HTTP_X_FORWARDED_FOR') is None:
    print(request.environ['REMOTE_ADDR'])
else:
    print(request.environ['HTTP_X_FORWARDED_FOR']) # if behind a proxy

这应该做这项工作。它提供客户端IP地址(远程主机)。

请注意,此代码在服务器端运行。

from mod_python import apache

req.get_remote_host(apache.REMOTE_NOLOOKUP)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top