# Buggy code
def put(self, name):
    """add new datasource"""
    data = {}

    def on_field(field):
        print(f"\n\n{field}\n\n")
        name = field.field_name.decode()
        value = field.value.decode()
        data[name] = value

    def on_file(file):
        data["file"] = file.file_name.decode()

    temp_dir_path = tempfile.mkdtemp(prefix="datasource_file_")

    if request.headers["Content-Type"].startswith("multipart/form-data"):
        parser = multipart.create_form_parser(
            headers=request.headers,
            on_field=on_field,
            on_file=on_file,
            config={
                "UPLOAD_DIR": temp_dir_path.encode(),  # bytes required
                "UPLOAD_KEEP_FILENAME": True,
                "UPLOAD_KEEP_EXTENSIONS": True,
                "MAX_MEMORY_FILE_SIZE": 0,
            },
        )

        while True:
            chunk = request.stream.read(8192)
            if not chunk:
                break
            parser.write(chunk)
        parser.finalize()
        parser.close()
    else:
        data = request.json

    ds_name = data["name"] if "name" in data else name
    source = data["source"] if "source" in data else name
    source_type = data["source_type"]

    if source_type == "file":
        file_path = os.path.join(temp_dir_path, data["file"])
    else:
        file_path = None

    g.default_store.save_datasource(ds_name, source_type, source, file_path)
    os.rmdir(temp_dir_path)

    return g.default_store.get_datasource(ds_name)


# Traceback (AttributeError)
2020-06-25 14:30:32,318 - INFO - Starting MindsDB Mysql proxy server on tcp://127.0.0.1:47335
2020-06-25 14:30:32,334 - INFO - Waiting for incoming connections...
127.0.0.1 - - [25/Jun/2020 14:31:14] "GET /util/ping HTTP/1.1" 200 -
Exception on /datasources/ [GET]
Traceback (most recent call last):
File "/home/zoran/MyProjects/mindsdb-examples/new/lib/python3.7/site-packages/flask/app.py", line 1950, in full_dispatch_request
rv = self.dispatch_request()
File "/home/zoran/MyProjects/mindsdb-examples/new/lib/python3.7/site-packages/flask/app.py", line 1936, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/zoran/MyProjects/mindsdb-examples/new/lib/python3.7/site-packages/flask_restx/api.py", line 375, in wrapper
resp = resource(*args, **kwargs)
File "/home/zoran/MyProjects/mindsdb-examples/new/lib/python3.7/site-packages/flask/views.py", line 89, in view
return self.dispatch_request(*args, **kwargs)
File "/home/zoran/MyProjects/mindsdb-examples/new/lib/python3.7/site-packages/flask_restx/resource.py", line 44, in dispatch_request
resp = meth(*args, **kwargs)
File "/home/zoran/MyProjects/mindsdb-examples/new/lib/python3.7/site-packages/flask_restx/marshalling.py", line 248, in wrapper
resp = f(*args, **kwargs)
File "/home/zoran/MyProjects/mindsdb-examples/new/lib/python3.7/site-packages/mindsdb/api/http/namespaces/datasource.py", line 40, in get
return g.default_store.get_datasources()
File "/home/zoran/MyProjects/mindsdb-examples/new/lib/python3.7/site-packages/werkzeug/local.py", line 347, in __getattr__
return getattr(self._get_current_object(), name)
AttributeError: '_AppCtxGlobals' object has no attribute 'default_store'
127.0.0.1 - - [25/Jun/2020 14:31:18] "GET /datasources/ HTTP/1.1" 500 -
Exception on /datasources/ [GET]

# Fixed code
def put(self, name):
    """add new datasource"""
    data = {}

    def on_field(field):
        print(f"\n\n{field}\n\n")
        name = field.field_name.decode()
        value = field.value.decode()
        data[name] = value

    def on_file(file):
        data["file"] = file.file_name.decode()

    temp_dir_path = tempfile.mkdtemp(prefix="datasource_file_")

    if request.headers["Content-Type"].startswith("multipart/form-data"):
        parser = multipart.create_form_parser(
            headers=request.headers,
            on_field=on_field,
            on_file=on_file,
            config={
                "UPLOAD_DIR": temp_dir_path.encode(),  # bytes required
                "UPLOAD_KEEP_FILENAME": True,
                "UPLOAD_KEEP_EXTENSIONS": True,
                "MAX_MEMORY_FILE_SIZE": 0,
            },
        )

        while True:
            chunk = request.stream.read(8192)
            if not chunk:
                break
            parser.write(chunk)
        parser.finalize()
        parser.close()
    else:
        data = request.json

    ds_name = data["name"] if "name" in data else name
    source = data["source"] if "source" in data else name
    source_type = data["source_type"]

    if source_type == "file":
        file_path = os.path.join(temp_dir_path, data["file"])
    else:
        file_path = None

    ca.default_store.save_datasource(ds_name, source_type, source, file_path)
    os.rmdir(temp_dir_path)

    return ca.default_store.get_datasource(ds_name)