Using a dictionary template for consistent response structure from an API I am making a simple API for news items using Python and the Bottle framework.

I return a Python dictionary from my endpoints as Bottle converts this to JSON automatically in the response to the client.

I wanted to ensure a consistent structure to the responses, so I have declared a template dictionary. The code for each endpoint makes a deep copy of this then modifies the relevant data before returning it.

import bottle
from bottle import route
from copy import deepcopy as deepcopy

# Dictionary for response template
response_dict = {
"status" : "ok",
"code" : 0,
"error" : False,
"message" : "",
"result" : {}
}

# Example route
@route('/example')
def example():
    return_dict = deepcopy(response_dict)
    return_dict["message"] = "Success"
    return_dict["result"] = {
        "title" : "Test Title",
        "body" : "&lt;p&gt;Lorem ipsum dolor sit amet...&lt;/p&gt;"
    }
    return return_dict


I would like to know if there is a better way to use a template for a JSON response and whether the structure of my dictionary is appropriate.
There is no need to use deepcopy here. Just have a function that returns a new object when you need it. And while you're at it, just make the message and the result parameters of that function. Or even all of them:

def json_response(message, result, status="ok", code=0, error=False):
    return {
        "status" : status,
        "code" : code,
        "error" : error,
        "message" : message,
        "result" : result
    }

@route('/example')
def example():
    result = {
        "title" : "Test Title",
        "body" : "&lt;p&gt;Lorem ipsum dolor sit amet...&lt;/p&gt;"
    }
    return json_response("Success", result)


Having all as parameters, but with default values, allows you to do this in the future:

json_response("Failure", None, status="fail", code=404, error=True)


In the end it depends on how often you need to use this template whether or not this is better than just directly returning the dictionary explicitly:

@route('/example')
def example():
    return {
        "status" : "ok",
        "code" : 0,
        "error" : False,
        "message" : "Success",
        "result" : {
            "title" : "Test Title",
            "body" : "&lt;p&gt;Lorem ipsum dolor sit amet...&lt;/p&gt;"
        }
    }