[Errno 13] Permission denied: '/home/vsvd/vsvd/media/documents/ALMANACH_VSVD_2022_web.pdf'
Request Method: | GET |
---|---|
Request URL: | https://vsvd.cz/documents/42/ALMANACH_VSVD_2022_web.pdf |
Django Version: | 3.2.19 |
Exception Type: | PermissionError |
Exception Value: | [Errno 13] Permission denied: '/home/vsvd/vsvd/media/documents/ALMANACH_VSVD_2022_web.pdf' |
Exception Location: | /home/vsvd/lib/python3.6/site-packages/wagtail/utils/sendfile_streaming_backend.py, line 23, in sendfile |
Python Executable: | /usr/bin/uwsgi-core |
Python Version: | 3.6.9 |
Python Path: | ['/home/vsvd/vsvd/', '.', '', '/home/vsvd/lib/python36.zip', '/home/vsvd/lib/python3.6', '/home/vsvd/lib/python3.6/lib-dynload', '/usr/lib/python3.6', '/home/vsvd/lib/python3.6/site-packages'] |
Server time: | Thu, 28 Mar 2024 23:01:54 +0100 |
/home/vsvd/lib/python3.6/site-packages/django/core/handlers/exception.py
, line 47, in inner
response = await sync_to_async(response_for_exception, thread_sensitive=False)(request, exc)
return response
return inner
else:
@wraps(get_response)
def inner(request):
try:
response = get_response(request)…
except Exception as exc:
response = response_for_exception(request, exc)
return response
return inner
Variable | Value |
---|---|
exc | PermissionError(13, 'Permission denied') |
get_response | <bound method BaseHandler._get_response of <django.core.handlers.wsgi.WSGIHandler object at 0x7f0f11745940>> |
request | <WSGIRequest: GET '/documents/42/ALMANACH_VSVD_2022_web.pdf'> |
/home/vsvd/lib/python3.6/site-packages/django/core/handlers/base.py
, line 181, in _get_response
if response is None:
wrapped_callback = self.make_view_atomic(callback)
# If it is an asynchronous view, run it in a subthread.
if asyncio.iscoroutinefunction(wrapped_callback):
wrapped_callback = async_to_sync(wrapped_callback)
try:
response = wrapped_callback(request, *callback_args, **callback_kwargs)…
except Exception as e:
response = self.process_exception_by_middleware(e, request)
if response is None:
raise
# Complain if the view returned None (a common error).
Variable | Value |
---|---|
callback | <function serve at 0x7f0f0f714598> |
callback_args | ('42', 'ALMANACH_VSVD_2022_web.pdf') |
callback_kwargs | {} |
middleware_method | <bound method CsrfViewMiddleware.process_view of <django.middleware.csrf.CsrfViewMiddleware object at 0x7f0f1116cc18>> |
request | <WSGIRequest: GET '/documents/42/ALMANACH_VSVD_2022_web.pdf'> |
response | None |
self | <django.core.handlers.wsgi.WSGIHandler object at 0x7f0f11745940> |
wrapped_callback | <function serve at 0x7f0f0d33bbf8> |
/usr/lib/python3.6/contextlib.py
, line 52, in inner
"""
return self
def __call__(self, func):
@wraps(func)
def inner(*args, **kwds):
with self._recreate_cm():
return func(*args, **kwds)…
return inner
class _GeneratorContextManager(ContextDecorator, AbstractContextManager):
"""Helper for @contextmanager decorator."""
Variable | Value |
---|---|
args | (<WSGIRequest: GET '/documents/42/ALMANACH_VSVD_2022_web.pdf'>, '42', 'ALMANACH_VSVD_2022_web.pdf') |
func | <function serve at 0x7f0f0f714598> |
kwds | {} |
self | <django.db.transaction.Atomic object at 0x7f0f0e9bce10> |
/home/vsvd/lib/python3.6/site-packages/django/views/decorators/http.py
, line 99, in inner
response = get_conditional_response(
request,
etag=res_etag,
last_modified=res_last_modified,
)
if response is None:
response = func(request, *args, **kwargs)…
# Set relevant headers on the response if they don't already exist
# and if the request method is safe.
if request.method in ('GET', 'HEAD'):
if res_last_modified and not response.has_header('Last-Modified'):
response.headers['Last-Modified'] = http_date(res_last_modified)
Variable | Value |
---|---|
args | ('42', 'ALMANACH_VSVD_2022_web.pdf') |
etag_func | <function document_etag at 0x7f0f0f714268> |
func | <function serve at 0x7f0f0f7146a8> |
get_last_modified | <function condition.<locals>.decorator.<locals>.inner.<locals>.get_last_modified at 0x7f0f0d33b1e0> |
kwargs | {} |
last_modified_func | None |
request | <WSGIRequest: GET '/documents/42/ALMANACH_VSVD_2022_web.pdf'> |
res_etag | '""' |
res_last_modified | None |
response | None |
/home/vsvd/lib/python3.6/site-packages/django/views/decorators/cache.py
, line 31, in _cache_controlled
)
def cache_control(**kwargs):
def _cache_controller(viewfunc):
@wraps(viewfunc)
def _cache_controlled(request, *args, **kw):
response = viewfunc(request, *args, **kw)…
patch_cache_control(response, **kwargs)
return response
return _cache_controlled
return _cache_controller
Variable | Value |
---|---|
args | ('42', 'ALMANACH_VSVD_2022_web.pdf') |
kw | {} |
kwargs | {'max_age': 3600, 'public': True} |
request | <WSGIRequest: GET '/documents/42/ALMANACH_VSVD_2022_web.pdf'> |
viewfunc | <function serve at 0x7f0f0f714620> |
/home/vsvd/lib/python3.6/site-packages/wagtail/documents/views/serve.py
, line 91, in serve
'attachment_filename': doc.filename,
'mimetype': doc.content_type,
}
if not hasattr(settings, 'SENDFILE_BACKEND'):
# Fallback to streaming backend if user hasn't specified SENDFILE_BACKEND
sendfile_opts['backend'] = sendfile_streaming_backend.sendfile
return sendfile(request, local_path, **sendfile_opts)…
else:
# We are using a storage backend which does not expose filesystem paths
# (e.g. storages.backends.s3boto.S3BotoStorage) AND the developer has not allowed
# redirecting to the file url directly.
Variable | Value |
---|---|
Document | <class 'wagtail.documents.models.Document'> |
direct_url | '/media/documents/ALMANACH_VSVD_2022_web.pdf' |
doc | <Document: DH jaro-léto 2022> |
document_filename | 'ALMANACH_VSVD_2022_web.pdf' |
document_id | '42' |
fn | <function check_view_restrictions at 0x7f0f0fa086a8> |
local_path | '/home/vsvd/vsvd/media/documents/ALMANACH_VSVD_2022_web.pdf' |
request | <WSGIRequest: GET '/documents/42/ALMANACH_VSVD_2022_web.pdf'> |
result | None |
sendfile_opts | {'attachment': False, 'attachment_filename': 'ALMANACH_VSVD_2022_web.pdf', 'backend': <function sendfile at 0x7f0f0f714488>, 'mimetype': 'application/pdf'} |
serve_method | 'serve_view' |
/home/vsvd/lib/python3.6/site-packages/wagtail/utils/sendfile.py
, line 71, in sendfile
guessed_mimetype, guessed_encoding = guess_type(filename)
if mimetype is None:
if guessed_mimetype:
mimetype = guessed_mimetype
else:
mimetype = 'application/octet-stream'
response = _sendfile(request, filename, mimetype=mimetype)…
if attachment:
if attachment_filename is None:
attachment_filename = os.path.basename(filename)
parts = ['attachment']
if attachment_filename:
from django.utils.encoding import force_str
Variable | Value |
---|---|
_sendfile | <function sendfile at 0x7f0f0f714488> |
attachment | False |
attachment_filename | 'ALMANACH_VSVD_2022_web.pdf' |
backend | <function sendfile at 0x7f0f0f714488> |
encoding | None |
filename | '/home/vsvd/vsvd/media/documents/ALMANACH_VSVD_2022_web.pdf' |
guessed_encoding | None |
guessed_mimetype | 'application/pdf' |
mimetype | 'application/pdf' |
request | <WSGIRequest: GET '/documents/42/ALMANACH_VSVD_2022_web.pdf'> |
/home/vsvd/lib/python3.6/site-packages/wagtail/utils/sendfile_streaming_backend.py
, line 23, in sendfile
# Respect the If-Modified-Since header.
statobj = os.stat(filename)
if not was_modified_since(request.META.get('HTTP_IF_MODIFIED_SINCE'),
statobj[stat.ST_MTIME], statobj[stat.ST_SIZE]):
return HttpResponseNotModified()
response = StreamingHttpResponse(FileWrapper(open(filename, 'rb')))…
response["Last-Modified"] = http_date(statobj[stat.ST_MTIME])
return response
def was_modified_since(header=None, mtime=0, size=0):
Variable | Value |
---|---|
filename | '/home/vsvd/vsvd/media/documents/ALMANACH_VSVD_2022_web.pdf' |
kwargs | {'mimetype': 'application/pdf'} |
request | <WSGIRequest: GET '/documents/42/ALMANACH_VSVD_2022_web.pdf'> |
statobj | os.stat_result(st_mode=33152, st_ino=4663913, st_dev=64513, st_nlink=1, st_uid=1012, st_gid=1012, st_size=7432487, st_atime=1677574372, st_mtime=1660199487, st_ctime=1682503448) |
AnonymousUser
No GET data
No POST data
No FILES data
No cookie data
Variable | Value |
---|---|
CONTENT_LENGTH | '' |
CONTENT_TYPE | '' |
DOCUMENT_ROOT | '/usr/share/nginx/html' |
HTTPS | 'on' |
HTTP_ACCEPT | '*/*' |
HTTP_HOST | 'vsvd.cz' |
HTTP_USER_AGENT | 'claudebot' |
PATH_INFO | '/documents/42/ALMANACH_VSVD_2022_web.pdf' |
QUERY_STRING | '' |
REMOTE_ADDR | '54.160.133.33' |
REMOTE_PORT | '55458' |
REQUEST_METHOD | 'GET' |
REQUEST_SCHEME | 'https' |
REQUEST_URI | '/documents/42/ALMANACH_VSVD_2022_web.pdf' |
SCRIPT_NAME | '' |
SERVER_NAME | 'vsvd.cz' |
SERVER_PORT | '443' |
SERVER_PROTOCOL | 'HTTP/1.1' |
uwsgi.node | b'ubuntu-s-1vcpu-1gb-fra1-02' |
uwsgi.version | b'2.0.15-debian' |
wsgi.errors | <_io.TextIOWrapper name=2 mode='w' encoding='UTF-8'> |
wsgi.file_wrapper | <built-in function uwsgi_sendfile> |
wsgi.input | <uwsgi._Input object at 0x7f0f0ecae630> |
wsgi.multiprocess | False |
wsgi.multithread | False |
wsgi.run_once | False |
wsgi.url_scheme | 'https' |
wsgi.version | (1, 0) |
vsvd.settings.production
Setting | Value |
---|---|
ABSOLUTE_URL_OVERRIDES | {} |
ADMINS | [] |
ALLOWED_HOSTS | ['vsvd.e-smile.cz', 'www.vsvd.cz', 'vsvd.cz'] |
APPEND_SLASH | True |
AUTHENTICATION_BACKENDS | ['django.contrib.auth.backends.ModelBackend'] |
AUTH_PASSWORD_VALIDATORS | '********************' |
AUTH_USER_MODEL | 'auth.User' |
BASE_DIR | '/home/vsvd/vsvd' |
BASE_URL | 'http://www.vsvd.cz' |
CACHES | {'default': {'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'KEY_PREFIX': '********************', 'LOCATION': '127.0.0.1:11211'}} |
CACHE_MIDDLEWARE_ALIAS | 'default' |
CACHE_MIDDLEWARE_KEY_PREFIX | '********************' |
CACHE_MIDDLEWARE_SECONDS | 600 |
CSRF_COOKIE_AGE | 31449600 |
CSRF_COOKIE_DOMAIN | None |
CSRF_COOKIE_HTTPONLY | False |
CSRF_COOKIE_NAME | 'csrftoken' |
CSRF_COOKIE_PATH | '/' |
CSRF_COOKIE_SAMESITE | 'Lax' |
CSRF_COOKIE_SECURE | False |
CSRF_FAILURE_VIEW | 'django.views.csrf.csrf_failure' |
CSRF_HEADER_NAME | 'HTTP_X_CSRFTOKEN' |
CSRF_TRUSTED_ORIGINS | [] |
CSRF_USE_SESSIONS | False |
DATABASES | {'default': {'ATOMIC_REQUESTS': True, 'AUTOCOMMIT': True, 'CONN_MAX_AGE': 0, 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'HOST': 'db-postgresql-fra1-47634-do-user-4640791-0.db.ondigitalocean.com', 'NAME': 'vsvd', 'OPTIONS': {'sslmode': 'require'}, 'PASSWORD': '********************', 'PORT': '25060', 'TEST': {'CHARSET': None, 'COLLATION': None, 'MIGRATE': True, 'MIRROR': None, 'NAME': None}, 'TIME_ZONE': None, 'USER': 'vsvd'}} |
DATABASE_ROUTERS | [] |
DATA_UPLOAD_MAX_MEMORY_SIZE | 2621440 |
DATA_UPLOAD_MAX_NUMBER_FIELDS | 1000 |
DATA_UPLOAD_MAX_NUMBER_FILES | 100 |
DATETIME_FORMAT | 'N j, Y, P' |
DATETIME_INPUT_FORMATS | ['%Y-%m-%d %H:%M:%S', '%Y-%m-%d %H:%M:%S.%f', '%Y-%m-%d %H:%M', '%m/%d/%Y %H:%M:%S', '%m/%d/%Y %H:%M:%S.%f', '%m/%d/%Y %H:%M', '%m/%d/%y %H:%M:%S', '%m/%d/%y %H:%M:%S.%f', '%m/%d/%y %H:%M'] |
DATE_FORMAT | 'N j, Y' |
DATE_INPUT_FORMATS | ['%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', '%b %d %Y', '%b %d, %Y', '%d %b %Y', '%d %b, %Y', '%B %d %Y', '%B %d, %Y', '%d %B %Y', '%d %B, %Y'] |
DEBUG | True |
DEBUG_PROPAGATE_EXCEPTIONS | False |
DECIMAL_SEPARATOR | '.' |
DEFAULT_AUTO_FIELD | 'django.db.models.AutoField' |
DEFAULT_CHARSET | 'utf-8' |
DEFAULT_EXCEPTION_REPORTER | 'django.views.debug.ExceptionReporter' |
DEFAULT_EXCEPTION_REPORTER_FILTER | 'django.views.debug.SafeExceptionReporterFilter' |
DEFAULT_FILE_STORAGE | 'django.core.files.storage.FileSystemStorage' |
DEFAULT_FROM_EMAIL | 'webmaster@localhost' |
DEFAULT_HASHING_ALGORITHM | 'sha256' |
DEFAULT_INDEX_TABLESPACE | '' |
DEFAULT_TABLESPACE | '' |
DISALLOWED_USER_AGENTS | [] |
EMAIL_BACKEND | 'django.core.mail.backends.smtp.EmailBackend' |
EMAIL_HOST | 'localhost' |
EMAIL_HOST_PASSWORD | '********************' |
EMAIL_HOST_USER | '' |
EMAIL_PORT | 25 |
EMAIL_SSL_CERTFILE | None |
EMAIL_SSL_KEYFILE | '********************' |
EMAIL_SUBJECT_PREFIX | '[VSVD] - ' |
EMAIL_TIMEOUT | None |
EMAIL_USE_LOCALTIME | False |
EMAIL_USE_SSL | False |
EMAIL_USE_TLS | False |
FILE_UPLOAD_DIRECTORY_PERMISSIONS | None |
FILE_UPLOAD_HANDLERS | ['django.core.files.uploadhandler.MemoryFileUploadHandler', 'django.core.files.uploadhandler.TemporaryFileUploadHandler'] |
FILE_UPLOAD_MAX_MEMORY_SIZE | 2621440 |
FILE_UPLOAD_PERMISSIONS | 420 |
FILE_UPLOAD_TEMP_DIR | None |
FIRST_DAY_OF_WEEK | 0 |
FIXTURE_DIRS | [] |
FORCE_SCRIPT_NAME | None |
FORMAT_MODULE_PATH | None |
FORM_RENDERER | 'django.forms.renderers.DjangoTemplates' |
IGNORABLE_404_URLS | [] |
INSTALLED_APPS | ['wagtail.contrib.forms', 'wagtail.contrib.modeladmin', 'wagtail.contrib.redirects', 'wagtail.contrib.routable_page', 'wagtail.contrib.settings', 'wagtail.contrib.table_block', 'wagtail.contrib.styleguide', 'wagtail.embeds', 'wagtail.sites', 'wagtail.users', 'wagtail.snippets', 'wagtail.documents', 'wagtail.images', 'wagtail.search', 'wagtail.admin', 'wagtail.core', 'modelcluster', 'taggit', 'wagtailmenus', 'wagtail_modeltranslation', 'wagtail_modeltranslation.makemigrations', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.sitemaps', 'common', 'contact', 'home', 'search', 'utils', 'cookielaw', 'robots'] |
INTERNAL_IPS | [] |
LANGUAGES | [('cs', 'česky')] |
LANGUAGES_BIDI | ['he', 'ar', 'ar-dz', 'fa', 'ur'] |
LANGUAGE_CODE | 'cs' |
LANGUAGE_COOKIE_AGE | None |
LANGUAGE_COOKIE_DOMAIN | None |
LANGUAGE_COOKIE_HTTPONLY | False |
LANGUAGE_COOKIE_NAME | 'django_language' |
LANGUAGE_COOKIE_PATH | '/' |
LANGUAGE_COOKIE_SAMESITE | None |
LANGUAGE_COOKIE_SECURE | False |
LOCALE_PATHS | ['/home/vsvd/vsvd/vsvd/locale'] |
LOGGING | {} |
LOGGING_CONFIG | 'logging.config.dictConfig' |
LOGIN_REDIRECT_URL | '/accounts/profile/' |
LOGIN_URL | '/accounts/login/' |
LOGOUT_REDIRECT_URL | None |
MANAGERS | [('Jakub Skaryd', 'skaryd@gmail.com')] |
MEDIA_ROOT | '/home/vsvd/vsvd/media' |
MEDIA_URL | '/media/' |
MESSAGE_STORAGE | 'django.contrib.messages.storage.fallback.FallbackStorage' |
MIDDLEWARE | ['django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.security.SecurityMiddleware', 'wagtail.contrib.redirects.middleware.RedirectMiddleware', 'common.middleware.NewsMiddleware'] |
MIGRATION_MODULES | {} |
MODELTRANSLATION_CUSTOM_FIELDS | ('StreamField', 'RichTextField') |
MONTH_DAY_FORMAT | 'F j' |
NUMBER_GROUPING | 0 |
PASSWORD_HASHERS | '********************' |
PASSWORD_RESET_TIMEOUT | '********************' |
PASSWORD_RESET_TIMEOUT_DAYS | '********************' |
PREPEND_WWW | False |
PROJECT_DIR | '/home/vsvd/vsvd/vsvd' |
ROOT_URLCONF | 'vsvd.urls' |
SECRET_KEY | '********************' |
SECURE_BROWSER_XSS_FILTER | False |
SECURE_CONTENT_TYPE_NOSNIFF | True |
SECURE_HSTS_INCLUDE_SUBDOMAINS | False |
SECURE_HSTS_PRELOAD | False |
SECURE_HSTS_SECONDS | 0 |
SECURE_PROXY_SSL_HEADER | None |
SECURE_REDIRECT_EXEMPT | [] |
SECURE_REFERRER_POLICY | 'same-origin' |
SECURE_SSL_HOST | None |
SECURE_SSL_REDIRECT | False |
SERVER_EMAIL | 'noreply@vsvc.cz' |
SESSION_CACHE_ALIAS | 'default' |
SESSION_COOKIE_AGE | 1209600 |
SESSION_COOKIE_DOMAIN | None |
SESSION_COOKIE_HTTPONLY | True |
SESSION_COOKIE_NAME | 'sessionid' |
SESSION_COOKIE_PATH | '/' |
SESSION_COOKIE_SAMESITE | 'Lax' |
SESSION_COOKIE_SECURE | False |
SESSION_ENGINE | 'django.contrib.sessions.backends.db' |
SESSION_EXPIRE_AT_BROWSER_CLOSE | False |
SESSION_FILE_PATH | None |
SESSION_SAVE_EVERY_REQUEST | False |
SESSION_SERIALIZER | 'django.contrib.sessions.serializers.JSONSerializer' |
SETTINGS_MODULE | 'vsvd.settings.production' |
SHORT_DATETIME_FORMAT | 'm/d/Y P' |
SHORT_DATE_FORMAT | 'm/d/Y' |
SIGNING_BACKEND | 'django.core.signing.TimestampSigner' |
SILENCED_SYSTEM_CHECKS | [] |
STATICFILES_DIRS | ['/home/vsvd/vsvd/vsvd/static'] |
STATICFILES_FINDERS | ['django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder'] |
STATICFILES_STORAGE | 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage' |
STATIC_ROOT | '/home/vsvd/vsvd/static' |
STATIC_URL | '/static/' |
TEMPLATES | [{'APP_DIRS': True, 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': ['/home/vsvd/vsvd/vsvd/templates'], 'OPTIONS': {'context_processors': ['django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', 'wagtail.contrib.settings.context_processors.settings']}}] |
TEST_NON_SERIALIZED_APPS | [] |
TEST_RUNNER | 'django.test.runner.DiscoverRunner' |
THOUSAND_SEPARATOR | ',' |
TIME_FORMAT | 'P' |
TIME_INPUT_FORMATS | ['%H:%M:%S', '%H:%M:%S.%f', '%H:%M'] |
TIME_ZONE | 'Europe/Prague' |
USE_I18N | True |
USE_L10N | True |
USE_THOUSAND_SEPARATOR | False |
USE_TZ | True |
USE_X_FORWARDED_HOST | False |
USE_X_FORWARDED_PORT | False |
WAGTAILIMAGES_MAX_UPLOAD_SIZE | 15728640 |
WAGTAILSEARCH_BACKENDS | {'default': {'BACKEND': 'wagtail.search.backends.elasticsearch7', 'INDEX': 'vsvd', 'INDEX_SETTINGS': {}, 'OPTIONS': {}, 'TIMEOUT': 5, 'URLS': ['http://10.135.119.116:9200']}} |
WAGTAIL_ALLOW_UNICODE_SLUGS | False |
WAGTAIL_SITE_NAME | 'vsvd' |
WAGTAIL_USAGE_COUNT_ENABLED | True |
WSGI_APPLICATION | 'vsvd.wsgi.application' |
X_FRAME_OPTIONS | 'DENY' |
YEAR_MONTH_FORMAT | 'F Y' |
You’re seeing this error because you have DEBUG = True
in your
Django settings file. Change that to False
, and Django will
display a standard page generated by the handler for this status code.