Я новичок в Python и Django. Я создаю веб-приложение, которое предоставляет некоторую часть HTTP API одной из систем безопасности моей компании. Оболочка для API я храню в файле ReducedHXAPI.py. Единственные данные, которые я храню в БД, - это IP-адрес Системы безопасности и данные аутентификации, используемые для входа в API. Я успешно создал код, который показывает сортируемый список хостов, зарегистрированных в компании Security System.
Сейчас я пытаюсь реализовать экспорт созданного списка хостов и включить встроенный фильтр для столбцов. К сожалению все мои попытки (основанные на учебниках и документах на: https://django -tables2.readthedocs.io / en / latest / index.html и https://django -filter.readthedocs.io / en / master / ) выдаёт только ошибки. Может ли кто-нибудь помочь мне в его создании и понимании философии django_tables2 и django_filters, пожалуйста?
models.py:
from django.db import models
class ServerConnection(models.Model):
ConnectionName = models.CharField('Connection Name',
max_length=200,
help_text="Enter name for this connection")
ServerAddress = models.CharField('Server Address',
max_length=200,
help_text="Enter name or IP address of FireEye HX console")
APIUser = models.CharField('API User',
max_length=200,
help_text="Enter name of user who has access to API")
APIPassword = models.CharField('API Password',
max_length=200,
help_text="Enter name of user who has access to API")
def __str__(self):
"""String for representing the Model object (in Admin site etc.)"""
return self.ConnectionName
=============================================== =============
views.py (выдержка)
import django_tables2 as tables
from django.shortcuts import render
from .models import ServerConnection
from django import forms
from myapi.ReducedHXAPI import MyHXAPI
from django_tables2 import RequestConfig
active_connection = None
myhxconnection = None
hx_response = None
hostslist = None
hostname = None
hoststate = None
def HXAPI_host_states(c_state, c_queued):
# this function return string describing state of protected host/workstation.
# It is based on searching in a dictionary defined by me
def HXAPI_response_messages(request_type, message, id, name):
# this function parse HTTP code returned by API.
# both mentioned above functions are rather long and works fine, so I decided to not include their code.
# if somebody are interested in it, please let me know
class dict2obj(object):
def __init__(self, d):
for a, b in d.items():
if isinstance(b, (list, tuple)):
setattr(self, a, [dict2obj(x) if isinstance(x, dict) else x for x in b])
else:
setattr(self, a, dict2obj(b) if isinstance(b, dict) else b)
class HostsListTable(tables.Table):
hostname = tables.Column(linkify=('myapi:hostdetails', (tables.A('_id'), )))
primary_ip_address = tables.Column(verbose_name='IP Address')
last_audit_timestamp = tables.Column(verbose_name='Last Audit Timestamp')
last_alert_timestamp = tables.Column(verbose_name='Last Alert Timestamp')
host_state = tables.Column(empty_values=(),
linkify=('myapi:containmentaction',
(tables.A('_id'), ))
)
os_name = tables.Column(accessor='os.product_name',
verbose_name='OS Name'
)
def __init__(self, *args, **kwargs):
super(HostsListTable, self).__init__(*args, **kwargs)
def render_host_state(self,record):
hoststate = HXAPI_host_states(record.containment_state, record.containment_queued)
return hoststate
class Meta:
template_name = 'myapi/django_tables2/bootstrap.html'
def index(request):
global active_connection
global myhxconnection
global hx_response
global hostslist
active_connection = ServerConnection.objects.get(ConnectionName='MyHX')
myhxconnection = MyHXAPI(hx_host=active_connection.ServerAddress,
disable_certificate_verification=False,
CAcerts=CAcertfile)
hx_response = myhxconnection.restIsSessionValid()
request_type = 'login request'
if not hx_response:
hx_response = myhxconnection.restLogin(active_connection.APIUser,
active_connection.APIPassword)
li_success = hx_response[0]
li_raw_message = hx_response[1]
li_message = HXAPI_response_messages(request_type, hx_response[1], '', '')
else:
li_success = True
li_raw_message = 204
li_message = HXAPI_response_messages(request_type, hx_response[1], '', '')
if li_success:
hx_response = myhxconnection.restListHosts()
request_type = 'listofhosts request'
hl_success = hx_response[0]
hl_raw_message = hx_response[1]
hl_message = HXAPI_response_messages(request_type, hx_response[1], '', '')
if hx_response[0]:
hx_response_content = dict2obj(hx_response[2])
hostslist = hx_response_content.data.entries
hostslistcount = len(hostslist)
hostslisttable = HostsListTable(hostslist)
RequestConfig(request).configure(hostslisttable)
else:
hostslist = []
hostslistcount = 0
else:
hostslist = []
hostslistcount = 0
return render(
request,
'myapi/index.html',
context={
'li_success': li_success,
'li_raw_message': li_raw_message,
'li_message': li_message,
'hl_success': hl_success,
'hl_raw_message': hl_raw_message,
'hl_message': hl_message,
'HX_Server': active_connection.ServerAddress,
'API_user': active_connection.APIUser,
'CA_certificates_file': CAcertfile,
'Debug_log': log_file,
'hosts_list': hostslist,
'hostslisttable': hostslisttable,
'count_of_entries': len(hx_response_content.data.entries),
)
###################
import django_filters
from django_filters.views import FilterView
from django_tables2.views import SingleTableMixin
from django_tables2.export.views import ExportMixin
from django_tables2.export.export import TableExport
# all funcs and classes below does not work
class HostsFilter(django_filters.FilterSet):
hostname = django_filters.CharFilter(field_name='hostname',lookup_expr='icontains')
class FilteredHostsListView(SingleTableMixin, FilterView):
table_class = HostsListTable
filterset_class = HostsFilter
class TableView(ExportMixin, tables.SingleTableView):
table_class = HostsListTable
template_name = 'django_tables2/bootstrap.html'
def exporthostlist(request):
global hostslist
hostslisttable = HostsListTable
RequestConfig(request).configure(hostslisttable)
export_format = request.GET.get('_export', None)
if TableExport.is_valid_format(export_format):
exporter = TableExport(export_format, hostslisttable)
return exporter.response('hostslisttable.{}'.format(export_format))
return render(
request,
'myapi/exporthostlist.html',
context={
'table': hostslisttable
}
)
Пример 1. Я пытаюсь использовать класс FilteredHostsListView в методе index (request) путем замены строки
hostslisttable = HostsListTable(hostslist)
с
hostslisttable = FilteredHostsListView(hostslist)
Я получаю следующее сообщение об ошибке:
TypeError at / myapi / test /
init () принимает 1 позиционный аргумент, но 2 получили
Метод запроса: GET URL запроса: http://127.0.0.1:8000/myapi/test/
Версия Django: 2.2.1 Тип исключения: TypeError Значение исключения:
init () принимает 1 позиционный аргумент, но 2 получили
Место исключения:
C: \ Py-Devel \ DjangoProjects \ fehxsite \ myapi \ views.py в index2, строка
629 Python Исполняемый файл: C: \ Program Files \ Python37 \ python.exe Python
Версия: 3.7.3 Python Path:
['C: \ Py-Devel \ DjangoProjects \ fehxsite', 'C: \ Program
Файлы \ Python37 \ python37.zip ',' C: \ Program Files \ Python37 \ DLLs ',
'C: \ Program Files \ Python37 \ lib', 'C: \ Program Files \ Python37',
'C: \ Program Files \ Python37 \ lib \ site-packages', 'C: \ Program
Файлы \ Python37 \ lib \ site-packages \ odf ',' C: \ Program
Файлы \ Python37 \ lib \ site-packages \ odf ',' C: \ Program
Файлы \ Python37 \ lib \ site-packages \ odf ',' C: \ Program
Файлы \ Python37 \ lib \ site-packages \ odf ',' C: \ Program
Файлы \ Python37 \ lib \ site-packages \ odf ',' C: \ Program
Файлы \ Python37 \ lib \ site-packages \ odf ',' C: \ Program
Файлы \ Python37 \ Lib \ сайт-пакеты \ ODF ']
Время сервера: ср., 3 июля 2019 г. 11:03:31 +0200
когда я меняю строку на
hostslisttable = FilteredHostsListView
Я получил еще одну ошибку - думаю, это ожидается, потому что я должен передать источник данных в класс FilteredHostsListView.
Сообщение об ошибке:
Ошибка атрибута в / myapi / test /
Объект 'list' не имеет атрибута 'model'
Метод запроса: GET URL запроса: http://127.0.0.1:8000/myapi/test/
Версия Django: 2.2.1 Тип исключения: Исключение AttributeError
Значение:
объект 'list' не имеет атрибута 'model'
Расположение исключения: C: \ Program
Файлы \ Python37 \ lib \ site-packages \ django_filters \ filterset.py в
init , строка 187 Исполняемый файл Python: C: \ Program Files \ Python37 \ python.exe Версия Python: 3.7.3 Путь к Python:
['C: \ Py-Devel \ DjangoProjects \ fehxsite', 'C: \ Program
Файлы \ Python37 \ python37.zip ',' C: \ Program Files \ Python37 \ DLLs ',
'C: \ Program Files \ Python37 \ lib', 'C: \ Program Files \ Python37',
'C: \ Program Files \ Python37 \ lib \ site-packages', 'C: \ Program
Файлы \ Python37 \ lib \ site-packages \ odf ',' C: \ Program
Файлы \ Python37 \ lib \ site-packages \ odf ',' C: \ Program
Файлы \ Python37 \ lib \ site-packages \ odf ',' C: \ Program
Файлы \ Python37 \ lib \ site-packages \ odf ',' C: \ Program
Файлы \ Python37 \ lib \ site-packages \ odf ',' C: \ Program
Файлы \ Python37 \ lib \ site-packages \ odf ',' C: \ Program
Файлы \ Python37 \ Lib \ сайт-пакеты \ ODF ']
Время сервера: ср., 3 июля 2019 11:10:27 +0200
Та же ситуация, когда я пытался использовать класс TableView.