18
18
import zlib
19
19
from functools import lru_cache , wraps
20
20
from typing import Optional
21
+ from importlib .metadata import version , PackageNotFoundError
21
22
22
23
from django .conf import settings
23
24
from django .core .exceptions import ImproperlyConfigured
@@ -239,6 +240,7 @@ def _django_csp_update_decorator():
239
240
"""Returns a view CSP decorator if django-csp is available, otherwise None."""
240
241
try :
241
242
from csp .decorators import csp_update
243
+ import csp
242
244
except ModuleNotFoundError :
243
245
# If csp is not installed, do not update fields as Content-Security-Policy
244
246
# is not used
@@ -254,4 +256,26 @@ def _django_csp_update_decorator():
254
256
else :
255
257
# autosubmit of forms uses nonce per default
256
258
# form-action https: to send data to IdPs
257
- return csp_update (FORM_ACTION = ["https:" ])
259
+ # Check django-csp version to determine the appropriate format
260
+ try :
261
+ csp_version = version ('django-csp' )
262
+ major_version = int (csp_version .split ('.' )[0 ])
263
+
264
+ # Version detection successful
265
+ if major_version >= 4 :
266
+ # django-csp 4.0+ uses dict format with named 'config' parameter
267
+ return csp_update (config = {"form-action" : ["https:" ]})
268
+ # django-csp < 4.0 uses kwargs format
269
+ return csp_update (FORM_ACTION = ["https:" ])
270
+ except (PackageNotFoundError , ValueError , RuntimeError , AttributeError , IndexError ):
271
+ # Version detection failed, we need to try both formats
272
+ # Try v4.0+ style first because:
273
+ # 1. It has better error handling with clear messages
274
+ # 2. Newer versions are more likely to be supported in the future
275
+ # 3. If using kwargs with v4.0, it raises a specific RuntimeError we can catch
276
+ try :
277
+ return csp_update (config = {"form-action" : ["https:" ]})
278
+ except (TypeError , RuntimeError ):
279
+ # TypeErrors could happen if config is not a recognized parameter (v3.x)
280
+ # RuntimeErrors could happen in v4.0+ if we try the wrong approach
281
+ return csp_update (FORM_ACTION = ["https:" ])
0 commit comments