Django错误报告通过发送电子邮件处理未捕获的异常,并(可选)向用户显示一个不错的500错误页面.
这非常有效,但在少数情况下,我想让用户不间断地继续他们的业务,但仍然让Django向我发送有关异常的电子邮件错误报告.
所以基本上:即使我发现异常,我还可以手动发送电子邮件错误报告吗?
当然,我想避免手动生成错误报告电子邮件.
我刚刚用gunicorn和Nginx部署了我的Django(1.6)项目.
它似乎工作正常,但我有一个页面,我收到HTTP 500错误,我无法找到任何有关错误的详细信息.
如何让gunicorn向我显示错误?
当我点击页面给出错误时,这是我目前在日志文件中看到的所有内容:
>tail gunicorn.errors
2014-02-21 14:41:02 [22676] [INFO] Listening at: unix:/opt/djangoprojects/reports/bin/gunicorn.sock (22676)
2014-02-21 14:41:02 [22676] [INFO] Using worker: sync
2014-02-21 14:41:02 [22689] [INFO] Booting worker with pid: 22689
...
2014-02-21 19:41:10 [22691] [DEBUG] GET /reports/2/
Run Code Online (Sandbox Code Playgroud)
这是我用来启动gunicorn的bash脚本:
>cat gunicorn_start
#!/bin/bash
NAME="reports" # Name of the application
DJANGODIR=/opt/djangoprojects/reports # Django project directory
SOCKFILE=/opt/djangoprojects/reports/bin/gunicorn.sock # we will communicte using this unix socket
USER=reportsuser # the user to run as
GROUP=webapps # the group to run as
NUM_WORKERS=4 # how many …Run Code Online (Sandbox Code Playgroud) 我刚刚安装了OS X Lion,所以我不得不重新安装Python2.7的所有内容.在这样做时,我将我的Django从1.2.3升级到1.3.当我尝试运行服务器时,我得到一个奇怪的字段错误,我很难解密.
FieldError at /
Unknown field(s) (a, m, s, e, g) specified for Note
Run Code Online (Sandbox Code Playgroud)
这是模型和形式:
class Note(models.Model):
pub_date = models.DateTimeField(default=datetime.now,
auto_now_add=True, db_index=True)
user = models.ForeignKey(User, null=True, blank=True, related_name="writers")
to = models.ForeignKey(User, null=True, blank=True, related_name="tost")
message = models.CharField(default='', max_length=140)
active = models.BooleanField(default=True)
class NoteForm(forms.ModelForm):
class Meta:
model = Note
fields = ('message')
message = forms.CharField(
label=_("Sign the Guestbook"),
widget=forms.Textarea,
required=True)
Run Code Online (Sandbox Code Playgroud) 我想找到多个字符串并将其放在变量中,但是我不断收到错误.
queries <- httpdf %>% filter(str_detect(payload, "create" || "drop" || "select"))
Error: invalid 'x' type in 'x || y'
queries <- httpdf %>% filter(str_detect(payload, "create" | "drop" | "select"))
Error: operations are possible only for numeric, logical or complex types
queries1 <- httpdf %>% filter(str_detect(payload, "create", "drop", "select"))
Error: unused arguments ("drop", "select")
Run Code Online (Sandbox Code Playgroud)
这些都没有奏效.还有其他方法可以做到str_detect或者我应该尝试别的吗?我希望它们也出现在同一列中.
我想用它在我的自定义中间件类的process_exception()方法中生成html日志文件,例如:
我知道Django能够为这些异常发送电子邮件,但我宁愿不使用它.我正在使用JSON开发一个RESTful应用程序,所以返回一个json字符串表示错误500然后将html放在其他地方感觉更合适.
提前致谢.
对不起,也许我需要澄清一下:我不想创建自己的500.html,我想使用当Debug = True时django使用的那个.即生成错误文件并将其放在日志文件夹中.
感谢Mark的帮助 - 这是我对任何感兴趣的人的解决方案:
import logging
import os
import settings
import sys
import datetime
from response import get_json_response
from django.views.debug import ExceptionReporter
logging.config.dictConfig(settings.LOGGING)
LOGGER = logging.getLogger('console_logger')
class LoggingMiddleware(object):
def process_exception(self,request,exception):
exc_type, exc_value, exc_traceback = sys.exc_info()
er = ExceptionReporter(request, exc_type, exc_value, exc_traceback)
time = str(datetime.datetime.now())
file_path = os.path.join(settings.LOG_FOLDER, "{}.html".format(time))
LOGGER.error("Writing error 500 traceback to %s" % file_path)
file_handle = open(file_path,'w')
file_handle.write(er.get_traceback_html())
file_handle.close()
return get_json_response(500,"HTTP Error 500: Internal Server Error")
Run Code Online (Sandbox Code Playgroud)
代码拦截任何异常,使用sys模块和djangos默认错误模板生成格式良好的回溯/异常信息页面,然后在返回JSON对象之前将其放在日志文件夹中,表明存在http错误500.
django django-templates django-middleware django-views django-errors
在django模板中,{{ var }}如果var未定义,则调用将静默失败.这使模板难以调试.有没有我可以切换的设置,所以django会在这种情况下抛出异常?
我在网上找到的解决方案的唯一提示是http://groups.google.com/group/google-appengine/browse_thread/thread/86a5b12ff868038d,听起来非常黑客.
有没有办法我可以自定义Django错误报告,所以当它通过电子邮件发送给我时,它让我知道哪个用户触发了错误?
如果重要的话,我在Django 1.2.
非常感谢提前!
模型.py
class Wishlist(models.Model):
home = models.ForeignKey(Home, on_delete=models.CASCADE, blank=False, null=False)
user = models.ForeignKey(User, on_delete=models.CASCADE, blank=False, null=False)
def __str__(self):
return "{} - {}".format(self.user.username, self.home.address)
class Meta:
ordering = ('user',)
Run Code Online (Sandbox Code Playgroud)
网址.py
urlpatterns = [
path(r'wishlist/<int:pk>/', views.WishlistGetUserItems.as_view(), name='wish-user-list'),
]
Run Code Online (Sandbox Code Playgroud)
视图.py
class WishlistGetUserItems(APIView):
def get(self, request, pk):
wishlist = get_list_or_404(Wishlist, user=pk)
data = serializers.UserWishlistSerializer(wishlist).data
Response(data, status=status.HTTP_200_OK)
Run Code Online (Sandbox Code Playgroud)
我也试过打印消息,但似乎没有调用该方法
python django django-views django-errors django-rest-framework
我的模型中有以下验证功能:
@classmethod
def validate_kind(cls, kind):
if kind == 'test':
raise ValidationError("Invalid question kind")
Run Code Online (Sandbox Code Playgroud)
我正在尝试如下测试:
w = Model.objects.get(id=1)
self.assertRaises(ValidationError, w.validate_kind('test'),msg='Invalid question kind')
Run Code Online (Sandbox Code Playgroud)
我也试过:
self.assertRaisesRegex(w.validate_kind('test'),'Invalid question kind')
Run Code Online (Sandbox Code Playgroud)
这两个都不能正常工作。我究竟做错了什么?
django django-testing django-errors python-unittest django-tests
您可以通过两种方式引发验证错误。第一个是与self.add_error(),第二个是与raise ValidationError()。
我读过,当您使用self.add_error('field1','description here')then时,它field1也会自动从cleaned_data列表中删除,并且我假设 ValidationError 对象也被添加到列表中self.errors,这是正确的吗?
但是,当您不选择使用self.add_error而是选择使用时会发生什么呢raise ValidationError ?这个对象是否也在errors幕后自动添加到列表中?您将如何将此错误消息显示为正确的无效字段下的标题?
谢谢
django-errors ×10
django ×9
python ×3
django-email ×2
django-views ×2
bash ×1
django-tests ×1
gunicorn ×1
nginx ×1
r ×1
string ×1