Выходной ping статус на шаблоне django - PullRequest
1 голос
/ 06 октября 2019

У меня есть модель, которая содержит доменные имена, которые мне нужно пропинговать. Мне удалось создать представление, но я не мог понять, как вывести его на шаблон.

def index(request, page):
  template = "home.html"
  if request.method == 'POST':
      csv_file = request.FILES['file']
      if not csv_file.name.endswith('.csv'):
          messages.error(request, 'Please upload a .csv file.')

      data_set = csv_file.read().decode('ISO-8859-1')
      io_string = io.StringIO(data_set)
      next(io_string)
      for column in csv.reader(io_string, delimiter=','):
          _, created = Table.objects.update_or_create(
              page=column[0],
              keyword=column[1],
              interval=column[2],
              email=column[3],
              notes=column[4],
              billing=column[5],
          )
  page_object = get_object_or_404(Table, page=page)
  try:
      subprocess.check_call(['ping', '-c', '1', page_object.page])
  except subprocess.CalledProcessError:
      host_online = False
  else:
      host_online = True
  context = {
      'tables': Table.objects.all(),
      'online': host_online,
      'page': page
  }
  return render(request, template, context)

модель

class Table(models.Model):
  page = models.URLField(verbose_name=None)

, и вот как я его вызываюшаблон

{% if online %}
  <i class="small material-icons green-text">check_circle</i>
{% else %}
  <i class="small material-icons red-text">close</i>
{% endif %}

Кто-нибудь может мне наставить? Возвращается data_upload() missing 1 required positional argument: 'page'

1 Ответ

2 голосов
/ 06 октября 2019

В вашем коде есть несколько проблем, которые делают его некорректным:

  • domain = Table.objects.filter(page) не удастся. Вы должны сделать domain = Table.objects.filter(page=page)
  • На самом деле вы не пропингуете домен, поскольку domain - это просто строка в вашем коде subprocess.check_call(['ping', '-c', '1', "domain"])
  • Вы не используете контекст: если вы хотитечтобы получить доступ к нему в шаблоне, вам нужно передать его вызову render: return render(request, 'home.html', context)

Более того, функция filter Django возвращает объект queryset,ни одной сущности.

Я предлагаю исправить ваш код следующим образом:

views.py

from django.shortcuts import get_object_or_404


def pingDomain(request, page):
  page_object = get_object_or_404(Table, page=page)
  try:
      subprocess.check_call(['ping', '-c', '1',  page_object.page])
  except subprocess.CalledProcessError:
      host_online = False
  else:
      host_online = True
  context = {
      'online': host_online
  }
  return render(request, 'home.html', context) 

И затем в вашем шаблонеВы можете просто получить к нему доступ с помощью клавиши online:

{{online}}
...