I crossed your question 5 months ago and didn't found the answer until recently. Many reason might cause this error, but here is what caused it for me.
This answer will probably help you if you have custom routes in your controllers.
First of all, the solution :
You should never redefine any attribute of the `Response` object in a direct manner.
This mean that a line such as
Response.status = '400 Invalid credentials'
will cause this error to occur everytime the route in which you have it is called.
More in-depth about this bug :
When you do
Response.status = '400 Bad request'
you regain control of the Response object, and interrupt the normal workflow of odoo. Therefore, it is no longer able to use it correctly, and every Response returned by any odoo route will have the last status defined until you restart server (in this exemple, 400, so every request is considered as a BadRequest, causing the blank page and diverses others bugs, but 200 would do the same since 302 is necessary for redirections).
If anybody knows why Odoo doesn't regain control of the Response object, feel free to edit this answer (and please do, this bugged me for so long).
So how to modify the response status? :
A quick glance at the core modules gives us the answer
Case of custom HTTP method (Like POST) :
raise werkzeug.exception.BadRequest("400 Invalid credentials")
Note that you can't raise any other error than 400 by default. If you want to do so, you have to modify the http.py file in the odoo's root repertory. But be aware that this probably mean you didn't understood the HTTP protocol, as I did. In fact, most of the time you should return 200, there is no HTTP error so request is a success. However you should add a `error` attribute to the json returned if behavior is not what the client expect (like a wrong password at connexion).
Case of standard method AFAIK (Like GET):
response = werkzeug.wrappers.Response(json.dumps({<i>[your json dictionary]</i>}), status="400 Invalid credentials")
return response