2013-08-15 47 views
7

Tôi đã tạo ngoại lệ tùy chỉnh tham chiếu đến http://django-rest-framework.org/api-guide/exceptions.html.Thêm tiêu đề phản hồi tùy chỉnh vào APIException

Xin lưu ý rằng tôi có chương trình phụ trợ xác thực của riêng mình. Do đó tôi không sử dụng mô-đun xác thực của rest_framework.

Đối với lỗi xác thực, tôi muốn thêm tiêu đề 'WWW-Authenticate: Token' vào phản hồi được gửi từ ngoại lệ.

Mọi ý tưởng sẽ rất hữu ích.

Cập nhật:

Cảm ơn @ Pathetique, Đây là những gì tôi đã kết thúc làm.

-Có lớp chế độ xem cơ sở có tên BaseView.

-ghi đè phương thức handle_exception để đặt tiêu đề phù hợp, trong trường hợp của tôi 'WWW-Authenticate'.

Đây là mã:

class BaseView(APIView): 
    def handle_exception(self, exc): 
    if isinstance(exc, MYEXCEPTION): 
     self.headers['WWW-Authenticate'] = "Token" 
     return Response({'detail': exc.detail, 
         status=exc.status_code, exception=True) 

Suy nghĩ của bạn?

+0

gặp cùng một vấn đề và đề xuất của bạn làm việc như nó nên;) – Neara

Trả lời

4

Hãy thử trọng finalize_response theo quan điểm của khuôn khổ phần còn lại của bạn:

def finalize_response(self, request, *args, **kwargs): 
    response = super(SomeAPIView, self).finalize_response(request, *args, **kwargs) 
    response['WWW-Authenticate'] = 'Token' 
    return response 

Edit:

Sau khi nhìn thấy cập nhật của bạn, tôi nghĩ override lại handle_exception nên làm việc, tôi sẽ chỉ làm tăng thêm một tuyên bố nào khác để gọi phương thức cha mẹ để bao gồm các ngoại lệ khác. Một điều tôi nhận thấy trong công văn ghi đè, có thể không phải là vấn đề ở đây, là việc đặt khóa/giá trị mới cho self.headers dẫn đến lỗi máy chủ mà tôi không dành thời gian theo dõi. Dù sao, có vẻ như bạn đang đi đúng hướng.

+0

Cảm ơn Pathetique, hãy có một cái nhìn tại các câu hỏi được cập nhật. Bạn nghĩ sao? – ubhisat

+0

Ahh, xin lỗi tôi đã bỏ lỡ ý nghĩa của Ngoại lệ tùy chỉnh của bạn ... sẽ cập nhật câu trả lời của tôi. – Fiver

1

Sử dụng phương thức authenticate_header trên lớp xác thực của bạn.

Ngoài ra, điều đó cũng đảm bảo phản hồi của bạn cũng có tập mã trạng thái 401 Unauthorized đúng, thay vì 403 Forbidden.

Xem ở đây: http://django-rest-framework.org/api-guide/authentication.html#custom-authentication

+0

Được rồi, tôi nên chú ý hơn đến "Tôi có phụ trợ xác thực của riêng mình" :) –

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