首页 > 解决方案 > 'ValueError: 未设置必需参数' Django 应用程序遵循 AWS 配置和 Heroku 部署

问题描述

我刚刚将我的 Django 应用程序部署到 Heroku,并将应用程序配置为将媒体文件存储在 AWS S3 存储桶中。在开发服务器中一切正常,但是当我尝试在 Heroku 托管版本中访问包含这些图像的页面时,我收到一个 ValueError 通知我尚未设置所需的参数“名称”。

回顾追溯表明,所谓的无名对象是图像。s3boto3 也被引用。我对 AWS 的配置详述如下:

# settings.py

AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = os.environ.get('AWS_STORAGE_BUCKET_NAME')
AWS_S3_REGION_NAME = os.environ.get('AWS_S3_REGION_NAME')
S3_USE_SIGV4 = os.environ.get('S3_USE_SIGV4')

AWS_S3_FILE_OVERWRITE = False
AWS_DEFAULT_ACL = None
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

# env.py

os.environ.setdefault("AWS_ACCESS_KEY_ID", "**********")
os.environ.setdefault("AWS_SECRET_ACCESS_KEY", "**********")
os.environ.setdefault("AWS_STORAGE_BUCKET_NAME", "**********")
os.environ.setdefault("AWS_S3_REGION_NAME", "eu-west-2")
os.environ.setdefault('S3_USE_SIGV4', 'True')

我已经阅读了可能需要在配置中添加 AWS_SESSION_TOKEN 的建议,但我不知道如何识别我的。我还在其他地方读到会话令牌不是配置的必要部分。我只是在寻找指导,这样我就不会浪费时间尝试无法解决问题的事情。

这是错误:

ValueError at /accelerators/
Required parameter name not set
Request Method: GET
Request URL:    https://acceler8.herokuapp.com/accelerators/
Django Version: 2.2.2
Exception Type: ValueError
Exception Value:    
Required parameter name not set
Exception Location: /app/.heroku/python/lib/python3.6/site-packages/boto3/resources/base.py in __init__, line 119
Python Executable:  /app/.heroku/python/bin/python
Python Version: 3.6.8
Python Path:    
['/app/.heroku/python/bin',
 '/app',
 '/app/.heroku/python/lib/python36.zip',
 '/app/.heroku/python/lib/python3.6',
 '/app/.heroku/python/lib/python3.6/lib-dynload',
 '/app/.heroku/python/lib/python3.6/site-packages']
Server time:    Thu, 22 Aug 2019 08:34:43 +0000
Error during template rendering
In template /app/accounts/templates/accounts/base.html, error at line 39

Required parameter name not set
29              <ul class="navbar-nav">
30                <li class="nav-item">
31                  <a class="nav-item nav-link" href="{% url 'index' %}">Home</a>
32                </li>
33                {% if user.is_superuser %}
34                  <li class="nav-item">
35                    <a class="nav-item nav-link" href="{% url 'accelerator_create' %}">Add Company</a>
36                  </li>
37                {% endif %}
38                  <li class="nav-item">
39                    <a class="nav-item nav-link" href="{% url 'accelerators' %}">Companies</a>
40                  </li>
41                  <li class="nav-item">
42                    <a class="nav-item nav-link" href="{% url 'reviews' %}">Latest Reviews</a>
43                  </li>
44                {% if user.is_authenticated %}
45                  <li class="nav-item">
46                    <a class="nav-item nav-link" href="{% url 'logout' %}">Log Out</a>
47                  </li>
48                {% else %}
49                  <li class="nav-item">
Traceback Switch to copy-and-paste view
/app/.heroku/python/lib/python3.6/site-packages/django/template/base.py in 
_resolve_lookup
                current = current[bit] …
▶ Local vars
During handling of the above exception ('ImageFieldFile' object is not 
subscriptable), another exception occurred:
/app/.heroku/python/lib/python3.6/site- 
packages/django/core/handlers/exception.py in inner
        response = get_response(request) …
▶ Local vars
/app/.heroku/python/lib/python3.6/site- 
packages/django/core/handlers/base.py in _get_response
            response = self.process_exception_by_middleware(e, request) …
▶ Local vars
/app/.heroku/python/lib/python3.6/site- 
packages/django/core/handlers/base.py in _get_response
            response = response.render() …
▶ Local vars
/app/.heroku/python/lib/python3.6/site- 
packages/django/template/response.py in render
        self.content = self.rendered_content …
▶ Local vars
/app/.heroku/python/lib/python3.6/site- 
packages/django/template/response.py in rendered_content
    content = template.render(context, self._request) …
▶ Local vars
/app/.heroku/python/lib/python3.6/site- 
packages/django/template/backends/django.py in render
        return self.template.render(context) …
