diff --git a/environ/environ.py b/environ/environ.py
index acdfb15..ccbca70 100644
--- a/environ/environ.py
+++ b/environ/environ.py
@@ -21,6 +21,7 @@ import warnings
 from urllib.parse import (
     parse_qs,
     ParseResult,
+    unquote,
     unquote_plus,
     urlparse,
     urlunparse,
@@ -61,7 +62,7 @@ def _cast_int(v):
 
 
 def _cast_urlstr(v):
-    return unquote_plus(v) if isinstance(v, str) else v
+    return unquote(v) if isinstance(v, str) else v
 
 
 class NoValue:
@@ -365,10 +366,10 @@ class Env:
 
         try:
             value = self.ENVIRON[var]
-        except KeyError:
+        except KeyError as exc:
             if default is self.NOTSET:
                 error_msg = "Set the {} environment variable".format(var)
-                raise ImproperlyConfigured(error_msg)
+                raise ImproperlyConfigured(error_msg) from exc
 
             value = default
 

diff --git a/tests/test_env.py b/tests/test_env.py
index 59110e3..d154708 100644
--- a/tests/test_env.py
+++ b/tests/test_env.py
@@ -45,6 +45,7 @@ class TestEnv:
         with pytest.raises(ImproperlyConfigured) as excinfo:
             self.env('not_present')
         assert str(excinfo.value) == 'Set the not_present environment variable'
+        assert excinfo.value.__cause__ is not None
 
     def test_contains(self):
         assert 'STR_VAR' in self.env
diff --git a/tests/test_utils.py b/tests/test_utils.py
index 523a72d..f32d7cc 100644
--- a/tests/test_utils.py
+++ b/tests/test_utils.py
@@ -7,7 +7,7 @@
 # the LICENSE.txt file that was distributed with this source code.
 
 import pytest
-from environ.environ import _cast
+from environ.environ import _cast, _cast_urlstr
 
 
 @pytest.mark.parametrize(
@@ -20,3 +20,20 @@ def test_cast(literal):
 
     See https://github.com/joke2k/django-environ/issues/200 for details."""
     assert _cast(literal) == literal
+
+@pytest.mark.parametrize(
+    "quoted_url_str,expected_unquoted_str",
+    [
+        ("Le-%7BFsIaYnaQw%7Da2B%2F%5BV8bS+", "Le-{FsIaYnaQw}a2B/[V8bS+"),
+        ("my_test-string+", "my_test-string+"),
+        ("my%20test%20string+", "my test string+")
+    ]
+)
+def test_cast_urlstr(quoted_url_str, expected_unquoted_str):
+    """Make sure that a url str that contains plus sign literals does not get unquoted incorrectly
+    Plus signs should not be converted to spaces, since spaces are encoded with %20 in URIs
+
+    see https://github.com/joke2k/django-environ/issues/357 for details.
+    related to https://github.com/joke2k/django-environ/pull/69"""
+
+    assert _cast_urlstr(quoted_url_str) == expected_unquoted_str

Attach cause to ImproperlyConfigured exception raised for missing environment variables
I'd like to propose to add the original exception as the cause of the `ImproperlyConfigured` exception that's raised when an environment variable is missing using `raise ... from ...`:

```py
        try:
            value = self.ENVIRON[var]
        except KeyError as exc:
            if default is self.NOTSET:
                error_msg = "Set the {} environment variable".format(var)
                raise ImproperlyConfigured(error_msg) from exc
```

The original:

https://github.com/joke2k/django-environ/blob/509cf7737363a56e4464962dbae4ab72b801c7b3/environ/environ.py#L366-L371

Note: Since it's a two-line change, I've opened #361 to introduce this change. I know that the proposal hasn't been discussed yet, but I figured not a lot of work is lost if it's rejected.

## Background
The main difference is that this will mark the original `KeyError` as the explicit cause of the `ImproperlyConfigered`, instead of marking the `ImproperlyConfigured` as another exception that "happened to happen" during the handling of the `KeyError`. (A better explanation is given by Martijn Pieters [here](https://stackoverflow.com/questions/24752395/python-raise-from-usage/24752607#24752607)).


## Differences for end-users
The most notable difference is the output. The proposed change would change the traceback output to:

```python-traceback
Traceback (most recent call last):
  (...)
KeyError: 'missing_key'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  (...)
environ.compat.ImproperlyConfigured: Set the missing_key environment variable
```

instead of 

```python-traceback
Traceback (most recent call last):
  (...)
KeyError: 'missing_key'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  (...)
environ.compat.ImproperlyConfigured: Set the missing_key environment variable
```

Notice that the middle line that indicates the relationship between the two exceptions has changed.

Additionally, the original exception will now be attached to the `ImproperlyConfigured` exception under the `__cause__` attribute instead of the `__context__` attribute.
tests/test_env.py::TestEnv::test_not_present_without_default tests/test_env.py::TestFileEnv::test_not_present_without_default tests/test_env.py::TestSubClass::test_not_present_without_default tests/test_utils.py::test_cast_urlstr[Le-%7BFsIaYnaQw%7Da2B%2F%5BV8bS+-Le-{FsIaYnaQw}a2B/[V8bS+] tests/test_utils.py::test_cast_urlstr[my_test-string+-my_test-string+] tests/test_utils.py::test_cast_urlstr[my%20test%20string+-my
tests/test_env.py::TestEnv::test_not_present_with_default tests/test_env.py::TestEnv::test_contains tests/test_env.py::TestEnv::test_str[STR_VAR-bar-False] tests/test_env.py::TestEnv::test_str[MULTILINE_STR_VAR-foo\\nbar-False] tests/test_env.py::TestEnv::test_str[MULTILINE_STR_VAR-foo\nbar-True] tests/test_env.py::TestEnv::test_str[MULTILINE_QUOTED_STR_VAR----BEGIN---\\r\\n---END----False] tests/test_env.py::TestEnv::test_str[MULTILINE_QUOTED_STR_VAR----BEGIN---\n---END----True] tests/test_env.py::TestEnv::test_str[MULTILINE_ESCAPED_STR_VAR----BEGIN---\\\\n---END----False] tests/test_env.py::TestEnv::test_str[MULTILINE_ESCAPED_STR_VAR----BEGIN---\\\n---END----True] tests/test_env.py::TestEnv::test_bytes[STR_VAR-bar-default0] tests/test_env.py::TestEnv::test_bytes[NON_EXISTENT_BYTES_VAR-some-default-some-default] tests/test_env.py::TestEnv::test_bytes[NON_EXISTENT_STR_VAR-some-default-some-default] tests/test_env.py::TestEnv::test_int tests/test_env.py::TestEnv::test_int_with_none_default tests/test_env.py::TestEnv::test_float[33.3-FLOAT_VAR] tests/test_env.py::TestEnv::test_float[33.3-FLOAT_COMMA_VAR] tests/test_env.py::TestEnv::test_float[123420333.3-FLOAT_STRANGE_VAR1] tests/test_env.py::TestEnv::test_float[123420333.3-FLOAT_STRANGE_VAR2] tests/test_env.py::TestEnv::test_float[-1.0-FLOAT_NEGATIVE_VAR] tests/test_env.py::TestEnv::test_bool_true[True-BOOL_TRUE_STRING_LIKE_INT] tests/test_env.py::TestEnv::test_bool_true[True-BOOL_TRUE_STRING_LIKE_BOOL] tests/test_env.py::TestEnv::test_bool_true[True-BOOL_TRUE_INT] tests/test_env.py::TestEnv::test_bool_true[True-BOOL_TRUE_BOOL] tests/test_env.py::TestEnv::test_bool_true[True-BOOL_TRUE_STRING_1] tests/test_env.py::TestEnv::test_bool_true[True-BOOL_TRUE_STRING_2] tests/test_env.py::TestEnv::test_bool_true[True-BOOL_TRUE_STRING_3] tests/test_env.py::TestEnv::test_bool_true[True-BOOL_TRUE_STRING_4] tests/test_env.py::TestEnv::test_bool_true[True-BOOL_TRUE_STRING_5] tests/test_env.py::TestEnv::test_bool_true[False-BOOL_FALSE_STRING_LIKE_INT] tests/test_env.py::TestEnv::test_bool_true[False-BOOL_FALSE_INT] tests/test_env.py::TestEnv::test_bool_true[False-BOOL_FALSE_STRING_LIKE_BOOL] tests/test_env.py::TestEnv::test_bool_true[False-BOOL_FALSE_BOOL] tests/test_env.py::TestEnv::test_proxied_value tests/test_env.py::TestEnv::test_escaped_dollar_sign tests/test_env.py::TestEnv::test_escaped_dollar_sign_disabled tests/test_env.py::TestEnv::test_int_list tests/test_env.py::TestEnv::test_int_tuple tests/test_env.py::TestEnv::test_str_list_with_spaces tests/test_env.py::TestEnv::test_empty_list tests/test_env.py::TestEnv::test_dict_value tests/test_env.py::TestEnv::test_complex_dict_value tests/test_env.py::TestEnv::test_dict_parsing[dict] tests/test_env.py::TestEnv::test_dict_parsing[dict_int] tests/test_env.py::TestEnv::test_dict_parsing[dict_float] tests/test_env.py::TestEnv::test_dict_parsing[dict_str_list] tests/test_env.py::TestEnv::test_dict_parsing[dict_int_list] tests/test_env.py::TestEnv::test_dict_parsing[dict_int_cast] tests/test_env.py::TestEnv::test_dict_parsing[dict_str_cast] tests/test_env.py::TestEnv::test_url_value tests/test_env.py::TestEnv::test_url_encoded_parts tests/test_env.py::TestEnv::test_db_url_value[postgres] tests/test_env.py::TestEnv::test_db_url_value[mysql] tests/test_env.py::TestEnv::test_db_url_value[mysql_gis] tests/test_env.py::TestEnv::test_db_url_value[oracle_tns] tests/test_env.py::TestEnv::test_db_url_value[oracle] tests/test_env.py::TestEnv::test_db_url_value[redshift] tests/test_env.py::TestEnv::test_db_url_value[sqlite] tests/test_env.py::TestEnv::test_db_url_value[custom] tests/test_env.py::TestEnv::test_db_url_value[cloudsql] tests/test_env.py::TestEnv::test_cache_url_value[memcached] tests/test_env.py::TestEnv::test_cache_url_value[redis] tests/test_env.py::TestEnv::test_email_url_value tests/test_env.py::TestEnv::test_json_value tests/test_env.py::TestEnv::test_path tests/test_env.py::TestEnv::test_smart_cast tests/test_env.py::TestEnv::test_exported tests/test_env.py::TestFileEnv::test_not_present_with_default tests/test_env.py::TestFileEnv::test_contains tests/test_env.py::TestFileEnv::test_str[STR_VAR-bar-False] tests/test_env.py::TestFileEnv::test_str[MULTILINE_STR_VAR-foo\\nbar-False] tests/test_env.py::TestFileEnv::test_str[MULTILINE_STR_VAR-foo\nbar-True] tests/test_env.py::TestFileEnv::test_str[MULTILINE_QUOTED_STR_VAR----BEGIN---\\r\\n---END----False] tests/test_env.py::TestFileEnv::test_str[MULTILINE_QUOTED_STR_VAR----BEGIN---\n---END----True] tests/test_env.py::TestFileEnv::test_str[MULTILINE_ESCAPED_STR_VAR----BEGIN---\\\\n---END----False] tests/test_env.py::TestFileEnv::test_str[MULTILINE_ESCAPED_STR_VAR----BEGIN---\\\n---END----True] tests/test_env.py::TestFileEnv::test_bytes[STR_VAR-bar-default0] tests/test_env.py::TestFileEnv::test_bytes[NON_EXISTENT_BYTES_VAR-some-default-some-default] tests/test_env.py::TestFileEnv::test_bytes[NON_EXISTENT_STR_VAR-some-default-some-default] tests/test_env.py::TestFileEnv::test_int tests/test_env.py::TestFileEnv::test_int_with_none_default tests/test_env.py::TestFileEnv::test_float[33.3-FLOAT_VAR] tests/test_env.py::TestFileEnv::test_float[33.3-FLOAT_COMMA_VAR] tests/test_env.py::TestFileEnv::test_float[123420333.3-FLOAT_STRANGE_VAR1] tests/test_env.py::TestFileEnv::test_float[123420333.3-FLOAT_STRANGE_VAR2] tests/test_env.py::TestFileEnv::test_float[-1.0-FLOAT_NEGATIVE_VAR] tests/test_env.py::TestFileEnv::test_bool_true[True-BOOL_TRUE_STRING_LIKE_INT] tests/test_env.py::TestFileEnv::test_bool_true[True-BOOL_TRUE_STRING_LIKE_BOOL] tests/test_env.py::TestFileEnv::test_bool_true[True-BOOL_TRUE_INT] tests/test_env.py::TestFileEnv::test_bool_true[True-BOOL_TRUE_BOOL] tests/test_env.py::TestFileEnv::test_bool_true[True-BOOL_TRUE_STRING_1] tests/test_env.py::TestFileEnv::test_bool_true[True-BOOL_TRUE_STRING_2] tests/test_env.py::TestFileEnv::test_bool_true[True-BOOL_TRUE_STRING_3] tests/test_env.py::TestFileEnv::test_bool_true[True-BOOL_TRUE_STRING_4] tests/test_env.py::TestFileEnv::test_bool_true[True-BOOL_TRUE_STRING_5] tests/test_env.py::TestFileEnv::test_bool_true[False-BOOL_FALSE_STRING_LIKE_INT] tests/test_env.py::TestFileEnv::test_bool_true[False-BOOL_FALSE_INT] tests/test_env.py::TestFileEnv::test_bool_true[False-BOOL_FALSE_STRING_LIKE_BOOL] tests/test_env.py::TestFileEnv::test_bool_true[False-BOOL_FALSE_BOOL] tests/test_env.py::TestFileEnv::test_proxied_value tests/test_env.py::TestFileEnv::test_escaped_dollar_sign tests/test_env.py::TestFileEnv::test_escaped_dollar_sign_disabled tests/test_env.py::TestFileEnv::test_int_list tests/test_env.py::TestFileEnv::test_int_tuple tests/test_env.py::TestFileEnv::test_str_list_with_spaces tests/test_env.py::TestFileEnv::test_empty_list tests/test_env.py::TestFileEnv::test_dict_value tests/test_env.py::TestFileEnv::test_complex_dict_value tests/test_env.py::TestFileEnv::test_dict_parsing[dict] tests/test_env.py::TestFileEnv::test_dict_parsing[dict_int] tests/test_env.py::TestFileEnv::test_dict_parsing[dict_float] tests/test_env.py::TestFileEnv::test_dict_parsing[dict_str_list] tests/test_env.py::TestFileEnv::test_dict_parsing[dict_int_list] tests/test_env.py::TestFileEnv::test_dict_parsing[dict_int_cast] tests/test_env.py::TestFileEnv::test_dict_parsing[dict_str_cast] tests/test_env.py::TestFileEnv::test_url_value tests/test_env.py::TestFileEnv::test_url_encoded_parts tests/test_env.py::TestFileEnv::test_db_url_value[postgres] tests/test_env.py::TestFileEnv::test_db_url_value[mysql] tests/test_env.py::TestFileEnv::test_db_url_value[mysql_gis] tests/test_env.py::TestFileEnv::test_db_url_value[oracle_tns] tests/test_env.py::TestFileEnv::test_db_url_value[oracle] tests/test_env.py::TestFileEnv::test_db_url_value[redshift] tests/test_env.py::TestFileEnv::test_db_url_value[sqlite] tests/test_env.py::TestFileEnv::test_db_url_value[custom] tests/test_env.py::TestFileEnv::test_db_url_value[cloudsql] tests/test_env.py::TestFileEnv::test_cache_url_value[memcached] tests/test_env.py::TestFileEnv::test_cache_url_value[redis] tests/test_env.py::TestFileEnv::test_email_url_value tests/test_env.py::TestFileEnv::test_json_value tests/test_env.py::TestFileEnv::test_path tests/test_env.py::TestFileEnv::test_smart_cast tests/test_env.py::TestFileEnv::test_exported tests/test_env.py::TestFileEnv::test_read_env_path_like tests/test_env.py::TestFileEnv::test_existing_overwrite[True] tests/test_env.py::TestFileEnv::test_existing_overwrite[False] tests/test_env.py::TestSubClass::test_not_present_with_default tests/test_env.py::TestSubClass::test_contains tests/test_env.py::TestSubClass::test_str[STR_VAR-bar-False] tests/test_env.py::TestSubClass::test_str[MULTILINE_STR_VAR-foo\\nbar-False] tests/test_env.py::TestSubClass::test_str[MULTILINE_STR_VAR-foo\nbar-True] tests/test_env.py::TestSubClass::test_str[MULTILINE_QUOTED_STR_VAR----BEGIN---\\r\\n---END----False] tests/test_env.py::TestSubClass::test_str[MULTILINE_QUOTED_STR_VAR----BEGIN---\n---END----True] tests/test_env.py::TestSubClass::test_str[MULTILINE_ESCAPED_STR_VAR----BEGIN---\\\\n---END----False] tests/test_env.py::TestSubClass::test_str[MULTILINE_ESCAPED_STR_VAR----BEGIN---\\\n---END----True] tests/test_env.py::TestSubClass::test_bytes[STR_VAR-bar-default0] tests/test_env.py::TestSubClass::test_bytes[NON_EXISTENT_BYTES_VAR-some-default-some-default] tests/test_env.py::TestSubClass::test_bytes[NON_EXISTENT_STR_VAR-some-default-some-default] tests/test_env.py::TestSubClass::test_int tests/test_env.py::TestSubClass::test_int_with_none_default tests/test_env.py::TestSubClass::test_float[33.3-FLOAT_VAR] tests/test_env.py::TestSubClass::test_float[33.3-FLOAT_COMMA_VAR] tests/test_env.py::TestSubClass::test_float[123420333.3-FLOAT_STRANGE_VAR1] tests/test_env.py::TestSubClass::test_float[123420333.3-FLOAT_STRANGE_VAR2] tests/test_env.py::TestSubClass::test_float[-1.0-FLOAT_NEGATIVE_VAR] tests/test_env.py::TestSubClass::test_bool_true[True-BOOL_TRUE_STRING_LIKE_INT] tests/test_env.py::TestSubClass::test_bool_true[True-BOOL_TRUE_STRING_LIKE_BOOL] tests/test_env.py::TestSubClass::test_bool_true[True-BOOL_TRUE_INT] tests/test_env.py::TestSubClass::test_bool_true[True-BOOL_TRUE_BOOL] tests/test_env.py::TestSubClass::test_bool_true[True-BOOL_TRUE_STRING_1] tests/test_env.py::TestSubClass::test_bool_true[True-BOOL_TRUE_STRING_2] tests/test_env.py::TestSubClass::test_bool_true[True-BOOL_TRUE_STRING_3] tests/test_env.py::TestSubClass::test_bool_true[True-BOOL_TRUE_STRING_4] tests/test_env.py::TestSubClass::test_bool_true[True-BOOL_TRUE_STRING_5] tests/test_env.py::TestSubClass::test_bool_true[False-BOOL_FALSE_STRING_LIKE_INT] tests/test_env.py::TestSubClass::test_bool_true[False-BOOL_FALSE_INT] tests/test_env.py::TestSubClass::test_bool_true[False-BOOL_FALSE_STRING_LIKE_BOOL] tests/test_env.py::TestSubClass::test_bool_true[False-BOOL_FALSE_BOOL] tests/test_env.py::TestSubClass::test_proxied_value tests/test_env.py::TestSubClass::test_escaped_dollar_sign tests/test_env.py::TestSubClass::test_escaped_dollar_sign_disabled tests/test_env.py::TestSubClass::test_int_list tests/test_env.py::TestSubClass::test_int_tuple tests/test_env.py::TestSubClass::test_str_list_with_spaces tests/test_env.py::TestSubClass::test_empty_list tests/test_env.py::TestSubClass::test_dict_value tests/test_env.py::TestSubClass::test_complex_dict_value tests/test_env.py::TestSubClass::test_dict_parsing[dict] tests/test_env.py::TestSubClass::test_dict_parsing[dict_int] tests/test_env.py::TestSubClass::test_dict_parsing[dict_float] tests/test_env.py::TestSubClass::test_dict_parsing[dict_str_list] tests/test_env.py::TestSubClass::test_dict_parsing[dict_int_list] tests/test_env.py::TestSubClass::test_dict_parsing[dict_int_cast] tests/test_env.py::TestSubClass::test_dict_parsing[dict_str_cast] tests/test_env.py::TestSubClass::test_url_value tests/test_env.py::TestSubClass::test_url_encoded_parts tests/test_env.py::TestSubClass::test_db_url_value[postgres] tests/test_env.py::TestSubClass::test_db_url_value[mysql] tests/test_env.py::TestSubClass::test_db_url_value[mysql_gis] tests/test_env.py::TestSubClass::test_db_url_value[oracle_tns] tests/test_env.py::TestSubClass::test_db_url_value[oracle] tests/test_env.py::TestSubClass::test_db_url_value[redshift] tests/test_env.py::TestSubClass::test_db_url_value[sqlite] tests/test_env.py::TestSubClass::test_db_url_value[custom] tests/test_env.py::TestSubClass::test_db_url_value[cloudsql] tests/test_env.py::TestSubClass::test_cache_url_value[memcached] tests/test_env.py::TestSubClass::test_cache_url_value[redis] tests/test_env.py::TestSubClass::test_email_url_value tests/test_env.py::TestSubClass::test_json_value tests/test_env.py::TestSubClass::test_path tests/test_env.py::TestSubClass::test_smart_cast tests/test_env.py::TestSubClass::test_exported tests/test_env.py::TestSubClass::test_singleton_environ tests/test_utils.py::test_cast[anything-] tests/test_utils.py::test_cast[anything*] tests/test_utils.py::test_cast[*anything] tests/test_utils.py::test_cast[anything.] tests/test_utils.py::test_cast[anything.1] tests/test_utils.py::test_cast[(anything] tests/test_utils.py::test_cast[anything-v1.2] tests/test_utils.py::test_cast[anything-1.2] tests/test_utils.py::test_cast[anything=]