Задать вопрос
  • Непонятно расширяется шаблон в django, в чем может быть проблема?

    @mrkovalchuk Автор вопроса
    Junior developer
    В общем, ошибки пополам: 1. Из-за того, что не прописывался - вписал ручками в дочерний шаблон; 2. Из-за BOM-ов. Решилось пересозданием файлов в IDE.
    Ответ написан
    Комментировать
  • Как сохранить изображение в ImageField django?

    @mrkovalchuk Автор вопроса
    Junior developer
    Итак, подытожим. Рабочий вариант:

    news = NewsItem(**item)
            r = requests.get(news['image'])
            image = path.basename(urlparse(news['image']).path)
            buf = BytesIO()
            buf.write(r.content)
    
            news['image'] = File(buf, image)


    Получаем респонс, извлекаем имя изображения, создаем BytesIO объект, извлекаем контент и пишем его в буф, потом берем наш объект (scrapy item, созданный с помощью django-item) и приводим его к нужному формату, передавая буф и название. Потом просто сохраняем итем\объект news.save()

    Т.е. нам не хватало имя для файла
    Ответ написан
    Комментировать
  • Как правильно принять JSON от Ajax?

    @mrkovalchuk Автор вопроса
    Junior developer
    Проблема в json_decode, ничего не возвращает.

    data=["data:image/png;base64,iVBORw0KG...U5ErkJggg==","123","123","123"] - вот что пытаюсь декодить.
    Ответ написан
    Комментировать
  • Как решить проблему с подключением spring-Репозиториев?

    @mrkovalchuk Автор вопроса
    Junior developer
    см. Решение от Александр Косарев (выше)

    *****************************************************************************************************
    Проблему решил, но не уверен, насколько такой подход верен.

    Итак, теперь я в контроллере объявляю два сервиса, которые работают с репозиториями и сую их в ArduinoConfig через новосозданный конструктор (см. ниже).

    StartController
    package com.kovalchuk.server.controller;
    
    import com.kovalchuk.server.config.arduino.ArduinoConfig;
    import com.kovalchuk.server.entity.Room;
    import com.kovalchuk.server.services.interf.CommitService;
    import com.kovalchuk.server.services.interf.RoomService;
    import jssc.SerialPortException;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;
    
    @RestController
    public class StartController {
    
        @Autowired
        private RoomService roomService;
    
        @Autowired
        private CommitService commitService;
    
        @RequestMapping(value = "/start", method = RequestMethod.GET)
        @ResponseBody
        public void startArduinoScan() throws SerialPortException {
            //Попробуем завести наш АрдуиноКоннектер
            ArduinoConfig arduinoConfig = new ArduinoConfig(roomService,commitService);
            arduinoConfig.arduinoConnection();
        }  
    
    }


    В ArduinoConfig определяю Service как поля, и добавляют два Getter-а для них. Ну и да, конструктор соответствующий нарисовал.

    ArduinoConfig
    package com.kovalchuk.server.config.arduino;
    
    
    import com.kovalchuk.server.services.interf.CommitService;
    import com.kovalchuk.server.services.interf.RoomService;
    import jssc.SerialPort;
    import jssc.SerialPortException;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
    
    @Configuration
    @ComponentScan("com.kovalchuk.server")
    @EnableJpaRepositories("com.kovalchuk.server.repository")
    public class ArduinoConfig {
    
    
        private static SerialPort serialPort;
        private static RoomService roomService;
        private static CommitService commitService;
    
        public ArduinoConfig() {
        }
    
        public ArduinoConfig(RoomService roomService, CommitService commitService) {
            this.roomService = roomService;
            this.commitService = commitService;
        }
    
        public static RoomService getRoomService() {
            return roomService;
        }
    
        public static CommitService getCommitService() {
            return commitService;
        }
    
        public static SerialPort getSerialPort() {
            return serialPort;
        }
    
    
        public void arduinoConnection() throws SerialPortException {
            serialPort = new SerialPort("COM3");
    
            try{
                serialPort.openPort();
                serialPort.setParams(9600,8,1,0);
                serialPort.setEventsMask(SerialPort.MASK_RXCHAR);
                serialPort.addEventListener(new ArduinoEventsListener());
    
    
            }
            catch (SerialPortException ex){
                if (serialPort.isOpened()) serialPort.closePort();
            }
        }
    }


    И вот так преобразился ArduinoEventsListener, который, используя гетеры, получает наши Servic-ы для работы с БД.

    ArduinoEventsListener
    package com.kovalchuk.server.config.arduino;
    
    
    import com.kovalchuk.server.entity.Commit;
    import com.kovalchuk.server.entity.Room;
    import com.kovalchuk.server.services.interf.CommitService;
    import com.kovalchuk.server.services.interf.RoomService;
    import jssc.SerialPort;
    import jssc.SerialPortEvent;
    import jssc.SerialPortEventListener;
    import jssc.SerialPortException;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
    
    import java.util.Date;
    
    @ComponentScan("com.kovalchuk.server")
    @EnableJpaRepositories("com.kovalchuk.server.repository")
    public class ArduinoEventsListener implements SerialPortEventListener {
    
        private SerialPort serialPort = ArduinoConfig.getSerialPort();
        private RoomService roomService = ArduinoConfig.getRoomService();
        private CommitService commitService = ArduinoConfig.getCommitService();
    
    
    
        @Override
        public void serialEvent(SerialPortEvent event) {
            try {
                String buffer = serialPort.readString(15);
                String[] data = buffer.split(":");
    
                Commit commit = new Commit();
    
                commit.setTemperature(Double.parseDouble(data[0]));
                commit.setWet(data[1]);
                commit.setDate(new Date());
    
                Room room = roomService.findByIndex(data[2]);
    
                commit.setRoom(room);
    
                commitService.save(commit);
    
    
            } catch (SerialPortException e) {
                e.printStackTrace();
            }
        }
    
    }


    Решение позволяет записывать данные в таблицу без каких либо проблем, но вот верно ли так делать, я не знаю. Может стоило прямиком из контроллера гетерами цеплять сервисы, чтобы не протягивать их - но насколько это корректно по отношению к самому контроллеру? Работает, но вопросов все равно много.
    Ответ написан
    Комментировать