Return a dictionary containing traceback information.
(self)
| 347 | ) |
| 348 | |
| 349 | def get_traceback_data(self): |
| 350 | """Return a dictionary containing traceback information.""" |
| 351 | if self.exc_type and issubclass(self.exc_type, TemplateDoesNotExist): |
| 352 | self.template_does_not_exist = True |
| 353 | self.postmortem = self.exc_value.chain or [self.exc_value] |
| 354 | |
| 355 | frames = self.get_traceback_frames() |
| 356 | for i, frame in enumerate(frames): |
| 357 | if "vars" in frame: |
| 358 | frame_vars = [] |
| 359 | for k, v in frame["vars"]: |
| 360 | v = pprint(v) |
| 361 | # Trim large blobs of data |
| 362 | if len(v) > 4096: |
| 363 | v = "%s… <trimmed %d bytes string>" % (v[0:4096], len(v)) |
| 364 | frame_vars.append((k, v)) |
| 365 | frame["vars"] = frame_vars |
| 366 | frames[i] = frame |
| 367 | |
| 368 | unicode_hint = "" |
| 369 | if self.exc_type and issubclass(self.exc_type, UnicodeError): |
| 370 | start = getattr(self.exc_value, "start", None) |
| 371 | end = getattr(self.exc_value, "end", None) |
| 372 | if start is not None and end is not None: |
| 373 | unicode_str = self.exc_value.args[1] |
| 374 | unicode_hint = force_str( |
| 375 | unicode_str[max(start - 5, 0) : min(end + 5, len(unicode_str))], |
| 376 | "ascii", |
| 377 | errors="replace", |
| 378 | ) |
| 379 | from django import get_version |
| 380 | |
| 381 | if self.request is None: |
| 382 | user_str = None |
| 383 | else: |
| 384 | try: |
| 385 | user_str = str(self.request.user) |
| 386 | except Exception: |
| 387 | # request.user may raise OperationalError if the database is |
| 388 | # unavailable, for example. |
| 389 | user_str = "[unable to retrieve the current user]" |
| 390 | |
| 391 | c = { |
| 392 | "is_email": self.is_email, |
| 393 | "unicode_hint": unicode_hint, |
| 394 | "frames": frames, |
| 395 | "request": self.request, |
| 396 | "request_meta": self.filter.get_safe_request_meta(self.request), |
| 397 | "request_COOKIES_items": self.filter.get_safe_cookies(self.request).items(), |
| 398 | "user_str": user_str, |
| 399 | "filtered_POST_items": list( |
| 400 | self.filter.get_post_parameters(self.request).items() |
| 401 | ), |
| 402 | "settings": self.filter.get_safe_settings(), |
| 403 | "sys_executable": sys.executable, |
| 404 | "sys_version_info": "%d.%d.%d" % sys.version_info[0:3], |
| 405 | "server_time": timezone.now(), |
| 406 | "django_version_info": get_version(), |