Ich habe durch den Klingelton meine Django App Setup auf Heroku mit Amazon s3, um die statischen und Mediendateien hosten. Ich habe diesen Leitfaden https://www.caktusgroup.com/blog/2014/11/10/Using-Amazon-S3-to-store-your-Django-sites-static-and-media-files/ gefolgt und was scheint wie Tausende anderer Ressourcen, Collectstatic hat funktioniert und Heroku stellt es - aber zeigt einen 400 Fehler. Wenn ich versuche, und führen Sie es lokal erhalte ich weitere Informationen:"Suspicious Operation" statische Dateien von Amazon S3 aufrufen
Attempted access to '/css/reset.css' denied.
Das ist die Linie, die hervorgehoben wird:
<link rel="stylesheet" type="text/css" href="{% static '/css/reset.css' %}">
kann ich die statischen Dateien aus der URL direkt laden, wenn ich es packen aus meiner s3-Admin-Panel, so dass ich dachte, es war kein Eimer Politik Problem, ich habe herum mit https/http Optionen, aber keine Freude. Also ich denke es muss der falsche Pfad sein wird irgendwie im Code aufgerufen - ich kann einfach nicht sehen wo!
Jede Hilfe sehr geschätzt, ich glaube nicht, dass ich für etwa 4 Stunden gerade blinzelte.
Traceback:
File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/storages/backends/s3boto.py" in _normalize_name
358. return safe_join(self.location, name)
File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/storages/backends/s3boto.py" in safe_join
59. raise ValueError('the joined path is located outside of the base path'
During handling of the above exception (the joined path is located outside of the base path component), another exception occurred:
File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/django/core/handlers/exception.py" in inner
41. response = get_response(request)
File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
187. response = self.process_exception_by_middleware(e, request)
File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
185. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/devtop/webdev/projects/intro/intro/profiles/views.py" in index
14. return render(request, 'home.html', {'welcome':welcome})
File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/django/shortcuts.py" in render
30. content = loader.render_to_string(template_name, context, request, using=using)
File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/django/template/loader.py" in render_to_string
68. return template.render(context, request)
File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/django/template/backends/django.py" in render
66. return self.template.render(context)
File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/django/template/base.py" in render
207. return self._render(context)
File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/django/template/base.py" in _render
199. return self.nodelist.render(context)
File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/django/template/base.py" in render
990. bit = node.render_annotated(context)
File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/django/template/base.py" in render_annotated
957. return self.render(context)
File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/django/template/loader_tags.py" in render
177. return compiled_parent._render(context)
File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/django/template/base.py" in _render
199. return self.nodelist.render(context)
File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/django/template/base.py" in render
990. bit = node.render_annotated(context)
File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/django/template/base.py" in render_annotated
957. return self.render(context)
File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/django/templatetags/static.py" in render
105. url = self.url(context)
File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/django/templatetags/static.py" in url
102. return self.handle_simple(path)
File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/django/templatetags/static.py" in handle_simple
117. return staticfiles_storage.url(path)
File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/storages/backends/s3boto.py" in url
487. name = self._normalize_name(self._clean_name(name))
File "/home/devtop/webdev/projects/intro/myvenv/lib/python3.5/site-packages/storages/backends/s3boto.py" in _normalize_name
361. name)
Exception Type: SuspiciousOperation at/
Exception Value: Attempted access to '/css/reset.css' denied.
settings.py
AWS_ACCESS_KEY_ID=os.environ.get('AWS_ACCESS_KEY_ID',None)
AWS_SECRET_KEY=os.environ.get('AWS_SECRET_KEY',None)
AWS_SECRET_ACCESS_KEY=os.environ.get('AWS_SECRET_KEY', None)
AWS_STORAGE_BUCKET_NAME = 'intro-story'
AWS_S3_HOST='s3.us-east-2.amazonaws.com'
AWS_S3_CUSTOM_DOMAIN = 's3.us-east-2.amazonaws.com/%s' % AWS_STORAGE_BUCKET_NAME
AWS_S3_SECURE_URLS = False
STATICFILES_LOCATION = 'static'
STATICFILES_STORAGE = 'custom_storages.StaticStorage'
STATIC_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, STATICFILES_LOCATION)
MEDIAFILES_LOCATION = 'media'
MEDIA_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, MEDIAFILES_LOCATION)
DEFAULT_FILE_STORAGE = 'custom_storages.MediaStorage'
try:
from .local_settings import *
except ImportError:
pass
local_settings.py
AWS_ACCESS_KEY_ID = "xxx"
AWS_SECRET_ACCESS_KEY = "yyy"
custom_storages.py
from django.conf import settings
from storages.backends.s3boto import S3BotoStorage
class StaticStorage(S3BotoStorage):
location = settings.STATICFILES_LOCATION
class MediaStorage(S3BotoStorage):
location = settings.MEDIAFILES_LOCATION
EDIT:
schaffte ich es durch Herumspielen mit verschiedenen Werten in der settings.py zum Laufen zu bringen, ist aber noch nicht richtig.
Hier ist das ganze Zeug zu statisch und Medienwege im Zusammenhang
STATICFILES_LOCATION = 'static'
MEDIAFILES_LOCATION = 'media'
import custom_storages
STATIC_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, STATICFILES_LOCATION)
STATICFILES_STORAGE = 'custom_storages.StaticStorage'
MEDIA_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, MEDIAFILES_LOCATION)
DEFAULT_FILE_STORAGE = 'custom_storages.MediaStorage'
Hier ist custom_storage, die ich importieren:
from django.conf import settings
from storages.backends.s3boto import S3BotoStorage
class StaticStorage(S3BotoStorage):
location = settings.STATICFILES_LOCATION
class MediaStorage(S3BotoStorage):
location = settings.MEDIAFILES_LOCATION
Nun, wenn ich
Kommentar ausSTATICFILES_STORAGE = 'custom_storages.StaticStorage'
Es wird die statischen Dateien von S3 laden und alles ist in Ordnung, aber Collectstatic schlägt fehl. Wenn ich diese Zeile auskommentiere, funktioniert Collectstatic, aber es gibt einen Fehler, wenn ich versuche, die Seite zu laden. Der Fehler ist:
# Ensure final_path starts with base_path and that the next character after
# the final path is '/' (or nothing, in which case final_path must be
# equal to base_path).
base_path_len = len(base_path)
if (not final_path.startswith(base_path) or
final_path[base_path_len:base_path_len + 1] not in ('', '/')):
raise ValueError('the joined path is located outside of the base path' ...
' component')
return final_path.lstrip('/')
So eindeutig etwas mit diesem custom_storage Teil, aber ich habe keine Ahnung, was:/
Wenn Sie mit der rechten Maustaste klicken und überprüfen Sie die 'href' für' reset.css' welche URL erhalten Sie? Wenn Sie einen anderen Browser öffnen und diese URL einfügen, können Sie sie sehen? –
Wenn Sie innerhalb des S3-Panels auf die Berechtigungen dieser Datei klicken, was bekommen Sie? Haben Sie unter der 'Gruppe' den Wert von' Jeder' und unter dem 'Objektzugriff' den Wert von' Lesen'? –
Ich kann den Link nicht wirklich sehen - wenn ich versuche, die Seite zu sehen, bekomme ich entweder den Fehler 400 (Heroku) oder den Django-Debug-Bildschirm, von wo die meisten der oben genannten Informationen aufgehoben wurden. Die Berechtigungen unter "Jeder" wird auf "Lesen" gesetzt, also "Jeder authentifizierte AWS-Benutzer" und dann wird der eine Benutzer, den ich über IAM erstellt habe, auf Lesen/Schreiben gesetzt. Vielleicht ist es auch erwähnenswert, dass, wenn ich die vollständige URL zu dieser reset.css-Datei von der S3-Admin greifen und den Pfad (anstatt das {% static%} Tag) fest codieren, es funktioniert und nur ein Problem mit dem nächsten findet Stylesheet im HTML. – DrakeRamoray