I'm struggling with raising a bad request in an api that gives a json back. The idea is:
if True:
raise BadRequest({'error_message' : 'stuff',
'suggestions' : 'other stuff'})
clearly this won't work, but I'm not sure if it's against the logic to return a json with a bad request.
You are using the terms "return" and "raise" in a confusing way. They have very precise meanings.
You can only "raise" a subclass of Exception. The execution path of the program after the "raise" statement follows the rules of Python exception handling. A function that raises an Exception does not return. You can create a subclass of Exception where the argument is a dictionary, as in your example. That would be similar to a JSON object, but it must still be a subclass of Exception if you want to use it a raise statement.
You can "return" any kind of object from a function. The execution path of the program follows the rules of Python function calls and returns. The returned object could be a JSON object, and the contents of the object might be an error message. But if your function returns this type of object, your client code must inspect this object to determine that an error occurred.