Создание или обновление связанного объекта модели с помощью команды управления Django
Мне нужно периодически проверять состояние списка урлов и сообщать об их состоянии. Я создал 2 модели, одна из которых содержит список основных урлов, а другая - все подссылки на страницах основного урла.
Модель 1
class Site(CreationModificationDateBase, SoftDeletionModel):
uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.CharField(max_length=250, unique=True)
category = models.ForeignKey(Category, on_delete=models.DO_NOTHING)
url = models.URLField(unique=True)
status_code = models.CharField(max_length=3, blank=True, default="")
status_message = models.CharField(max_length=255, blank=True, default="")
def __str__(self):
return f'{self.name}'
Модель 2
class Link(CreationModificationDateBase, SoftDeletionModel):
uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
site = models.ForeignKey(Site, on_delete=models.DO_NOTHING, blank=True, null=True)
url = models.CharField(blank=True, max_length=250, default="")
status_code = models.CharField('Site Status', max_length=3, blank=True, default="")
status_message = models.CharField(max_length=255, blank=True, default="")
def __str__(self):
return f'{self.url}'
class Meta:
ordering = ('url',)
verbose_name = "link"
verbose_name_plural = "links"
У меня есть метод на Model1, который возвращает код состояния и сообщение из ListView при загрузке.
def get_links(self):
data = requests.get(self.url).text
soup = BeautifulSoup(data, features="html.parser")
anchors = soup.find_all("a")
links = []
links_status = []
for link in anchors:
link_href = link.get("href")
if f"https" in link_href:
links.append(link_href)
elif f"http" in link_href:
links.append(link_href)
elif f"/" in link_href and len(link_href) > 1 and self.url not in link_href:
links.append(self.url + link_href)
for ll in links:
try:
status_code = requests.head(ll, allow_redirects=True).status_code
status_reason = requests.head(ll, allow_redirects=True).reason
links_status.append((ll, status_code, status_reason))
except requests.exceptions.ConnectionError as e:
links_status.append((ll, 999, e))
return links_status
Я могу сохранить код состояния и сообщение в базу данных с помощью этой команды управления.
class Command(BaseCommand):
help = (
"Updates the status code and message of each site"
)
def handle(self, *args, **options):
qs = Site.objects.all()
for site in qs:
try:
sc = requests.head(site.url, allow_redirects=True).status_code
sr = requests.head(site.url, allow_redirects=True).reason
print(site.url, sc, sr)
except requests.exceptions.ConnectionError:
sc = 999
sr = "Connection Error"
site.status_code = sc
site.status_message = sr
site.save()
Я хочу знать, как я могу сохранить ссылки на страницы, которые я отбраковал с помощью beatifulsoup, в базу данных и сообщить об их состоянии, а также сделать так, чтобы эта команда выполнялась автоматически каждую неделю.