Django / Python - Нежелательное кэширование экземпляров в views.py - PullRequest
0 голосов
/ 02 мая 2018

У меня проблема со страницей, работающей на Django 2.1. Моя проблема в том, что когда вызывается функция из views.py для заполнения шаблона, экземпляр класса кажется кэшированным. Каждый последующий вызов этой функции / каждое обновление этой страницы показывает старые данные за предыдущий раз, когда эта страница / функция была вызвана.

Код, о котором идет речь:

projectroot / MyApp / шаблоны / MyApp / bar.html

#this is bar.html
{{ MyTable.DataColumns }}
<br>
{{ MyTable.DataRows }}

projectroot / MyApp / views.py

#this is a relevant snippet from views.py
#There isn't anything outside of the functions, 
#with imports being the exception to this rule

import myownpackage.DataTable import DataTable

def list_page(request):
    template = 'foo/bar.html'

    connection = a_connection_here
    query_results = connection.get_query_results(sql_query_here)
    list_of_rows = [x for x in query_results]
    dt = DataTable()
    dt.DataColumns = [list_of_columns_here]
    for each_row in list_of_rows:
        dt.add(each_row)

    return_dict = {"MyTable": dt}

    return render(request, template, return_dict)

projectroot / myownpackage / DataTable.py

class DataTable:

    DataColumns = []
    DataRows = []

    def add(self, data_row):
        if len(self.DataColumns) != len(data_row):
            raise IndexError("Target column count does not match DataTable's DataColumn count.")
        else:
            self.DataRows.append(data_row)

    def remove(self, index):
        self.DataRows.remove(index)

При первой загрузке этой страницы, foo / bar.html кажется именно тем, что я хочу. Я вижу столбцы, напечатанные на странице, и несколько строк в этой таблице. Проблема видна, если вы обновите страницу. Это как если бы dt кэшировалось после того, как функция вернула render ().

Когда вы обновите страницу, вы увидите столбцы и строки из первого запроса, дублированные! Если мы обновим в третий раз, мы увидим третий набор тех же строк! Это добавление DataTable продолжается столько раз, сколько вы обновляете. Ясно, что dt сохраняется вне этой функции после создания экземпляра внутри функции, и я не уверен, почему или как это происходит.

ПРИМЕЧАНИЕ: только строки добавляются снова и снова. Столбцы остаются прежними. Это связано с тем, что столбцы устанавливаются в таблице, а строки добавляются .

Вещи, которые я пробовал:

После того, как dt назначено этому return_dict, я попытался dt = Нет и del dt . Ничего из этого не помогло, и при обновлении страницы были показаны те же результаты.

Мои вопросы к переполнению стека:

Почему экземпляр DataTable с именем dt не удаляется после возврата из функции?

Если это (по какой бы то ни было причине) нормально, что я могу сделать, чтобы уничтожить этот экземпляр DataTable, когда я закончу с ним?

1 Ответ

0 голосов
/ 02 мая 2018

Оказывается, проблема в том, что DataRows были статическими в классе DataTable. Этот класс должен выглядеть так:

class DataTable:

    def __init__(self):
        self.DataColumns = []
        self.DataRows = []
...