67 lines
1.8 KiB
Python
67 lines
1.8 KiB
Python
"""
|
|
Tests for the file storage mechanism
|
|
|
|
>>> import tempfile
|
|
>>> from django.core.files.storage import FileSystemStorage
|
|
>>> from django.core.files.base import ContentFile
|
|
|
|
>>> temp_storage = FileSystemStorage(location=tempfile.gettempdir())
|
|
|
|
# Standard file access options are available, and work as expected.
|
|
|
|
>>> temp_storage.exists('storage_test')
|
|
False
|
|
>>> file = temp_storage.open('storage_test', 'w')
|
|
>>> file.write('storage contents')
|
|
>>> file.close()
|
|
|
|
>>> temp_storage.exists('storage_test')
|
|
True
|
|
>>> file = temp_storage.open('storage_test', 'r')
|
|
>>> file.read()
|
|
'storage contents'
|
|
>>> file.close()
|
|
|
|
>>> temp_storage.delete('storage_test')
|
|
>>> temp_storage.exists('storage_test')
|
|
False
|
|
|
|
# Files can only be accessed if they're below the specified location.
|
|
|
|
>>> temp_storage.exists('..')
|
|
Traceback (most recent call last):
|
|
...
|
|
SuspiciousOperation: Attempted access to '..' denied.
|
|
>>> temp_storage.open('/etc/passwd')
|
|
Traceback (most recent call last):
|
|
...
|
|
SuspiciousOperation: Attempted access to '/etc/passwd' denied.
|
|
|
|
# Custom storage systems can be created to customize behavior
|
|
|
|
>>> class CustomStorage(FileSystemStorage):
|
|
... def get_available_name(self, name):
|
|
... # Append numbers to duplicate files rather than underscores, like Trac
|
|
...
|
|
... parts = name.split('.')
|
|
... basename, ext = parts[0], parts[1:]
|
|
... number = 2
|
|
...
|
|
... while self.exists(name):
|
|
... name = '.'.join([basename, str(number)] + ext)
|
|
... number += 1
|
|
...
|
|
... return name
|
|
>>> custom_storage = CustomStorage(tempfile.gettempdir())
|
|
|
|
>>> first = custom_storage.save('custom_storage', ContentFile('custom contents'))
|
|
>>> first
|
|
u'custom_storage'
|
|
>>> second = custom_storage.save('custom_storage', ContentFile('more contents'))
|
|
>>> second
|
|
u'custom_storage.2'
|
|
|
|
>>> custom_storage.delete(first)
|
|
>>> custom_storage.delete(second)
|
|
"""
|