Как использовать django_tables2 для фильтрации таблицы, содержащей данные, которые не приходят из модели Django - PullRequest
0 голосов
/ 03 июля 2019

Я новичок в 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...