Как мы вызываем функцию каждый раз, когда конечная точка API вызывается в Django - PullRequest
0 голосов
/ 27 июня 2018

На моем сервере Django есть API для отдыха, через который мы сохраняем значения в базе данных. Если имя существует в базе данных, тогда я обновлю значение, иначе создам новое значение и имя. Код для функции приведен ниже:

def getIgnitionData():
    name_list =[]
    value_list =[]
    cursor = connections['ignition'].cursor()
    cursor.execute('SELECT * FROM MDA_table')
    value = cursor.fetchall()
    cursor.execute('SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = \'MDA_table\'')
    name = cursor.fetchall()

    for i in name:
        name_list.append(str(i[0]))


    for row in value:
        for j in row:
            value_list.append(str(j))

    cursor.close()
    print name_list
    print value

    #Here we will check to see if the variable exists. If so, update the value. If not,
    #then create a new variable.
    for k in range(0,len(name_list)):
        if (Ignition.objects.filter(name = name_list[k]).exists()):
            Ignition.objects.filter(name=name_list[k]).update(value = value_list[k])
        else:
            Ignition.objects.create(name=name_list[k], value=value_list[k])

view_api.py выглядит следующим образом:

class IgnitionViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows to view variables from the ignition database.
    """
    serializer_class = IgnitionSerializer
    #queryset = ignition.objects.all()
    permission_classes = [HasGroupPermission]
    required_groups = {
        'GET': ['Admin', 'Facility', 'Operator'],
        'PUT': [],
        'POST': [],
    }
    ignition.getIgnitionData() # This is where we are calling the function 
    def get_queryset(self):
        return Ignition.objects.all()

Код работает хорошо, когда я запускаю запрос get в первый раз из браузера, но затем, если я обновляю значения в базе данных, не перезагружая сервер, он даже не печатает name_list (что означает, что он не ' не называй код). Если я перезагружу сервер и получу доступ к конечной точке, он получит обновленные значения. Это не практично, хотя.

Я хотел, чтобы при вызове конечной точки API она получала обновленные значения из базы данных, чтобы мне не приходилось каждый раз перезагружать сервер. Заранее спасибо.

1 Ответ

0 голосов
/ 27 июня 2018

Вы можете переопределить dispatch() метод, который вызывается при каждом использовании вашего представления:

class IgnitionViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows to view variables from the ignition database.
    """
    serializer_class = IgnitionSerializer
    #queryset = ignition.objects.all()
    permission_classes = [HasGroupPermission]
    required_groups = {
        'GET': ['Admin', 'Facility', 'Operator'],
        'PUT': [],
        'POST': [],
    }

    def dispatch(self, request, *args, **kwargs):
        ignition.getIgnitionData() # This is where we are calling the function 
        return super(IgnitionViewSet, self).dispatch(request, *args, **kwargs)

    def get_queryset(self):
        return Ignition.objects.all()
...