▶ Local vars
/app/.heroku/python/lib/python3.6/site-packages/django/template/base.py in 
render
                return self._render(context) …
▶ Local vars
/app/.heroku/python/lib/python3.6/site-packages/django/template/base.py in 
_render
    return self.nodelist.render(context) …
▶ Local vars
/app/.heroku/python/lib/python3.6/site-packages/django/template/base.py in 
render
            bit = node.render_annotated(context) …
▶ Local vars
/app/.heroku/python/lib/python3.6/site-packages/django/template/base.py in 
render_annotated
        return self.render(context) …
▶ Local vars
/app/.heroku/python/lib/python3.6/site- 
packages/django/template/loader_tags.py in render
        return compiled_parent._render(context) …
▶ Local vars
/app/.heroku/python/lib/python3.6/site-packages/django/template/base.py in 
_render
    return self.nodelist.render(context) …
▶ Local vars
/app/.heroku/python/lib/python3.6/site-packages/django/template/base.py in 
render
            bit = node.render_annotated(context) …
▶ Local vars
/app/.heroku/python/lib/python3.6/site-packages/django/template/base.py in 
render_annotated
        return self.render(context) …
▶ Local vars
/app/.heroku/python/lib/python3.6/site- 
packages/django/template/loader_tags.py in render
            result = block.nodelist.render(context) …
▶ Local vars
/app/.heroku/python/lib/python3.6/site-packages/django/template/base.py in 
render
            bit = node.render_annotated(context) …
▶ Local vars
/app/.heroku/python/lib/python3.6/site-packages/django/template/base.py in 
render_annotated
        return self.render(context) …
▶ Local vars
/app/.heroku/python/lib/python3.6/site- 
packages/django/template/defaulttags.py in render
            return nodelist.render(context) …
▶ Local vars
/app/.heroku/python/lib/python3.6/site-packages/django/template/base.py in 
render
            bit = node.render_annotated(context) …
▶ Local vars
/app/.heroku/python/lib/python3.6/site-packages/django/template/base.py in 
render_annotated
        return self.render(context) …
▶ Local vars
/app/.heroku/python/lib/python3.6/site- 
packages/django/template/defaulttags.py in render
                nodelist.append(node.render_annotated(context)) …
▶ Local vars
/app/.heroku/python/lib/python3.6/site-packages/django/template/base.py in 
render_annotated
        return self.render(context) …
▶ Local vars
/app/.heroku/python/lib/python3.6/site-packages/django/template/base.py in 
render
        output = self.filter_expression.resolve(context) …
▶ Local vars
/app/.heroku/python/lib/python3.6/site-packages/django/template/base.py in 
resolve
            obj = self.var.resolve(context) …
▶ Local vars
/app/.heroku/python/lib/python3.6/site-packages/django/template/base.py in 
resolve
        value = self._resolve_lookup(context) …
▶ Local vars
/app/.heroku/python/lib/python3.6/site-packages/django/template/base.py in 
_resolve_lookup
                    current = getattr(current, bit) …
▶ Local vars
/app/.heroku/python/lib/python3.6/site- 
packages/django/db/models/fields/files.py in url
    return self.storage.url(self.name) …
▶ Local vars
/app/.heroku/python/lib/python3.6/site- 
packages/storages/backends/s3boto3.py in url
    params['Bucket'] = self.bucket.name …
▼ Local vars
Variable    Value
expire  
3600
name    
'logos/Founderd_Factory_MkvklIQ.png'
parameters  
None
params  
{}
self    
<storages.backends.s3boto3.S3Boto3Storage object at 0x7fef0d5307f0>
/app/.heroku/python/lib/python3.6/site-packages/storages/backends/s3boto3.py in bucket
        self._bucket = self._get_or_create_bucket(self.bucket_name) …
▼ Local vars
Variable    Value
self    
<storages.backends.s3boto3.S3Boto3Storage object at 0x7fef0d5307f0>
/app/.heroku/python/lib/python3.6/site-packages/storages/backends/s3boto3.py in _get_or_create_bucket
    bucket = self.connection.Bucket(name) …
▼ Local vars
Variable    Value
name    
None
self    
<storages.backends.s3boto3.S3Boto3Storage object at 0x7fef0d5307f0>
/app/.heroku/python/lib/python3.6/site-packages/boto3/resources/factory.py in create_resource
                       client=self.meta.client)(*args, **kwargs) …
▶ Local vars
/app/.heroku/python/lib/python3.6/site-packages/boto3/resources/base.py in __init__
                'Required parameter {0} not set'.format(identifier)) …
▶ Local vars

标签: pythondjangoamazon-web-servicesamazon-s3

解决方案


推荐阅读