2017-04-20 51 views
2

我已经通过铃声让我的Django应用程序在Heroku上安装,使用Amazon s3来托管静态和媒体文件。我一直在关注本指南https://www.caktusgroup.com/blog/2014/11/10/Using-Amazon-S3-to-store-your-Django-sites-static-and-media-files/以及似乎有成千上万的其他资源,collectstatic已经工作,heroku正在部署它 - 但显示400错误。当我尝试和运行在本地我得到更多的信息:从亚马逊S3调用静态文件的“可疑操作”

Attempted access to '/css/reset.css' denied. 

这是被突出显示的行:

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

我可以加载静态文件从URL直接,如果我从抓住它我s3管理面板,所以我认为这不是一个桶政策问题,我搞砸了https/http选项,但没有喜悦。所以我认为它必须是错误的路径被称为在代码莫名其妙 - 我只是不知道在哪里!

任何帮助非常感谢,我不认为我眨了大约4个小时直。

回溯:

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 

编辑:


我设法得到它通过与settings.py各种值乱搞的工作,但仍是不正确的。

下面是关于静态和媒体路径

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' 

这里是custom_storage说我进口的所有东西:

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 

现在,如果我注释掉

STATICFILES_STORAGE = 'custom_storages.StaticStorage' 

它会从S3加载静态文件,一切正常,但是collectstatic失败。如果我取消注释该行,collectstatic工作,但它会尝试加载该网站时出现错误。错误是:

# 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('/') 

所以很明显的东西是最多与custom_storage一部分,但我不知道:/

+0

如果你右键单击并检查'reset.css'的'href'你得到了什么网址?如果你打开不同的浏览器并粘贴该网址,你能看到它吗? –

+0

另外,如果在S3面板中,你点击该文件的权限,你会得到什么?你在'Group'下有'everyone'的值,而在'Object access'下有'Read'的值吗? –

+0

我实际上看不到href链接 - 当我尝试查看网站时,我得到了400错误(Heroku)或Django调试屏幕,其中大部分上述信息被解除。 “Everyone”下的权限被设置为读取,“任何经过身份验证的AWS用户”也是如此,然后通过IAM创建的用户被设置为读/写。 也可能值得注意的是,如果我从S3管理员获得这个reset.css文件的完整URL并硬编码路径(而不是使用{%static%}标记),它就可以工作,只是发现下一个问题HTML中的样式表。 – DrakeRamoray

回答

3

排序!正如预料的那样,这简直令人讨厌,但也许这将帮助任何碰到同一堵墙的人。

此:

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

需要的是这样的:

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

即在href中没有引导斜线。使用本地静态文件存储工作得很好,但打破了S3链接。