当debug设置为False时,生产中出现错误500

时间:2018-01-10 13:02:53

标签: python django django-templates

我在我的应用程序中使用Django 1.11。

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

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)

好吧,我不允许用户上传图片,如你所见。选择头像图像的工作流程为:

  1. 用户访问配置文件配置页
  2. 此页面有一个按钮,用于打开带有图像选项的模态,用户必须选择一个。
  3. 用户选择图像。
  4. 用户点击保存更改。
  5. 我在个人资料的头像字段中保存的是一个必须连接到静态网址的字符串,例如,如果图片路径是:

    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 %}
    

    如果在public_user.profile.avatar中存在某些内容,我的错误为500.但是如果配置文件没有图像,则可以正常工作。我不知道为什么这段代码不起作用:

    {% static public_user.profile.avatar %}
    

    为什么这段代码的结果让我错误?

    错误日志:

    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'
    

3 个答案:

答案 0 :(得分:1)

在查看了wholevinski通过他的评论和他的帮助找到帮助我找到的详细日志后,我发现了问题是什么。我不想回答我自己的问题,但我会在这里记录我是如何解决问题的。

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

在我的代码中,我有:

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版本。现在我正在保存account_settings / avatar-images / man2.jpeg,问题就消失了。

答案 1 :(得分:0)

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

SERVER_EMAIL ='ur@from-email-address.com' ADMINS =(     ('Exceptions Email','destination@email.com'), )

您可能还需要设置smtp设置

答案 2 :(得分:0)

试试这个

{% 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 %}