Python. Джанго. Как избежать регистрации тела файла при регистрации входящей полезной нагрузки. многочастному / форм-данных,

Чтобы получить действительно неизменный список, вам нужно будет сделать глубокие копии содержимого списка. UnmodifiableList будет только отображать список ссылок несколько неизменным. Теперь создание глубокой копии списка или массива будет жестким по памяти с ростом размера. Вы можете использовать сериализацию / десериализацию и хранить глубокую копию массива / списка во временном файле. Установщик не будет доступен, так как элемент varaible должен быть неизменным. Геттер будет сериализовать переменную-член в файл, а затем десализировать ее, чтобы получить глубокую копию. Серализация имеет врожденный характер проникновения в глубины дерева объектов. Это обеспечило бы полную неизменность при некоторых эксплуатационных расходах.

 package com.home.immutable.serial;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;

public final class ImmutableBySerial {

    private final int num;
    private final String str;
    private final ArrayList<TestObjSerial> immutableList;

    ImmutableBySerial(int num, String str, ArrayList<TestObjSerial> list){
        this.num = num;
        this.str = str;
        this.immutableList = getDeepCloned(list);
    }

    public int getNum(){
        return num;
    }

    public String getStr(){
        return str;
    }

    public ArrayList<TestObjSerial> getImmutableList(){
        return getDeepCloned(immutableList);
    }

    private ArrayList<TestObjSerial> getDeepCloned(ArrayList<TestObjSerial> list){
        FileOutputStream fos = null;
        ObjectOutputStream oos = null;
        FileInputStream fis = null;
        ObjectInputStream ois = null;
        ArrayList<TestObjSerial> clonedObj = null;
        try {
             fos = new FileOutputStream(new File("temp"));
             oos = new ObjectOutputStream(fos);
             oos.writeObject(list);
             fis = new FileInputStream(new File("temp"));
             ois = new ObjectInputStream(fis);
             clonedObj = (ArrayList<TestObjSerial>)ois.readObject();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                oos.close();
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return clonedObj;
    }
}
0
задан Yuriy Leonov 27 February 2019 в 13:40
поделиться

1 ответ

Решение:
Это определенно не лучшее решение. Я думаю, что больше ответов можно предложить в ответах.
Но я надеюсь, что это может кому-то помочь.

Поместите этот класс в промежуточное ПО (решение упрощено):

import logging
import re

RE_PATTERN = r'(?<=; filename=")(.*?)"\\r\\nContent-Type: (.*?)\\r\\n(.*?)-(.-)(.*?)(?=Content-Disposition:)'
RE_REPLACE_TO = r'\1"\\r\\nContent-Type: \2\\r\\n\\r\\n<file-data>\\r\\n-\4\5'


class RequestLogger(object):

    def __init__(self):
        self._logger = logging.getLogger(__name__)

    def process_request(self, request):
        formatted_body = re.sub(
            pattern=RE_PATTERN,
            repl=RE_REPLACE_TO,
            string="%r" % request.body).decode('string_escape')
        # or "{!r}".format(request.body)

        self._logger.info('Body: {}'.format(formatted_body))
0
ответ дан Yuriy Leonov 27 February 2019 в 13:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: