joke2k / django-environ

Django-environ allows you to utilize 12factor inspired environment variables to configure your Django application.
https://django-environ.rtfd.org
MIT License
3.01k stars 318 forks source link

db_url() fail with oracle dsn #507

Open lsaavedr opened 11 months ago

lsaavedr commented 11 months ago

db_url fail with oracle url without path, for example:

import environ
env = environ.Env()

DB_URL = 'oracle://super_user:super_pass@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracle_dev)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=XEPDB1)))'

DB = env.db('', default=DB_URL)
print("NAME:", DB['NAME'])
NAME: %28DESCRIPTION=%28ADDRESS=%28PROTOCOL=TCP%29%28HOST=oracle_dev%29%28PORT=1521%29%29%28CONNECT_DATA=%28SERVICE_NAME=XEPDB1%29%29%29

but with path (adding a simple / to de end): DB_URL = 'oracle://super_user:super_pass@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracle_dev)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=XEPDB1)))/':

NAME: (description=(address=(protocol=tcp)(host=oracle_dev)(port=1521))(connect_data=(service_name=xepdb1)))

suggested patch is:

--- /srv/env/lib/python3.10/site-packages/environ/environ.py
+++ /srv/env/lib/python3.10/site-packages/environ/environ.py
@@ -521,7 +521,7 @@
         config = {}

         # handle unexpected URL schemes with special characters
-        if not url.path:
+        if not url.path and not url.scheme=='oracle':
             url = _urlparse_quote(urlunparse(url))
         # Remove query strings.
         path = url.path[1:]