Сервер флагов Python - используйте память [duplicate]

Что такое типы raw в Java и почему я часто слышу, что они не должны использоваться в новом коде?

Необработанные типы - это древняя история Java язык. В начале были Collections, и они больше не держали Objects и ничего меньше. Каждая операция на Collections требовала отличных от Object желаемого типа.

List aList = new ArrayList();
String s = "Hello World!";
aList.add(s);
String c = (String)aList.get(0);

Хотя это продолжалось большую часть времени, произошли ошибки

List aNumberList = new ArrayList();
String one = "1";//Number one
aNumberList.add(one);
Integer iOne = (Integer)aNumberList.get(0);//Insert ClassCastException here

Старый нетривиальные коллекции не могли обеспечить безопасность типов, поэтому программисту приходилось запоминать то, что он хранил в коллекции. Генераторы, изобретенные, чтобы обойти это ограничение, разработчик объявит сохраненный тип один раз, и компилятор сделает это вместо этого.

List aNumberList = new ArrayList();
aNumberList.add("one");
Integer iOne = aNumberList.get(0);//Compile time error
String sOne = aNumberList.get(0);//works fine

Для сравнения:

// Old style collections now known as raw types
List aList = new ArrayList(); //Could contain anything
// New style collections with Generics
List aList = new ArrayList(); //Contains only Strings

Более сложный Интерфейс Compareable:

//raw, not type save can compare with Other classes
class MyCompareAble implements CompareAble
{
   int id;
   public int compareTo(Object other)
   {return this.id - ((MyCompareAble)other).id;}
}
//Generic
class MyCompareAble implements CompareAble
{
   int id;
   public int compareTo(MyCompareAble other)
   {return this.id - other.id;}
}

Обратите внимание, что невозможно реализовать интерфейс CompareAble с compareTo(MyCompareAble) с необработанными типами. Почему вы не должны их использовать:

  • Любое Object, хранящееся в Collection, должно быть выполнено до его использования
  • Использование обобщений позволяет проверять время компиляции
  • Использование исходных типов - это то же самое, что и сохранение каждого значения как Object

Что делает компилятор: Дженерики обратно совместимы, они используют одни и те же классы java, типы делают.

List someStrings = new ArrayList();
someStrings.add("one");
String one = someStrings.get(0);

Будет скомпилирован как:

List someStrings = new ArrayList();
someStrings.add("one"); 
String one = (String)someStrings.get(0);

Это тот же код, который вы бы написали, если вы использовали исходные типы напрямую. Думаю, я не уверен, что происходит с интерфейсом CompareAble, я предполагаю, что он создает две функции compareTo, одна из которых принимает MyCompareAble, а другая принимает Object и передает ее первой после ее литья.

Каковы альтернативы сырым типам: используйте generics

58
задан user2480542 16 November 2013 в 08:44
поделиться

2 ответа

FileStorage содержит поле stream. Этот объект должен расширять IO или файл-объект, поэтому он должен содержать read и другие подобные методы. FileStorage также расширяют атрибуты объекта поля stream, поэтому вы можете просто использовать file.read() вместо file.stream.read(). Также вы можете использовать аргумент save с параметром dst как StringIO или другой объект ввода-вывода или файл, чтобы скопировать FileStorage.stream в другой объект ввода-вывода или файл.

См. Документацию: http: //flask.pocoo.org/docs/api/#flask.Request.files и http://werkzeug.pocoo.org/docs/datastructures/#werkzeug.datastructures.FileStorage .

69
ответ дан tbicr 21 August 2018 в 20:11
поделиться
  • 1
    работает! Спасибо. file.read () делает все. :-) – user2480542 16 November 2013 в 14:08
  • 2
    быстрый пример: file = request.files.get('file') filetype = magic.from_buffer(file.read(1024)) – endolith 26 December 2014 в 21:00
  • 3
    привет @ пользователь2480542. Я сталкиваюсь с той же проблемой. Можете ли вы описать, как вы читали содержимое загруженного клиентом файла? Я вызываю file.read (), но ничего не получаю. Благодаря! – tmthyjames 6 February 2015 в 22:21
  • 4
    @tmthyjames f = request.files['file'] помещает загруженный файл (в запрос) в var (& quot; f & quot;). Затем f.read() работает с использованием вышеуказанного кода. когда print f.read() я получаю правильный мусор в терминале. Надеюсь, это поможет. – Marc 11 February 2015 в 18:56
  • 5
    Если вы загружаете файл и имеете двоичный поток, вы можете легко преобразовать его в текстовый поток, обернув его в TextIOWrapper: mystring = TextIOWrapper(binary_stream) – Dutch Masters 14 July 2016 в 14:57

Если вы хотите использовать стандартные флеш-файлы - нет способа избежать сохранения временного файла, если размер загруженного файла составляет> 500 кб. Если он меньше 500 КБ, он будет использовать «BytesIO», который хранит содержимое файла в памяти, а если он больше 500 КБ - он хранит содержимое в TemporaryFile () (как указано в документации werkzeug ). В обоих случаях ваш скрипт будет блокироваться до тех пор, пока не будет получен весь загруженный файл.

Самый простой способ обойти это, что я нашел:

1) Создайте свой собственный файл- как класс IO, где вы выполняете всю обработку входящих данных

2) В вашем скрипте переопределите класс Request своим:

class MyRequest( Request ):
  def _get_file_stream( self, total_content_length, content_type, filename=None, content_length=None ):
    return MyAwesomeIO( filename, 'w' )

3) Замените запрос_класса Flask вашим собственный:

app.request_class = MyRequest

4) Идите, выпейте пиво:)

5
ответ дан Ciprian Tomoiagă 21 August 2018 в 20:11
поделиться
Другие вопросы по тегам:

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