
Envoyé par
Rudeus
Quand vous parlez de renvoyer un dict plutôt qu'une chaine de caractères concaténée, je dois créer ce dict au niveau de la fonction directement ?
C'est une question de choix. Personnellement, je garderais cette fonction telle quelle car elle est généraliste et réutilisable.
Mais on peut dans la foulée envelopper tout ça dans une fonction un peu plus spécialisée.
Mais comme les clés d'un dict doivent être uniques, je prônerais plutôt un list of tuples (ou une autre structure).
Si on fait ça en réutilisant la fonction dns_lookup:
1 2 3 4 5 6 7 8 9
| def get_records(domain_name: str, resource_types: list):
dns_records = []
for resource_type in resource_types:
for answer in dns_lookup(domain_name=domain_name, resource_type=resource_type):
dns_records.append((answer, resource_type))
return dns_records
domain_name = "google.fr"
print(get_records(domain_name=domain_name, resource_types=["A", "NS"])) |
On peut récupérer plusieurs types d'enregistrements à la fois et on obtient:
[('142.250.179.163', 'A'), ('ns1.google.com.', 'NS'), ('ns4.google.com.', 'NS'), ('ns3.google.com.', 'NS'), ('ns2.google.com.', 'NS')]
Mais alors le filtrage devient moins facile.
PS: on pourrait utiliser un namedtuple plutôt qu'un simple tuple.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import dns.resolver
from collections import namedtuple
def dns_lookup(domain_name: str, resource_type: str):
answers = dns.resolver.resolve(domain_name, resource_type)
return [rdata.to_text() for rdata in answers]
def get_records(domain_name: str, resource_types: list):
dns_records = []
DnsRecord = namedtuple("DnsRecord", ["RecordType", "Value"])
for resource_type in resource_types:
for answer in dns_lookup(domain_name=domain_name, resource_type=resource_type):
dns_records.append(DnsRecord(RecordType=resource_type, Value=answer))
return dns_records |
La réponse devient alors:
[DnsRecord(RecordType='A', Value='142.250.179.163'), DnsRecord(RecordType='NS', Value='ns3.google.com.'), DnsRecord(RecordType='NS', Value='ns2.google.com.'), DnsRecord(RecordType='NS', Value='ns1.google.com.'), DnsRecord(RecordType='NS', Value='ns4.google.com.')]
On peut filtrer les namedtuples avec un banal list comprehension:
1 2 3 4
| domain_name = "google.fr"
all_records = get_records(domain_name=domain_name, resource_types=["A", "NS"])
a_records = [item for item in all_records if item.RecordType == "A"]
ns_records = [item for item in all_records if item.RecordType == "NS"] |
NB: gestion d'exception nécessaire, car il n'y aura pas toujours de réponse.
Mais finalement on en revient un peu à la complexité d'origine. Il me semble plus simple dans votre cas d'appeler la fonction dns_lookup deux fois, récupérer deux listes distinctes et laisser à Django le soin de les afficher.
Partager