Python 仅当调试设置为False时,生产中出现错误500

Python 仅当调试设置为False时,生产中出现错误500,python,django,django-templates,Python,Django,Django Templates,我在应用程序中使用Django 1.11 我使用django注册实现了身份验证,并创建了一个配置文件模型来存储一些用户信息: class Profile(models.Model): ... user = models.OneToOneField(User) nick = models.CharField(max_length=50) level = models.PositiveIntegerField(null=True) avatar = model

我在应用程序中使用Django 1.11

我使用django注册实现了身份验证,并创建了一个配置文件模型来存储一些用户信息:

class Profile(models.Model):
    ...
    user = models.OneToOneField(User)
    nick = models.CharField(max_length=50)
    level = models.PositiveIntegerField(null=True)
    avatar = models.CharField(max_length=500, null=True, blank=True)
    ...
正在使用以下信号创建/保存此模型:

def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)


def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()

post_save.connect(create_user_profile, sender=User)
post_save.connect(save_user_profile, sender=User)
我不允许用户上传图片,正如你所看到的。选择化身图像的工作流是:

  • 用户访问配置文件配置页面
  • 此页面有一个按钮,用于打开带有图像选项的模式,用户必须选择一个
  • 用户选择一个图像
  • 用户单击以保存更改
  • 我在profile的avatar字段中保存的是必须连接到静态url的字符串,例如,如果图像路径为:

    127.0.0.1:8000/static/account_settings/avatar-images/man2.jpeg
    
    我正在储蓄:

    account_settings/avatar-images/man2.jpeg
    
    我已经在生产中完成了这个工作流程,调试设置为True(由于错误500,使用debug=False无法生成)。因此,我打开了用户公共配置文件页面,它给出了相同的错误

    但我在这个模板中找到了问题的根源:

    {% if public_user.profile.avatar %}
        <img class="img-fluid w-100 u-block-hover__main--zoom-v1" src="{% static public_user.profile.avatar %}" alt="User Avatar Image">
    {% else %}
        <img class="img-fluid w-100 u-block-hover__main--zoom-v1" src="{% static 'assets/img/tmp/avatar.jpg' %}" alt="User Avatar Image">
    {% endif %}
    
    你知道为什么这个代码的结果会让我出错吗

    错误日志:

    2018-01-10T13:53:05.153051+00:00 app[web.1]:     url = self.url(context)
    2018-01-10T13:53:05.153052+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/django/templatetags/static.py", line 102, in url
    2018-01-10T13:53:05.153053+00:00 app[web.1]:     return self.handle_simple(path)
    2018-01-10T13:53:05.153053+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/django/templatetags/static.py", line 117, in handle_simple
    2018-01-10T13:53:05.153054+00:00 app[web.1]:     return staticfiles_storage.url(path)
    2018-01-10T13:53:05.153055+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/django/contrib/staticfiles/storage.py", line 162, in url
    2018-01-10T13:53:05.153055+00:00 app[web.1]:     return self._url(self.stored_name, name, force)
    2018-01-10T13:53:05.153056+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/django/contrib/staticfiles/storage.py", line 141, in _url
    2018-01-10T13:53:05.153057+00:00 app[web.1]:     hashed_name = hashed_name_func(*args)
    2018-01-10T13:53:05.153057+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/django/contrib/staticfiles/storage.py", line 432, in stored_name
    2018-01-10T13:53:05.153063+00:00 app[web.1]:     raise ValueError("Missing staticfiles manifest entry for '%s'" % clean_name)
    2018-01-10T13:53:05.153064+00:00 app[web.1]: ValueError: Missing staticfiles manifest entry for 'account_settings/avatar-images/man2.674506bb8a45.jpeg'
    

    尝试将管理员电子邮件添加到您的设置中,这将为您提供一种方法来确定发生错误500时的错误消息

    服务器\u电子邮件地址:ur@from-电邮地址 管理员=( (‘例外电子邮件’,’destination@email.com'), )

    您可能还需要设置smtp设置

    试试这个

    {% if public_user.profile.avatar %}
        {% with public_user.profile.avatar as img_url %}
        <img class="img-fluid w-100 u-block-hover__main--zoom-v1" src="{% static img_url %}" alt="User Avatar Image">
        {% endwith %}
    {% else %}
        <img class="img-fluid w-100 u-block-hover__main--zoom-v1" src="{% static 'assets/img/tmp/avatar.jpg' %}" alt="User Avatar Image">
    {% endif %}
    
    {%if public_user.profile.avatar%}
    {%以public_user.profile.avatar作为img_url%}
    {%endwith%}
    {%else%}
    {%endif%}
    
    我已经找出了问题的症结所在,之前我通过wholevinski的评论和帮助找到了详细的日志。我不想回答我自己的问题,但我会在这里这样做,以记录我是如何解决这个问题的

    现在发生的事情是,我正在使用WhiteNoise来为我的静态文件提供服务,它正在压缩我的静态文件,以便能够拥有

    在我的代码中,我有:

    STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
    
    我的代码中的下一行使whitenoise创建文件版本,并将文件内容的md5哈希附加到原始文件名,因此,例如,“filename.jpeg”生成一个文件“filename.674506bb8a45.jpeg”,该文件将提供给用户。如果服务器文件与用户浏览器中缓存的文件不同,那么md5将不同,新文件将提供给用户

    问题是我通过javascript获取图像文件名,并将其保存在我的数据库中:

    account_settings/avatar-images/man2.674506bb8a45.jpeg
    
    而不是

    account_settings/avatar-images/man2.jpeg
    

    为了解决这个问题,我改变了javascript,忽略了md5版本。现在我正在保存帐户设置/avatar images/man2.jpeg,问题就解决了。

    如果你得到的是500,那么日志中几乎肯定有错误。为了安全起见,Django只允许您在启用调试时执行一些操作。我会检查你的设置。如果您试图设置日志记录,以便查看实际错误,这也可能会有所帮助。@wholevinski在我使用“heroku logs”访问的日志中,只有一行包含错误代码和完成的GET请求。我正在试图找到一种方法来获取详细的日志,我会尽快用它更新我的问题嗯,好的。看起来Heroku需要一个流记录器。所以,把它放在您的配置文件中:
    LOGGING={'version':1,“disable_existing_loggers”:False,“handlers':{'console':{'class':'LOGGING.StreamHandler',},},},'loggers':{'django':{'handlers':['console'],'level:'DEBUG'}
    之后,通过运行heroku日志,您应该可以获得更多的日志记录。实际上,请检查您的设置文件。查看是否将
    STATICFILES\u存储设置为
    ManifestStaticFilesStorage
    。如果是这样,请注释掉该行,看看这是否可以修复它。检查此线程:
    account_settings/avatar-images/man2.jpeg