2011-02-07 41 views
11

Trong khi phát triển, tôi đang chạy Django trong chế độ Gỡ lỗi và tôi đang đăng dữ liệu lên ứng dụng của mình bằng ứng dụng chế độ văn bản. Lý tưởng nhất, tôi cần phải nhận được một phản ứng văn bản đơn giản khi tôi nhận được một mã lỗi http 500 vì vậy tôi không phải tìm lỗi thực sự bên trong tất cả các HTML và Javascript.Cách lấy một trang văn bản thuần lỗi Django

Có thể lấy lỗi Máy chủ nội bộ của Django 500 dưới dạng văn bản thuần túy không?

Trả lời

7

Tôi nghĩ để viết một middleware, bởi vì nếu không là ngoại lệ không có sẵn trong các 500.html

http://docs.djangoproject.com/en/dev/topics/http/middleware/#process-exception

class ProcessExceptionMiddleware(object): 
    def process_exception(self, request, exception): 
     t = Template("500 Error: {{ exception }}") 
     response_html = t.render(Context({'exception' : exception })) 

     response = http.HttpResponse(response_html) 
     response.status_code = 500 
     return response 
+0

Tác phẩm này, cảm ơn. Vấn đề bây giờ là truy cập theo dõi ngăn xếp, bởi vì "ngoại lệ" chỉ là một đối tượng Ngoại lệ thông thường. – simao

+0

Xin chúc mừng! Nhìn vào 'sys.exc_info()' để truy cập vào truy nguyên. Tôi đề nghị tìm kiếm trực tiếp tại mã django mà không định dạng traceback bình thường trong 'django.core.handlers.base' để thực hiện phiên bản của riêng bạn. –

+0

Vâng, hoạt động. cảm ơn. – simao

9

Có một thiết DEBUG_PROPAGATE_EXCEPTIONS mà sẽ buộc Django đừng bó trường hợp ngoại lệ, để bạn có thể thấy chúng, ví dụ trong nhật ký máy chủ.

1

Đây là một cải tiến về câu trả lời của Yuji, cung cấp một ngăn xếp, hướng dẫn thêm (đối với chúng tôi django newbies) và đơn giản hơn.

Đặt mã này vào một tệp ở đâu đó trong ứng dụng của bạn, ví dụ: PROJECT_ROOT/MAIN_APP/middleware/exceptions.py và đảm bảo bạn có một số trống __init__.py trong cùng một thư mục.

import traceback 
from django.http import HttpResponse 

class PlainExceptionsMiddleware(object): 
    def process_exception(self, request, exception): 
     return HttpResponse(traceback.format_exc(exception), content_type="text/plain", status=500) 

Bây giờ, hãy chỉnh sửa settings.py và tìm MIDDLEWARE_CLASSES = (. Thêm một mục nhập khác để nó giống như thế này:

MIDDLEWARE_CLASSES = (
    # (all the previous entries) 

    # Plain text exception pages. 
    'MAIN_APP.middleware.exceptions.PlainExceptionsMiddleware', 
) 

Khởi động lại django và bạn tốt!

Định dạng nhận dạng tác nhân người dùng.

Nếu bạn thích tôi và phát triển một ứng dụng và trang web đều được hỗ trợ bởi django, bạn có thể muốn hiển thị các trang lỗi văn bản đơn giản và ứng dụng được định dạng tốt cho trình duyệt. Một cách đơn giản để đến đó là để kiểm tra các đại lý người dùng:

import traceback 
from django.http import HttpResponse 

class PlainExceptionsMiddleware(object): 
    def process_exception(self, request, exception): 
     if "HTTP_USER_AGENT" in request.META and "chrome" in request.META["HTTP_USER_AGENT"].lower(): 
      return 
     return HttpResponse(traceback.format_exc(exception), content_type="text/plain", status=500) 
14

Nếu bạn đang tìm kiếm một cách để có được một trang lỗi văn bản đơn giản khi sử dụng curl, bạn cần phải thêm tiêu đề HTTP X-Requested-With với giá trị XMLHttpRequest , ví dụ

curl -H 'X-Requested-With: XMLHttpRequest' http://example.com/some/url/ 

Giải thích: đây là vì Django sử dụng phương pháp is_ajax để xác định có hay không trở lại dưới dạng văn bản thuần hoặc dưới dạng HTML. is_ajax lần lượt xem X-Requested-With.

Các vấn đề liên quan