Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-django-silk for
openSUSE:Factory checked in at 2026-11-09 16:05:00
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-django-silk (Old)
and /work/SRC/openSUSE:Factory/.python-django-silk.new.3759290 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-django-silk"
Mon Nov 9 16:05:00 2026 rev:20 rq:1396200 version:5.6.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-django-silk/python-django-silk.changes
2026-08-22 21:36:58.140983097 +0200
+++
/work/SRC/openSUSE:Factory/.python-django-silk.new.3759290/python-django-silk.changes
2026-11-09 16:05:42.048471726 +0100
@@ -1,0 +2,21 @@
+Sun Nov 8 21:45:19 UTC 2026 - Dirk Müller <[email protected]>
+
+- update to 5.6.0:
+ * **Backwards incompatible:** `SILKY_IGNORE_PATHS` entries are
+ now matched against `request.path_info` instead of `request.path`.
+ For most deployments these are identical and nothing changes.
+ If silk runs behind a front-end web server that
+ sets a `SCRIPT_NAME` prefix, and you worked around #349 by
+ writing that prefix into your `SILKY_IGNORE_PATHS` entries
+ * Fix SILKY_IGNORE_PATHS matching when used with a SCRIPT_NAME
+ prefix
+ * Fix false-positive migration for Request.prof_file
+ * Fix PackageNotFoundError when determining __version__
+ * Add support for Django 6.1
+ * Drop support for EOL Django 4.2 and 5.1
+ * Fix grammar and typos in middleware comments
+ * Remove outdated compatibility logic for old versions of
+ python/django
+ * Remove outdated settings.DEFAULT_FILE_STORAGE
+
+-------------------------------------------------------------------
Old:
----
django_silk-5.5.2.tar.gz
New:
----
django_silk-5.6.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-django-silk.spec ++++++
--- /var/tmp/diff_new_pack.HSCKEF/_old 2026-11-09 16:05:42.749501115 +0100
+++ /var/tmp/diff_new_pack.HSCKEF/_new 2026-11-09 16:05:42.750501157 +0100
@@ -17,26 +17,26 @@
Name: python-django-silk
-Version: 5.5.2
+Version: 5.6.0
Release: 0
Summary: Profiling for the Django Framework
License: MIT
URL: https://github.com/jazzband/django-silk
Source:
https://files.pythonhosted.org/packages/source/d/django-silk/django_silk-%{version}.tar.gz
-BuildRequires: %{python_module base >= 3.8}
+BuildRequires: %{python_module base >= 3.10}
BuildRequires: %{python_module pip}
-BuildRequires: %{python_module setuptools_scm}
-BuildRequires: %{python_module setuptools}
+BuildRequires: %{python_module setuptools >= 64}
+BuildRequires: %{python_module setuptools_scm >= 8}
BuildRequires: %{python_module wheel}
BuildRequires: fdupes
BuildRequires: python-rpm-macros
-Requires: python-Django >= 4.2
+Requires: python-Django >= 5.2
Requires: python-autopep8 >= 1.2.1
Requires: python-gprof2dot >= 2017.09.19
Requires: python-sqlparse >= 0.1.19
BuildArch: noarch
# SECTION test requirements
-BuildRequires: %{python_module Django >= 4.2}
+BuildRequires: %{python_module Django >= 5.2}
BuildRequires: %{python_module autopep8 >= 1.2.1}
BuildRequires: %{python_module factory_boy >= 3.3}
BuildRequires: %{python_module freezegun}
++++++ django_silk-5.5.2.tar.gz -> django_silk-5.6.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django_silk-5.5.2/.github/workflows/test.yml
new/django_silk-5.6.0/.github/workflows/test.yml
--- old/django_silk-5.5.2/.github/workflows/test.yml 2026-08-13
06:11:58.660578300 +0200
+++ new/django_silk-5.6.0/.github/workflows/test.yml 2026-09-12
07:34:51.918403400 +0200
@@ -10,34 +10,36 @@
fail-fast: false
matrix:
python-version: ['3.10', '3.11', '3.12', '3.13', '3.14', '3.15']
- django-version: ['4.2', '5.1', '5.2', '6.0', 'main']
+ django-version: ['5.2', '6.0', '6.1', 'main']
postgres-version: ['14', '18']
mariadb-version: ['10.6', '10.11', '11.4', '11.8']
exclude:
- # Django 4.2 doesn't support Python >= 3.13
- - django-version: '4.2'
- python-version: '3.13'
- - django-version: '4.2'
- python-version: '3.14'
- - django-version: '4.2'
- python-version: '3.15'
-
- # Django 5.1 doesn't support Python >= 3.14
- - django-version: '5.1'
- python-version: '3.14'
- - django-version: '5.1'
- python-version: '3.15'
-
- # Django 6.0 doesn't support Python <3.12
(https://docs.djangoproject.com/en/dev/releases/6.0/#python-compatibility)
+ # Django >=6.0 doesn't support Python <3.12
(https://docs.djangoproject.com/en/dev/releases/6.0/#python-compatibility)
- django-version: '6.0'
python-version: '3.10'
- django-version: '6.0'
python-version: '3.11'
+ - django-version: '6.1'
+ python-version: '3.10'
+ - django-version: '6.1'
+ python-version: '3.11'
- django-version: 'main'
python-version: '3.10'
- django-version: 'main'
python-version: '3.11'
+ # Django 6.1 doesn't support Postgres <15
+ - django-version: '6.1'
+ postgres-version: '14'
+ - django-version: 'main'
+ postgres-version: '14'
+
+ # Django 6.1 doesn't support mariadb <10.11
+ - django-version: '6.1'
+ mariadb-version: '10.6'
+ - django-version: 'main'
+ mariadb-version: '10.6'
+
services:
postgres:
image: postgres:${{ matrix.postgres-version }}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django_silk-5.5.2/.pre-commit-config.yaml
new/django_silk-5.6.0/.pre-commit-config.yaml
--- old/django_silk-5.5.2/.pre-commit-config.yaml 2026-08-13
06:11:58.660578300 +0200
+++ new/django_silk-5.6.0/.pre-commit-config.yaml 2026-09-12
07:34:51.918403400 +0200
@@ -13,7 +13,7 @@
hooks:
- id: yesqa
- repo: https://github.com/pycqa/isort
- rev: '9.0.0b2'
+ rev: '9.0.1'
hooks:
- id: isort
args: ['--profile', 'black']
@@ -52,10 +52,10 @@
- id: pyupgrade
args: ['--keep-mock']
- repo: https://github.com/adamchainz/django-upgrade
- rev: '1.31.1'
+ rev: '1.32.0'
hooks:
- id: django-upgrade
- args: [--target-version, '4.2']
+ args: [--target-version, '5.2']
- repo: https://github.com/hhatto/autopep8
rev: 'v2.3.2'
hooks:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django_silk-5.5.2/CHANGELOG.md
new/django_silk-5.6.0/CHANGELOG.md
--- old/django_silk-5.5.2/CHANGELOG.md 2026-08-13 06:11:58.660648300 +0200
+++ new/django_silk-5.6.0/CHANGELOG.md 2026-09-12 07:34:51.918403400 +0200
@@ -1,6 +1,36 @@
# Change Log
## Unreleased
+
+## [5.6.0](https://github.com/jazzband/django-silk/tree/5.6.0) (2026-09-11)
+:release-by: Albert Wang (@albertyw)
+[Full Changelog](https://github.com/jazzband/django-silk/compare/5.5.2..5.6.0)
+
+**Backwards incompatible:** `SILKY_IGNORE_PATHS` entries are now matched
against
+`request.path_info` instead of `request.path`. For most deployments these are
+identical and nothing changes. If silk runs behind a front-end web server that
+sets a `SCRIPT_NAME` prefix, and you worked around #349 by writing that prefix
+into your `SILKY_IGNORE_PATHS` entries (e.g. `/some-prefix/healthz`), remove
the
+prefix (`/healthz`) or those paths will no longer be ignored.
+
+**Fixes:**
+
+ - Fix SILKY_IGNORE_PATHS matching when used with a SCRIPT_NAME prefix (#888)
@agu2347
+ - Fix false-positive migration for Request.prof_file (#906) @richardmilles
+ - Fix PackageNotFoundError when determining __version__ (#911) @aoright
+
+**Features/Enhancements:**
+
+ - Add support for Django 6.1 (#893) @albertyw
+
+**Maintenance and Cleanup:**
+
+ - Drop support for EOL Django 4.2 and 5.1 (#891) @albertyw
+ - Fix grammar and typos in middleware comments (#904) @aoright
+ - Remove outdated compatibility logic for old versions of python/django
(#902) @albertyw
+ - Remove outdated settings.DEFAULT_FILE_STORAGE (#901) @albertyw
+
+
## [5.5.2](https://github.com/jazzband/django-silk/tree/5.5.2) (2026-08-11)
:release-by: Albert Wang (@albertyw)
[Full Changelog](https://github.com/jazzband/django-silk/compare/5.5.0..5.5.2)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django_silk-5.5.2/PKG-INFO
new/django_silk-5.6.0/PKG-INFO
--- old/django_silk-5.5.2/PKG-INFO 2026-08-13 06:12:08.207594900 +0200
+++ new/django_silk-5.6.0/PKG-INFO 2026-09-12 07:35:00.539775100 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: django-silk
-Version: 5.5.2
+Version: 5.6.0
Summary: Silky smooth profiling for the Django Framework
Home-page: https://github.com/jazzband/django-silk
Author: Michael Ford
@@ -9,10 +9,9 @@
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Web Environment
Classifier: Framework :: Django
-Classifier: Framework :: Django :: 4.2
-Classifier: Framework :: Django :: 5.1
Classifier: Framework :: Django :: 5.2
Classifier: Framework :: Django :: 6.0
+Classifier: Framework :: Django :: 6.1
Classifier: Intended Audience :: Developers
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
@@ -27,7 +26,7 @@
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
-Requires-Dist: Django>=4.2
+Requires-Dist: Django>=5.2
Requires-Dist: sqlparse
Requires-Dist: gprof2dot>=2017.09.19
Provides-Extra: formatting
@@ -68,6 +67,7 @@
* [Request/Response bodies](#requestresponse-bodies)
* [Meta-Profiling](#meta-profiling)
* [Recording a fraction of requests](#recording-a-fraction-of-requests)
+ * [Ignoring specific paths](#ignoring-specific-paths)
* [Limiting request/response data](#limiting-requestresponse-data)
* [Clearing logged data](#clearing-logged-data)
* [Contributing](#contributing)
@@ -77,7 +77,7 @@
Silk has been tested with:
-* Django: 4.2, 5.1, 5.2, 6.0
+* Django: 5.2, 6.0, 6.1
* Python: 3.10, 3.11, 3.12, 3.13, 3.14, 3.15
## Installation
@@ -234,8 +234,7 @@
A custom storage class can be used for the saved generated binary `.prof`
files:
```python
-# For Django >= 4.2 and Django-Silk >= 5.1.0:
-# See https://docs.djangoproject.com/en/5.0/ref/settings/#std-setting-STORAGES
+# See
https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-STORAGES
STORAGES = {
'SILKY_STORAGE': {
'BACKEND': 'path.to.StorageClass',
@@ -243,7 +242,7 @@
# ...
}
-# For Django < 4.2 or Django-Silk < 5.1.0
+# Alternatively, if STORAGES has no 'SILKY_STORAGE' entry:
SILKY_STORAGE_CLASS = 'path.to.StorageClass'
```
@@ -543,6 +542,20 @@
SILKY_INTERCEPT_FUNC = lambda request: 'record_requests' in request.session
```
+### Ignoring specific paths
+
+To stop silk recording particular paths entirely, list them in
`SILKY_IGNORE_PATHS`:
+
+```python
+SILKY_IGNORE_PATHS = ['/healthz', '/readyz']
+```
+
+Entries are matched exactly against `request.path_info`, which is the request
path
+*without* any `SCRIPT_NAME` prefix your front-end web server may add. So if
silk is
+mounted under `/some-prefix/`, write `/healthz` rather than
`/some-prefix/healthz`.
+
+Silk's own views are always ignored and do not need to be listed here.
+
### Limiting request/response data
To make sure silky garbage collects old request/response data, a config var
can be set to limit the number of request/response rows it stores.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django_silk-5.5.2/README.md
new/django_silk-5.6.0/README.md
--- old/django_silk-5.5.2/README.md 2026-08-13 06:11:58.660648300 +0200
+++ new/django_silk-5.6.0/README.md 2026-09-12 07:34:51.918473500 +0200
@@ -21,6 +21,7 @@
* [Request/Response bodies](#requestresponse-bodies)
* [Meta-Profiling](#meta-profiling)
* [Recording a fraction of requests](#recording-a-fraction-of-requests)
+ * [Ignoring specific paths](#ignoring-specific-paths)
* [Limiting request/response data](#limiting-requestresponse-data)
* [Clearing logged data](#clearing-logged-data)
* [Contributing](#contributing)
@@ -30,7 +31,7 @@
Silk has been tested with:
-* Django: 4.2, 5.1, 5.2, 6.0
+* Django: 5.2, 6.0, 6.1
* Python: 3.10, 3.11, 3.12, 3.13, 3.14, 3.15
## Installation
@@ -187,8 +188,7 @@
A custom storage class can be used for the saved generated binary `.prof`
files:
```python
-# For Django >= 4.2 and Django-Silk >= 5.1.0:
-# See https://docs.djangoproject.com/en/5.0/ref/settings/#std-setting-STORAGES
+# See
https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-STORAGES
STORAGES = {
'SILKY_STORAGE': {
'BACKEND': 'path.to.StorageClass',
@@ -196,7 +196,7 @@
# ...
}
-# For Django < 4.2 or Django-Silk < 5.1.0
+# Alternatively, if STORAGES has no 'SILKY_STORAGE' entry:
SILKY_STORAGE_CLASS = 'path.to.StorageClass'
```
@@ -496,6 +496,20 @@
SILKY_INTERCEPT_FUNC = lambda request: 'record_requests' in request.session
```
+### Ignoring specific paths
+
+To stop silk recording particular paths entirely, list them in
`SILKY_IGNORE_PATHS`:
+
+```python
+SILKY_IGNORE_PATHS = ['/healthz', '/readyz']
+```
+
+Entries are matched exactly against `request.path_info`, which is the request
path
+*without* any `SCRIPT_NAME` prefix your front-end web server may add. So if
silk is
+mounted under `/some-prefix/`, write `/healthz` rather than
`/some-prefix/healthz`.
+
+Silk's own views are always ignored and do not need to be listed here.
+
### Limiting request/response data
To make sure silky garbage collects old request/response data, a config var
can be set to limit the number of request/response rows it stores.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django_silk-5.5.2/django_silk.egg-info/PKG-INFO
new/django_silk-5.6.0/django_silk.egg-info/PKG-INFO
--- old/django_silk-5.5.2/django_silk.egg-info/PKG-INFO 2026-08-13
06:12:08.145595600 +0200
+++ new/django_silk-5.6.0/django_silk.egg-info/PKG-INFO 2026-09-12
07:35:00.467501900 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: django-silk
-Version: 5.5.2
+Version: 5.6.0
Summary: Silky smooth profiling for the Django Framework
Home-page: https://github.com/jazzband/django-silk
Author: Michael Ford
@@ -9,10 +9,9 @@
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Web Environment
Classifier: Framework :: Django
-Classifier: Framework :: Django :: 4.2
-Classifier: Framework :: Django :: 5.1
Classifier: Framework :: Django :: 5.2
Classifier: Framework :: Django :: 6.0
+Classifier: Framework :: Django :: 6.1
Classifier: Intended Audience :: Developers
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
@@ -27,7 +26,7 @@
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
-Requires-Dist: Django>=4.2
+Requires-Dist: Django>=5.2
Requires-Dist: sqlparse
Requires-Dist: gprof2dot>=2017.09.19
Provides-Extra: formatting
@@ -68,6 +67,7 @@
* [Request/Response bodies](#requestresponse-bodies)
* [Meta-Profiling](#meta-profiling)
* [Recording a fraction of requests](#recording-a-fraction-of-requests)
+ * [Ignoring specific paths](#ignoring-specific-paths)
* [Limiting request/response data](#limiting-requestresponse-data)
* [Clearing logged data](#clearing-logged-data)
* [Contributing](#contributing)
@@ -77,7 +77,7 @@
Silk has been tested with:
-* Django: 4.2, 5.1, 5.2, 6.0
+* Django: 5.2, 6.0, 6.1
* Python: 3.10, 3.11, 3.12, 3.13, 3.14, 3.15
## Installation
@@ -234,8 +234,7 @@
A custom storage class can be used for the saved generated binary `.prof`
files:
```python
-# For Django >= 4.2 and Django-Silk >= 5.1.0:
-# See https://docs.djangoproject.com/en/5.0/ref/settings/#std-setting-STORAGES
+# See
https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-STORAGES
STORAGES = {
'SILKY_STORAGE': {
'BACKEND': 'path.to.StorageClass',
@@ -243,7 +242,7 @@
# ...
}
-# For Django < 4.2 or Django-Silk < 5.1.0
+# Alternatively, if STORAGES has no 'SILKY_STORAGE' entry:
SILKY_STORAGE_CLASS = 'path.to.StorageClass'
```
@@ -543,6 +542,20 @@
SILKY_INTERCEPT_FUNC = lambda request: 'record_requests' in request.session
```
+### Ignoring specific paths
+
+To stop silk recording particular paths entirely, list them in
`SILKY_IGNORE_PATHS`:
+
+```python
+SILKY_IGNORE_PATHS = ['/healthz', '/readyz']
+```
+
+Entries are matched exactly against `request.path_info`, which is the request
path
+*without* any `SCRIPT_NAME` prefix your front-end web server may add. So if
silk is
+mounted under `/some-prefix/`, write `/healthz` rather than
`/some-prefix/healthz`.
+
+Silk's own views are always ignored and do not need to be listed here.
+
### Limiting request/response data
To make sure silky garbage collects old request/response data, a config var
can be set to limit the number of request/response rows it stores.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django_silk-5.5.2/django_silk.egg-info/SOURCES.txt
new/django_silk-5.6.0/django_silk.egg-info/SOURCES.txt
--- old/django_silk-5.5.2/django_silk.egg-info/SOURCES.txt 2026-08-13
06:12:08.168366200 +0200
+++ new/django_silk-5.6.0/django_silk.egg-info/SOURCES.txt 2026-09-12
07:35:00.495925400 +0200
@@ -159,6 +159,7 @@
silk/migrations/0006_fix_request_prof_file_blank.py
silk/migrations/0007_sqlquery_identifier.py
silk/migrations/0008_sqlquery_analysis.py
+silk/migrations/0009_alter_request_prof_file.py
silk/migrations/__init__.py
silk/profiling/__init__.py
silk/profiling/dynamic.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django_silk-5.5.2/django_silk.egg-info/requires.txt
new/django_silk-5.6.0/django_silk.egg-info/requires.txt
--- old/django_silk-5.5.2/django_silk.egg-info/requires.txt 2026-08-13
06:12:08.146669400 +0200
+++ new/django_silk-5.6.0/django_silk.egg-info/requires.txt 2026-09-12
07:35:00.468668000 +0200
@@ -1,4 +1,4 @@
-Django>=4.2
+Django>=5.2
sqlparse
gprof2dot>=2017.09.19
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/django_silk-5.5.2/django_silk.egg-info/scm_file_list.json
new/django_silk-5.6.0/django_silk.egg-info/scm_file_list.json
--- old/django_silk-5.5.2/django_silk.egg-info/scm_file_list.json
2026-08-13 06:12:08.144238200 +0200
+++ new/django_silk-5.6.0/django_silk.egg-info/scm_file_list.json
2026-09-12 07:35:00.465991300 +0200
@@ -145,6 +145,7 @@
"silk/migrations/0006_fix_request_prof_file_blank.py",
"silk/migrations/0007_sqlquery_identifier.py",
"silk/migrations/0008_sqlquery_analysis.py",
+ "silk/migrations/0009_alter_request_prof_file.py",
"silk/migrations/__init__.py",
"silk/model_factory.py",
"silk/models.py",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/django_silk-5.5.2/django_silk.egg-info/scm_version.json
new/django_silk-5.6.0/django_silk.egg-info/scm_version.json
--- old/django_silk-5.5.2/django_silk.egg-info/scm_version.json 2026-08-13
06:12:08.132381700 +0200
+++ new/django_silk-5.6.0/django_silk.egg-info/scm_version.json 2026-09-12
07:35:00.448947200 +0200
@@ -1,8 +1,8 @@
{
- "tag": "5.5.2",
+ "tag": "5.6.0",
"distance": 0,
- "node": "ge04dc567b0a17bbd8630f3e0dbffaabf2bfb97c0",
+ "node": "g5e88c839b65a73d1fbc4d41f9886c81c45c94eec",
"dirty": false,
"branch": "HEAD",
- "node_date": "2026-08-13"
+ "node_date": "2026-09-12"
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django_silk-5.5.2/docs/conf.py
new/django_silk-5.6.0/docs/conf.py
--- old/django_silk-5.5.2/docs/conf.py 2026-08-13 06:11:58.661215300 +0200
+++ new/django_silk-5.6.0/docs/conf.py 2026-09-12 07:34:51.919092000 +0200
@@ -11,7 +11,7 @@
# All configuration values have a default; values that are commented out
# serve to show the default.
-import pkg_resources
+import importlib.metadata
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
@@ -46,7 +46,7 @@
# built documents.
#
# The full version, including alpha/beta/rc tags.
-release = pkg_resources.get_distribution("django-silk").version
+release = importlib.metadata.version("django-silk")
# The short X.Y version.
version = '.'.join(release.split('.')[:2])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django_silk-5.5.2/docs/index.rst
new/django_silk-5.6.0/docs/index.rst
--- old/django_silk-5.5.2/docs/index.rst 2026-08-13 06:11:58.664648500
+0200
+++ new/django_silk-5.6.0/docs/index.rst 2026-09-12 07:34:51.921473500
+0200
@@ -57,5 +57,5 @@
Requirements
------------
-* Django: 4.2, 5.1, 5.2, 6.0
+* Django: 5.2, 6.0, 6.1
* Python: 3.10, 3.11, 3.12, 3.13, 3.14, 3.15
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django_silk-5.5.2/package.json
new/django_silk-5.6.0/package.json
--- old/django_silk-5.5.2/package.json 2026-08-13 06:11:58.664648500 +0200
+++ new/django_silk-5.6.0/package.json 2026-09-12 07:34:51.921473500 +0200
@@ -1,6 +1,6 @@
{
"name": "silk",
- "version": "5.5.2",
+ "version": "5.6.0",
"description": "https://github.com/jazzband/django-silk",
"main": "index.js",
"directories": {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django_silk-5.5.2/project/tests/test_compat.py
new/django_silk-5.6.0/project/tests/test_compat.py
--- old/django_silk-5.5.2/project/tests/test_compat.py 2026-08-13
06:11:58.666165800 +0200
+++ new/django_silk-5.6.0/project/tests/test_compat.py 2026-09-12
07:34:51.923331000 +0200
@@ -23,3 +23,21 @@
factory = ResponseModelFactory(mock)
body, content = factory.body()
self.assertDictEqual(json.loads(body), d)
+
+
+class TestPackageVersion(TestCase):
+ def test_version_falls_back_when_metadata_is_missing(self):
+ import importlib
+ import importlib.metadata
+ from unittest.mock import patch
+
+ import silk
+
+ self.addCleanup(importlib.reload, silk)
+ with patch(
+ "importlib.metadata.version",
+ side_effect=importlib.metadata.PackageNotFoundError,
+ ):
+ importlib.reload(silk)
+
+ self.assertEqual(silk.__version__, "unknown")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django_silk-5.5.2/project/tests/test_models.py
new/django_silk-5.6.0/project/tests/test_models.py
--- old/django_silk-5.5.2/project/tests/test_models.py 2026-08-13
06:11:58.666710600 +0200
+++ new/django_silk-5.6.0/project/tests/test_models.py 2026-09-12
07:34:51.923878200 +0200
@@ -1,4 +1,7 @@
+import base64
import datetime
+import gzip
+import json
import uuid
from django.core.management import call_command
@@ -236,6 +239,20 @@
self.obj.encoded_headers = '{"content-type": "some_data"}'
self.assertEqual(self.obj.content_type, "some_data")
+ def test_raw_body_decoded_decompresses_gzip_response(self):
+ content = b'hello from gzip'
+ self.obj.raw_body =
base64.b64encode(gzip.compress(content)).decode('ascii')
+ self.obj.encoded_headers = json.dumps({'content-encoding': 'gzip'})
+
+ self.assertEqual(self.obj.raw_body_decoded, content)
+
+ def test_raw_body_decoded_falls_back_on_malformed_gzip_response(self):
+ raw = b'not actually gzip data'
+ self.obj.raw_body = base64.b64encode(raw).decode('ascii')
+ self.obj.encoded_headers = json.dumps({'content-encoding': 'gzip'})
+
+ self.assertEqual(self.obj.raw_body_decoded, raw)
+
class SQLQueryManagerTest(TestCase):
@@ -286,9 +303,9 @@
self.obj.traceback = """Traceback (most recent call last):
File "/home/user/some_script.py", line 10, in some_func
pass
- File "/usr/lib/python2.7/bdb.py", line 20, in trace_dispatch
+ File "/usr/lib/python3.13/bdb.py", line 20, in trace_dispatch
return self.dispatch_return(frame, arg)
- File "/usr/lib/python2.7/bdb.py", line 30, in dispatch_return
+ File "/usr/lib/python3.13/bdb.py", line 30, in dispatch_return
if self.quitting: raise BdbQuit
BdbQuit"""
@@ -523,8 +540,8 @@
@override_settings(DEFAULT_AUTO_FIELD='django.db.models.BigAutoField')
def test_check_with_overridden_default_auto_field(self):
"""
- Test with `BigAutoField` set as `DEFAULT_AUTO_FIELD` - which is
- default when generating proj with Django 3.2.
+ Test with `BigAutoField` set as `DEFAULT_AUTO_FIELD` - the default
+ for newly generated projects.
"""
self.test_no_pending_migrations()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/django_silk-5.5.2/project/tests/test_response_assumptions.py
new/django_silk-5.6.0/project/tests/test_response_assumptions.py
--- old/django_silk-5.5.2/project/tests/test_response_assumptions.py
2026-08-13 06:11:58.666710600 +0200
+++ new/django_silk-5.6.0/project/tests/test_response_assumptions.py
2026-09-12 07:34:51.923878200 +0200
@@ -5,6 +5,6 @@
class TestResponseAssumptions(TestCase):
def test_headers_present_in_http_response(self):
- """Verify that HttpResponse has a headers or _headers attribute, which
we use and Mock in our tests."""
+ """Verify that HttpResponse has a headers attribute, which
ResponseModelFactory relies on."""
django_response = HttpResponse()
- self.assertTrue(hasattr(django_response, '_headers') or
hasattr(django_response, 'headers'))
+ self.assertTrue(hasattr(django_response, 'headers'))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/django_silk-5.5.2/project/tests/test_silky_middleware.py
new/django_silk-5.6.0/project/tests/test_silky_middleware.py
--- old/django_silk-5.5.2/project/tests/test_silky_middleware.py
2026-08-13 06:11:58.666710600 +0200
+++ new/django_silk-5.6.0/project/tests/test_silky_middleware.py
2026-09-12 07:34:51.923878200 +0200
@@ -1,7 +1,7 @@
from unittest.mock import patch
from django.test import TestCase, override_settings
-from django.urls import reverse
+from django.urls import reverse, set_script_prefix
from silk.config import SilkyConfig
from silk.errors import SilkNotConfigured
@@ -121,6 +121,7 @@
def test_should_intercept_non_silk_request(self):
request = Request()
request.path = '/myapp/foo'
+ request.path_info = '/myapp/foo'
should_intercept = _should_intercept(request)
self.assertTrue(should_intercept)
@@ -128,6 +129,7 @@
def test_should_intercept_silk_request(self):
request = Request()
request.path = reverse('silk:summary')
+ request.path_info = reverse('silk:summary')
should_intercept = _should_intercept(request)
self.assertFalse(should_intercept)
@@ -136,6 +138,7 @@
def test_should_intercept_without_silk_urls(self):
request = Request()
request.path = '/login'
+ request.path_info = '/login'
_should_intercept(request) # Just checking no crash
def test_should_intercept_ignore_paths(self):
@@ -144,6 +147,57 @@
]
request = Request()
request.path = '/ignorethis'
+ request.path_info = '/ignorethis'
should_intercept = _should_intercept(request)
self.assertFalse(should_intercept)
+
+ def test_should_intercept_ignore_paths_behind_script_name_prefix(self):
+ """
+ Regression test for
+ https://github.com/jazzband/django-silk/issues/349
+
+ A SILKY_IGNORE_PATHS entry is a plain string the user writes
+ in settings.py -- never passed through reverse() -- so it's
+ naturally written without any deployment-specific SCRIPT_NAME
+ prefix. Matching it must therefore use path_info (which has
+ that prefix stripped), not path (which still has it), or a
+ front-end web server prefix causes the entry to go
+ unrecognized.
+ """
+ SilkyConfig().SILKY_IGNORE_PATHS = [
+ '/ignorethis'
+ ]
+
+ # A path with a SCRIPT_NAME-style prefix that only path_info
+ # (not path) has stripped off.
+ request = Request()
+ request.path = '/some-prefix/ignorethis'
+ request.path_info = '/ignorethis'
+ should_intercept = _should_intercept(request)
+
+ self.assertFalse(should_intercept)
+
+ def test_should_intercept_silk_request_behind_script_name_prefix(self):
+ """
+ Companion regression test for
+ https://github.com/jazzband/django-silk/issues/349.
+
+ Unlike SILKY_IGNORE_PATHS entries, get_fpath() is built from
+ reverse(), which picks up Django's script prefix (set from
+ SCRIPT_NAME by the WSGI handler on every real request) just
+ like request.path does. So when deployed behind a front-end
+ prefix, both request.path and reverse() include it together
+ and self-detection must keep comparing against request.path,
+ not the prefix-stripped request.path_info.
+ """
+ set_script_prefix('/some-prefix/')
+ try:
+ request = Request()
+ request.path = reverse('silk:summary')
+ request.path_info = reverse('silk:summary')[len('/some-prefix'):]
+ should_intercept = _should_intercept(request)
+
+ self.assertFalse(should_intercept)
+ finally:
+ set_script_prefix('/')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django_silk-5.5.2/setup.py
new/django_silk-5.6.0/setup.py
--- old/django_silk-5.5.2/setup.py 2026-08-13 06:11:58.672315800 +0200
+++ new/django_silk-5.6.0/setup.py 2026-09-12 07:34:51.928452000 +0200
@@ -21,10 +21,9 @@
'Development Status :: 5 - Production/Stable',
'Environment :: Web Environment',
'Framework :: Django',
- 'Framework :: Django :: 4.2',
- 'Framework :: Django :: 5.1',
'Framework :: Django :: 5.2',
'Framework :: Django :: 6.0',
+ 'Framework :: Django :: 6.1',
'Intended Audience :: Developers',
'Operating System :: OS Independent',
'Programming Language :: Python',
@@ -38,7 +37,7 @@
'Topic :: Internet :: WWW/HTTP :: Dynamic Content',
],
install_requires=[
- 'Django>=4.2',
+ 'Django>=5.2',
'sqlparse',
'gprof2dot>=2017.09.19',
],
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django_silk-5.5.2/silk/__init__.py
new/django_silk-5.6.0/silk/__init__.py
--- old/django_silk-5.5.2/silk/__init__.py 2026-08-13 06:11:58.672315800
+0200
+++ new/django_silk-5.6.0/silk/__init__.py 2026-09-12 07:34:51.928452000
+0200
@@ -1,3 +1,6 @@
-from importlib.metadata import version
+from importlib.metadata import PackageNotFoundError, version
-__version__ = version("django-silk")
+try:
+ __version__ = version("django-silk")
+except PackageNotFoundError:
+ __version__ = "unknown"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django_silk-5.5.2/silk/middleware.py
new/django_silk-5.6.0/silk/middleware.py
--- old/django_silk-5.5.2/silk/middleware.py 2026-08-13 06:11:58.672876600
+0200
+++ new/django_silk-5.6.0/silk/middleware.py 2026-09-12 07:34:51.929073600
+0200
@@ -24,9 +24,9 @@
try:
r = reverse('silk:%s' % name, *args, **kwargs)
except NoReverseMatch:
- # In case user forgets to set namespace, but also fixes Django 1.5
tests on Travis
+ # In case user forgets to set namespace
# Hopefully if user has forgotten to add namespace there are no
clashes with their own
- # view names but I don't think there is really anything can do about
this.
+ # view names but I don't think there is really anything we can do
about this.
r = reverse(name, *args, **kwargs)
return r
@@ -44,7 +44,7 @@
def _should_intercept(request):
- """we want to avoid recording any requests/sql queries etc that belong to
Silky"""
+ """We want to avoid recording any requests/SQL queries, etc., that belong
to Silky."""
# Check custom intercept logic.
if config.SILKY_INTERCEPT_FUNC:
if not config.SILKY_INTERCEPT_FUNC(request):
@@ -55,11 +55,22 @@
return False
try:
+ # get_fpath() (via reverse()) picks up Django's script prefix
+ # (set from SCRIPT_NAME by the WSGI handler on every real
+ # request), so it already includes any front-end web server
+ # prefix -- exactly like request.path does. Keep comparing
+ # against request.path here; request.path_info has that
+ # prefix stripped and would no longer match.
silky = request.path.startswith(get_fpath())
except NoReverseMatch:
silky = False
- ignored = request.path in config.SILKY_IGNORE_PATHS
+ # SILKY_IGNORE_PATHS entries are plain strings the user writes in
+ # settings.py -- never passed through reverse() -- so they're
+ # naturally written without any deployment-specific SCRIPT_NAME
+ # prefix. Use path_info (prefix-stripped) here so such an entry
+ # still matches when silk is deployed behind a prefix. See GH #349.
+ ignored = request.path_info in config.SILKY_IGNORE_PATHS
return not (silky or ignored)
@@ -89,7 +100,7 @@
# To be able to persist filters when Session and Authentication
# middlewares are not present.
# Unlike session (which stores in DB) it won't persist filters
- # after refresh the page.
+ # after refreshing the page.
request.silk_filters = {}
response = self.get_response(request)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/django_silk-5.5.2/silk/migrations/0009_alter_request_prof_file.py
new/django_silk-5.6.0/silk/migrations/0009_alter_request_prof_file.py
--- old/django_silk-5.5.2/silk/migrations/0009_alter_request_prof_file.py
1970-01-01 01:00:00.000000000 +0100
+++ new/django_silk-5.6.0/silk/migrations/0009_alter_request_prof_file.py
2026-09-12 07:34:51.929236400 +0200
@@ -0,0 +1,25 @@
+# Generated by Django 5.2.17 on 2026-08-21 12:49
+
+from django.db import migrations, models
+
+import silk.models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("silk", "0008_sqlquery_analysis"),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name="request",
+ name="prof_file",
+ field=models.FileField(
+ blank=True,
+ max_length=300,
+ storage=silk.models.get_silk_storage,
+ upload_to="",
+ ),
+ ),
+ ]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django_silk-5.5.2/silk/models.py
new/django_silk-5.6.0/silk/models.py
--- old/django_silk-5.5.2/silk/models.py 2026-08-13 06:11:58.673049400
+0200
+++ new/django_silk-5.6.0/silk/models.py 2026-09-12 07:34:51.929236400
+0200
@@ -1,11 +1,11 @@
import base64
+import gzip
import json
import random
import re
from uuid import uuid4
import sqlparse
-from django.conf import settings
from django.core.files.storage import storages
from django.core.files.storage.handler import InvalidStorageError
from django.db import models, router, transaction
@@ -28,12 +28,18 @@
from silk.config import SilkyConfig
from silk.utils.profile_parser import parse_profile
-try:
- silk_storage = storages['SILKY_STORAGE']
-except InvalidStorageError:
- from django.utils.module_loading import import_string
- storage_class = SilkyConfig().SILKY_STORAGE_CLASS or
settings.DEFAULT_FILE_STORAGE
- silk_storage = import_string(storage_class)()
+
+def get_silk_storage():
+ """Resolve profiler file storage at use-time (migration-safe callable)."""
+ try:
+ return storages['SILKY_STORAGE']
+ except InvalidStorageError:
+ from django.utils.module_loading import import_string
+ return import_string(SilkyConfig().SILKY_STORAGE_CLASS)()
+
+
+# Kept for historical migrations that reference silk.models.silk_storage.
+silk_storage = get_silk_storage()
# Seperated out so can use in tests w/o models
@@ -84,7 +90,8 @@
meta_num_queries = IntegerField(null=True, blank=True)
meta_time_spent_queries = FloatField(null=True, blank=True)
pyprofile = TextField(blank=True, default='')
- prof_file = FileField(max_length=300, blank=True, storage=silk_storage)
+ # Callable storage keeps migrations stable across project STORAGES
settings.
+ prof_file = FileField(max_length=300, blank=True, storage=get_silk_storage)
# Useful method to create shortened copies of strings without losing start
and end context
# Used to ensure path and view_name don't exceed 190 characters
@@ -221,7 +228,15 @@
@property
def raw_body_decoded(self):
- return base64.b64decode(self.raw_body)
+ raw_body = base64.b64decode(self.raw_body)
+ if self.headers.get('content-encoding') == 'gzip':
+ try:
+ return gzip.decompress(raw_body)
+ except (OSError, EOFError):
+ # Malformed gzip payloads must not crash the raw view;
+ # fall back to the still-compressed body.
+ return raw_body
+ return raw_body
# TODO rewrite docstring
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django_silk-5.5.2/tox.ini
new/django_silk-5.6.0/tox.ini
--- old/django_silk-5.5.2/tox.ini 2026-08-13 06:11:58.692936200 +0200
+++ new/django_silk-5.6.0/tox.ini 2026-09-12 07:34:51.947491000 +0200
@@ -9,16 +9,15 @@
[gh-actions:env]
DJANGO =
- 4.2: dj42
- 5.1: dj51
5.2: dj52
6.0: dj60
+ 6.1: dj61
main: djmain
[tox]
envlist =
- py{310-315}-dj{42,50,51,52}-{sqlite3,mysql,postgresql}
- py{312-315}-dj{60,main}-{sqlite3,mysql,postgresql}
+ py{310-315}-dj52-{sqlite3,mysql,postgresql}
+ py{312-315}-dj{60,61,main}-{sqlite3,mysql,postgresql}
[testenv]
usedevelop = True
@@ -29,10 +28,9 @@
-rrequirements.txt
mysql: mysqlclient
postgresql: psycopg2-binary
- dj42: django>=4.2,<4.3
- dj51: django>=5.1,<5.2
dj52: django>=5.2,<5.3
dj60: django>=6.0,<6.1
+ dj61: django>=6.1,<6.2
djmain: https://github.com/django/django/archive/main.tar.gz
extras = formatting
setenv =