Security News
Supply Chain Attack Detected in Solana's web3.js Library
A supply chain attack has been detected in versions 1.95.6 and 1.95.7 of the popular @solana/web3.js library.
django-speedinfo
is a live profiling tool for Django projects to find
the most high loaded views for the next optimization. django-speedinfo
counts
number of calls, cache hits, SQL queries, measures average and total call time
and more for each of your views. Detailed report and profiler controls are
available in Django admin.
pip install django-speedinfo
Old profiling data will be unavailable after upgrading. Don't forget to export the data in advance.
SPEEDINFO_PROFILING_CONDITIONS
is empty by default. If you use SPEEDINFO_EXCLUDE_URLS
in your
project you need to initialize the list of conditions explicitly:
SPEEDINFO_PROFILING_CONDITIONS = ["speedinfo.conditions.exclude_urls.ExcludeURLCondition"]
SPEEDINFO_REPORT_COLUMNS
and SPEEDINFO_REPORT_COLUMNS_FORMAT
were removed, use SPEEDINFO_ADMIN_COLUMNS
instead.
Every entry in SPEEDINFO_ADMIN_COLUMNS
list is a tuple (column name, value format, attribute name).
See Customize admin columns for details. To add extra columns
follow the instruction in the section Extra admin columns below.speedinfo.settings
module renamed to speedinfo.conf
Condition
to AbstractCondition
speedinfo
to INSTALLED_APPS
.speedinfo.middleware.ProfilerMiddleware
to the end of MIDDLEWARE
(or MIDDLEWARE_CLASSES
for Django < 1.10)
list, but before django.middleware.cache.FetchFromCacheMiddleware
(if used):
MIDDLEWARE = [
...,
"speedinfo.middleware.ProfilerMiddleware",
"django.middleware.cache.FetchFromCacheMiddleware",
]
django-speedinfo
needs the cache to store profiler state between requests and to intercept calls to cache:
CACHES = {
"default": {
"BACKEND": "speedinfo.backends.proxy_cache",
"CACHE_BACKEND": "django.core.cache.backends.filebased.FileBasedCache",
"LOCATION": "/var/tmp/django_cache",
}
}
django-speedinfo
comes with two storages to choose from:
speedinfo.storage.database
to INSTALLED_APPS
.SPEEDINFO_STORAGE = "speedinfo.storage.database.storage.DatabaseStorage"
to project settings.python manage.py migrate
.SPEEDINFO_STORAGE = "speedinfo.storage.cache.storage.CacheStorage"
to project settings.CACHES
to store profiling data.
To use it in CacheStorage
assign SPEEDINFO_CACHE_STORAGE_CACHE_ALIAS
to the appropriate cache alias.
Example:
CACHES = {
"default": {
"BACKEND": "speedinfo.backends.proxy_cache",
"CACHE_BACKEND": "django.core.cache.backends.db.DatabaseCache",
"LOCATION": "cache_table",
},
"speedinfo-storage": {
"BACKEND": "django.core.cache.backends.memcached.MemcachedCache",
"LOCATION": "127.0.0.1:11211",
},
})
SPEEDINFO_CACHE_STORAGE_CACHE_ALIAS = "speedinfo-storage"
python manage.py collectstatic
.Open Views profiler
in Django admin. Click the Turn on
/ Turn off
button
to control profiler state. Press Reset
button to delete all profiling data.
django-speedinfo
automatically detects when Django use per-site caching via
UpdateCacheMiddleware
and FetchFromCacheMiddleware
middlewares
or per-view caching via cache_page
decorator and counts cache hit
when retrieving pages from the cache.
If you implement your own caching logic and want to mark the view response
as obtained from the cache, add specified attribute to the HttpResponse
object
as shown below:
from django.views import View
from from speedinfo.conf import speedinfo_settings
class CachedView(View):
def get(self, request, *args, **kwargs):
# ...
# Assume that `response` was taken from the cache
setattr(response, speedinfo_settings.SPEEDINFO_CACHED_RESPONSE_ATTR_NAME, True)
return response
The default value of SPEEDINFO_CACHED_RESPONSE_ATTR_NAME
is _is_cached
.
But you can override it if the attribute name is conflicts with your application logic.
SPEEDINFO_ADMIN_COLUMNS
allows to control visibility and appearance of Django admin
profiler columns. Every entry in the SPEEDINFO_ADMIN_COLUMNS
list is a tuple of
(column name, value format, ViewProfiler
attribute name). Default value:
SPEEDINFO_ADMIN_COLUMNS = (
("View name", "{}", "view_name"),
("HTTP method", "{}", "method"),
("Anonymous calls", "{:.1f}%", "anon_calls_ratio"),
("Cache hits", "{:.1f}%", "cache_hits_ratio"),
("SQL queries per call", "{}", "sql_count_per_call"),
("SQL time", "{:.1f}%", "sql_time_ratio"),
("Total calls", "{}", "total_calls"),
("Time per call", "{:.8f}", "time_per_call"),
("Total time", "{:.4f}", "total_time"),
)
To add additional data to a storage and columns to admin follow the instruction:
fetch_all()
method that will return the list of the ViewProfiler
instances initialized with the extra fields. Example:
def fetch_all(self, ordering=None):
...
return [
ViewProfiler(view_name="...", method="...", ..., extra_field="...")
...
]
fetch_all()
method.SPEEDINFO_ADMIN_COLUMNS
as described in the section
Customize admin columns.SPEEDINFO_PROFILING_CONDITIONS
allows to declare a list of condition classes
to filter profiling views by some rules. By default SPEEDINFO_PROFILING_CONDITIONS
is empty.
django-speedinfo
comes with one build-in condition - ExcludeURLCondition
. It allows to
exclude some urls from profiling by adding them to the SPEEDINFO_EXCLUDE_URLS
list.
Each entry in SPEEDINFO_EXCLUDE_URLS
is a regex compatible expression to test requested url.
Usage example:
SPEEDINFO_PROFILING_CONDITIONS = [
"speedinfo.conditions.exclude_urls.ExcludeURLCondition",
]
SPEEDINFO_EXCLUDE_URLS = [
r"/admin/",
r"/news/$",
r"/movie/\d+/$",
]
To define your own condition class, you must inherit from the base class speedinfo.conditions.base.AbstractCondition
and implement all abstract methods. See ExcludeURLCondition
source code for implementation example. Then add
full path to your class to SPEEDINFO_PROFILING_CONDITIONS
list as shown above. Conditions in mentioned list
are executed in a top-down order. The first condition returning False
interrupts the further check.
django-speedinfo
comes with DatabaseStorage
and CacheStorage
. But you may want to write your
own storage (e.g. for MongoDB, Redis or even file-based). First create the storage class based on
speedinfo.storage.base.AbstractStorage
and implement all abstract methods. See speedinfo.storage.cache.storage
and speedinfo.storage.database.storage
as an examples. Then add path to your custom storage class
to the project settings SPEEDINFO_STORAGE = "path.to.module.CustomStorage"
. Use our tests
to make sure that everything works as intended (you need to clone repository to get access to the tests
package):
from django.test import TestCase, override_settings
from tests.test_storage import StorageTestCase
@override_settings(
SPEEDINFO_STORAGE="path.to.module.CustomStorage",
SPEEDINFO_TESTS=True,
)
class CustomStorageTestCase(StorageTestCase, TestCase):
pass
The number of SQL queries measured by django-speedinfo
may differ from the values
of django-debug-toolbar
for the same view. It happens because django-speedinfo
shows the average number of SQL queries for each view. Also profiler doesn't take
into account SQL queries made in the preceding middlewares.
FAQs
Live profiling tool for Django framework to measure views performance
We found that django-speedinfo demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
A supply chain attack has been detected in versions 1.95.6 and 1.95.7 of the popular @solana/web3.js library.
Research
Security News
A malicious npm package targets Solana developers, rerouting funds in 2% of transactions to a hardcoded address.
Security News
Research
Socket researchers have discovered malicious npm packages targeting crypto developers, stealing credentials and wallet data using spyware delivered through typosquats of popular cryptographic libraries.