Python 仅当调试设置为False时,生产中出现错误500
我在应用程序中使用Django 1.11 我使用django注册实现了身份验证,并创建了一个配置文件模型来存储一些用户信息: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
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)
我不允许用户上传图片,正如你所看到的。选择化身图像的工作流是:
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