2017-04-20 1 views
2

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 aus
STATICFILES_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:/

+0

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? –

+0

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'? –

+0

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

Antwort

3

Sortiert! Wie zu erwarten, war es etwas ärgerlich Einfaches, aber vielleicht hilft es jedem anderen, der die gleiche Mauer trifft.

Dies:

<link rel="stylesheet" type="text/css" href="{% static '/css/reset.css' %}"> 

benötigt, um dies:

<link rel="stylesheet" type="text/css" href="{% static 'css/reset.css' %}"> 

D.h. kein führender Schrägstrich in der href. Arbeitete gut mit lokalen statischen Dateien Speicher, sondern brach die S3-Link.

Verwandte Themen