Flask беспокойное массовое удаление с использованием angularjs или javascript, возможно ли это?

Я хочу выполнить массовое удаление с помощью http-запроса angularjs, чтобы запустить беспокойный api версии 0.17.0. Я знаю, что могу делать это по одному, используя идентификатор записи в URL-адресе. Но я был бы рад, если это возможно в одном запросе. Я не уверен, возможно ли это

Бэкэнд Flask выглядит так:

manager.create_api(Messages,
     methods=['GET','PUT','DELETE'], 
     preprocessors = {"GET_MANY": [auth_func],
                    "GET_SINGLE": [auth_func],
                    "PUT_SINGLE":[auth_func],
                    "DELETE_SINGLE":[auth_func],
                    "DELETE_MANY":[auth_func] },
     allow_delete_many=True)

Мой код Angularjs выглядит так:

$scope.deleteMails = function(){
    //$scope.deleteMessage = [1,2,3] array of id to delete
    var create_filters = []      
    $scope.deleteMessage.forEach(ele => {            
        create_filters.push({"name": "id", "op": "equals", "val": ele.toString()})
    });        
    $http({
        method  : 'DELETE',
        headers: {'X-CSRFToken' : csrf }, 
        url     : '/api/tbl_messages',
        data : { q : {filters: create_filters} }    
    })
    .then(function(res){
        console.info(res)
    },function(res){
        console.info('error')
    })
}

Этот запрос завершен со статусом 200, но вся моя таблица в db удалена. Во всех случаях он удаляет всю мою БД (таблицу), а не конкретные идентификаторы. Я действительно не знаю, что здесь делать. Заранее большое спасибо за помощь.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
139
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Flask-restless хочет, чтобы фильтр передавался в строке запроса, а не как часть данных. Вот почему он удаляет все ваши данные. Это вообще не подбирает фильтр.

Как только это будет исправлено, у вас возникнет дополнительная проблема в самом фильтре. Вы отправляете это как свой фильтр:

[ 
  {'name': 'id', 'op': 'equals', 'val': 1},
  {'name': 'id', 'op': 'equals', 'val': 2}
]

Неугомонный запрос Flask считает что-то совпадающим, только если совпадают все фильтры. Другими словами, он объединяет их все с помощью и:

delete from message where id = 1 and id = 2

Вам либо нужно будет сказать flask-restless, что вы хотите 'или'

[
  { "or": [
      {"name": "id", "op": "equals", "val": 1},
      {"name": "id", "op": "equals", "val": 2}
  ] }
]

Или измените оператор фильтра на in:

  [  {"name": "id", "op": "in", "val": [1, 2] } ]

Попробуйте изменить свой код angular на (обратите внимание на изменение с данных на параметры):

$http({
    method  : 'DELETE',
    headers: {'X-CSRFToken' : csrf }, 
    url     : '/api/tbl_messages',
    params: { q : JSON.stringify({filters:[{or: create_filters}]}) }    
})

Или - может быть, немного проще - измените оператор на 'in', и вы сможете избавиться от forEach:

$http({
    method  : 'DELETE',
    headers: {'X-CSRFToken' : csrf }, 
    url     : '/api/tbl_messages',
    params: { q : JSON.stringify({filters:[{name:'id', op:'in', val: $scope.deleteMessage}]}) }    
})

Удивительный!!! Большое спасибо, это действительно работает. По документации не расшифровывал :) Спасибо

TomRavn 04.06.2018 11:55

Другие вопросы по теме