Django ajax error response best practice

后端 未结 5 1543
情书的邮戳
情书的邮戳 2021-02-03 10:16

I\'m using ajax to improve user experience in my Django project. My concern here is how to respond error to browser properly. As far as I know, I can either:

  1. valid
5条回答
  •  悲&欢浪女
    2021-02-03 11:04

    In my opinion:

    1. the second method is not acceptable.
    2. it will not failed since server will still send out a http response.
    3. Let me tell you what I do in my projects:

    when my project starts, I always pre-add a module named errors in top of folder structure, firstly, I will write a base Exception class which inherits from Exception, then write out some common Exception classes like ObjectNotFound, ValidationError from my experience. When I think there should raise an exception in my code, I will use exceptions from this module, and when I find new kind of exception need to be handled, I will write a new exception in it.

    Then it's the work for how to handle them. As you are using Django, it very easy to catch exceptions through a middleware, you can write something like this:

    from youproject import errors
    
    # categorize your exceptions
    400_ERRORS = (errors.ValidationError, errors.ParametersMissing, )
    403_ERRORS = (errors.AuthenticationError, )
    404_ERRORS = (errors.ObjectNotFound, errors.ResourceNotExist, )
    
    class ExceptionHandleMiddleware(object):
        def process_exception(self, request, e):
            # set status_code by category of the exception you caught
            if isinstance(e, 400_ERRORS):
                status_code = 400
            elif isinstance(e, 403_ERRORS):
                status_code = 403
            elif isinstance(e, 404_ERRORS):
                status_code = 404
            else:
                # if the exception not belone to any one you expected,
                # or you just want the response to be 500
                status_code = 500
                # you can do something like write an error log or send report mail here
                logging.error(e)
    
            response_dict = {
                'status': 'error',
                # the format of error message determined by you base exception class
                'msg': str(e)
            }
            if settings.debug:
                # you can even get the traceback infomation when you are in debug mode
                response_dict['traceback'] = traceback.format_exc()
    
            # set header and return the response
            ....
    

    The code above is a summary of how I do exception handle in my projects, in general, it's about accurate exception controling, proper exception categorizing, and of course 'Explicit is better than Implicit' philosophy.

    ===UPDATE=== When it comes to how to deal with the corresponding responses in ajax, you can use the new feature in jquery1.5 statusCode:

    $.ajax({
      statusCode: {
        404: function() {
          alert('page not found');
        }
      }
    });
    

    from jquery documentation:

    A map of numeric HTTP codes and functions to be called when the response has the corresponding code. For example, the following will alert when the response status is a 404

提交回复
热议问题