Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Identify if Flask request is from JavaScript or not

I want to create a Flask error handler that returns a JSON response if the request was from JavaScript but returns a redirect otherwise. I tried using request.is_xhr, but it is false even for JavaScript requests. How can I check if the request is from JavaScript?

@app.errorhandler(Exception)
def unhandled_exception(error):
    if request.is_xhr:
        return flask.jsonify(error='yes')

    return redirect(url_for('error'))
like image 632
Mayur Patel Avatar asked Sep 05 '25 03:09

Mayur Patel


2 Answers

There is no standard or reliable way to detect if a request comes from a particular source, such as JavaScript.

is_xhr was only true when a certain header was set by some JavaScript libraries, such as jQuery. The header is not sent by most JavaScript. is_xhr has been deprecated for that reason.

You can check the Accept header to see if the client is asking for application/json, but that too is unreliable.

if request.is_xhr or request.accept_mimetypes.accept_json:
    return jsonify(...)

return redirect(...)
like image 85
davidism Avatar answered Sep 07 '25 19:09

davidism


Answer by @davidism makes sense. is_xhr was only true when a certain header was set by some JavaScript libraries. So, I have set header 'X-Requested-With' to 'XMLHttpRequest' manually in '$httpProvider' config in AngularJs. This ensures that on the back end I will get 'is_xhr' true for AJAX request.

app.config([
    '$httpProvider',
    function ($httpProvider) {
        $httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
        var interceptor = [
            '$q',
            '$rootScope',
            function ($q, $rootScope) {
                    'responseError': function (rejection) {
                        if(rejection.status != undefined && rejection.status != 'undefined') {
                            window.location.href = '/error';
                        }
                    }
                };
                return service;
            }
        ];
        $httpProvider.interceptors.push(interceptor);
    }
]);
like image 44
Mayur Patel Avatar answered Sep 07 '25 19:09

Mayur Patel