1818import  zlib 
1919from  functools  import  lru_cache , wraps 
2020from  typing  import  Optional 
21+ from  importlib .metadata  import  version , PackageNotFoundError 
2122
2223from  django .conf  import  settings 
2324from  django .core .exceptions  import  ImproperlyConfigured 
@@ -239,6 +240,7 @@ def _django_csp_update_decorator():
239240    """Returns a view CSP decorator if django-csp is available, otherwise None.""" 
240241    try :
241242        from  csp .decorators  import  csp_update 
243+         import  csp 
242244    except  ModuleNotFoundError :
243245        # If csp is not installed, do not update fields as Content-Security-Policy 
244246        # is not used 
@@ -254,4 +256,26 @@ def _django_csp_update_decorator():
254256    else :
255257        # autosubmit of forms uses nonce per default 
256258        # 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