Вы также можете использовать chmod 777 *
Это даст разрешения всем файлам, находящимся в данный момент в папке, и файлам, добавленным в будущем, без предоставления разрешений для самого каталога.
ПРИМЕЧАНИЕ. Это следует делать в папке, в которой находятся файлы. Для меня это была проблема с изображениями, поэтому я пошел в папку с изображениями и сделал это.
Множественные параллельные транзакции в масштабе сеанса обычно приводят к тупикам или хуже (хуже == livelock, длительные задержки, пока блокировки удерживаются другим сеансом.)
Такой дизайн - не лучшая политика, поэтому Django не одобряет его.
Лучшее решение - следующее.
Создайте Memento класс, который записывает изменение пользователя. Это может быть сохраненная копия их ввода формы. Вам может потребоваться записать дополнительную информацию, если изменения состояния сложные. В противном случае может быть достаточно копии ввода формы.
Накопить последовательность объектов Memento в их сеансе. Обратите внимание, что каждый шаг в транзакции будет включать выборку данных и проверку, чтобы увидеть, будет ли цепочка сувениров «работать». Иногда они не работают, потому что кто-то что-то изменил в этой цепочке сувениров. Что теперь?
Когда вы представляете «готов к совершению?» страницы, вы воспроизвели последовательность Mementos и почти уверены, что они сработают. При отправке «Commit» вы должны воспроизвести Mementos в последний раз, надеясь, что они все еще будут работать. Если они это сделают, отлично. Если нет, значит, кто-то что-то изменил, и вы снова на шаге 2: что теперь?
Это кажется сложным.
Да, это так. Однако он не удерживает никаких блокировок, что обеспечивает невероятную скорость и небольшую возможность зайти в тупик. Транзакция ограничена «фиксацией»
На случай, если у кого-то еще возникнет такая же проблема, как у меня (надеюсь, что нет), вот моя обезьяна. Он хрупкий и уродливый, меняет частные методы, но, к счастью, он небольшой. Пожалуйста, не используйте его, если в этом нет необходимости. Как упоминалось другими, любое приложение, использующее его, эффективно предотвращает одновременное выполнение обновлений несколькими пользователями из-за тупиковой ситуации. (В моем приложении может быть много читателей, но несколько одновременных обновлений намеренно исключены.)
У меня есть объект «пользователь», который сохраняется в течение сеанса пользователя и содержит объект постоянного соединения. Когда я проверяю, что конкретное HTTP-взаимодействие является частью сеанса, я также сохраняю объект пользователя в django.db.connection, который является локальным для потока.
Я придумал что-то похожее на шаблон Memento, но достаточно другое, чтобы его можно было опубликовать. Когда пользователь запускает сеанс редактирования, я дублирую целевой объект во временный объект в базе данных. Все последующие операции редактирования влияют на дубликат. Вместо сохранения состояния объекта в памятке при каждом изменении, я сохраняю объекты операции . Когда я применяю операцию к объекту, он возвращает обратную операцию, которую я сохраняю.
Для меня операции сохранения намного дешевле, чем памятные вещи, так как операции можно описать с помощью нескольких небольших элементов данных, а редактируемый объект намного больше. Также я применяю операции по ходу и сохраняю отмены, чтобы временное значение в базе данных всегда соответствовало версии в браузере пользователя. Мне никогда не нужно воспроизводить коллекцию изменений; временный объект всегда находится на расстоянии одной операции от следующей версии.
Чтобы реализовать «отмену», я выталкиваю последний объект отмены из стека (как бы - путем получения последней операции для временного объекта из базы данных) примените его к временному и верните преобразованное временное. Я также мог бы поместить результирующую операцию в стек повтора, если бы мне захотелось реализовать повтора.
Чтобы реализовать «сохранение изменений», то есть фиксацию, я деактивирую и ставлю метку времени на исходный объект и активирую временный на его месте.
Для реализации «отмены», т.е. отката, я ничего не делаю! Конечно, я мог бы удалить временное, потому что у пользователя нет возможности получить его после завершения сеанса редактирования,