Мне пришлось решить проблему «Поясните, является ли IP-адрес локальным или нет», и я сначала подумал о том, чтобы создать список IP-адресов, которые были локальными, а затем сопоставлены с ним. Вот что привело меня к этому вопросу. Тем не менее, я позже понял, что есть более прямой способ сделать это: попробуйте связать на этом IP-адресе и посмотреть, работает ли он.
_local_ip_cache = []
_nonlocal_ip_cache = []
def ip_islocal(ip):
if ip in _local_ip_cache:
return True
if ip in _nonlocal_ip_cache:
return False
s = socket.socket()
try:
try:
s.bind((ip, 0))
except socket.error, e:
if e.args[0] == errno.EADDRNOTAVAIL:
_nonlocal_ip_cache.append(ip)
return False
else:
raise
finally:
s.close()
_local_ip_cache.append(ip)
return True
Я знаю, что это не отвечает на вопрос напрямую, но это должен быть полезен любому, кто пытается решить соответствующий вопрос и кто следит за тем же путем. Преимущество этого кросс-платформенного решения (я думаю).
Это не так просто сделать, но есть сценарий, который может вам помочь. Я обычно использую FileSaver.js , чтобы сделать это, это с открытым исходным кодом. FileSaver помогает решить проблемы несовместимости браузера, он также хорошо протестирован.
Вот фрагмент кода, который я поднял из моего текущего проекта. Это простой javascript и не требует jQuery или чего-либо еще.
В этом примере имя файла жестко закодировано как «my_excel_file.xlsx», но вы можете получить имя файла из API, если выставите правильный заголовок из API. Я думаю, что ответил, как справиться с этим где-то в SO.
<html>
<head>
<script src="FileSaver.min.js"></script>
<script>
function download() {
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://your.url", true);
xhr.setRequestHeader("Content-type","application/json");
xhr.setRequestHeader("Access-Control-Allow-Origin", "*");
xhr.setRequestHeader("Accept", "application/octet-stream");
//xhr.setRequestHeader("Authorization", "Bearer ......");
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
var blob = new Blob([xhr.response], {type: "octet/stream"});
var fileName = "my_excel_file.xlsx";
saveAs(blob, fileName);
}
}
xhr.responseType = "arraybuffer";
xhr.send();
}
</script>
</head>
<body>
<button onclick="javascript:download()">Download Excel File</button>
</body>
</html>