Сани c: разница между request.ip и request.remote_addr? - PullRequest
1 голос
/ 14 апреля 2020

Чем отличаются атрибуты ip a remote_addr запроса Sani c?

Исходный код Sani c framework :

@property
def ip(self):
    """
    :return: peer ip of the socket
    """
    if not hasattr(self, "_socket"):
        self._get_address()
    return self._ip


@property
def remote_addr(self):
    """Attempt to return the original client ip based on `forwarded`,
    `x-forwarded-for` or `x-real-ip`. If HTTP headers are unavailable or
    untrusted, returns an empty string.

    :return: original client ip.
    """
    if not hasattr(self, "_remote_addr"):
        self._remote_addr = self.forwarded.get("for", "")
    return self._remote_addr

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

request.ip показывает только адрес, напрямую соединяющий Sani c, а request.remote_addr показывает только удаленный адрес, предоставленный прокси-сервером (например, если вы отстаете от Nginx). Вы должны выбрать один из них в зависимости от того, работает ли ваше приложение за прокси-сервером или нет. Чтобы поддерживать оба, используйте

user_ip = request.remote_addr or request.ip
1 голос
/ 14 апреля 2020

Некоторые прокси или балансировщики нагрузки могут скрывать исходный ip клиента. Упомянутые заголовки могут хранить это значение.

Например, см. Документацию для X-Forwarded-For заголовок

...