django-link-shortener
django-link-shortener is a Django app for creating time-limited and usage-capped short URLs.
Features
- Generate short links for URLs.
- Time-sensitive links (configurable lifespan).
- Usage-limited links (configurable maximum uses).
- Per-user override of default settings via Django admin.
- Test endpoint for easy shortcode creation during development.
- Character set for shortcodes excludes I, i, 1.
Usage
-
Install with
pip install django-link-shortener -
Add
shortenerto your INSTALLED_APPS setting:INSTALLED_APPS = [ ... 'shortener', ]
-
Include
shortener.urlsin your project urls.py:path('s/', include('shortener.urls')),
-
Run
python manage.py migrateto create the shortener models. -
Use
shortener.create(user, link)to generate a shortcode.from shortener import shortener user = User.objects.first() shortener.create(user, "https://example.com")
-
To expand the shortcode use
shortener.expand(shorlink_id), or visithttp://127.0.0.1:8000/s/<shortcode>/.
Test Endpoint
-
To enable the test endpoint, add the following to settings:
SHORTENER_ENABLE_TEST_PATH = True
-
Start the development server and visit
http://127.0.0.1:8000/s/test/<my-url-here>to create a test shortcode. -
Visit
http://127.0.0.1:8000/s/<shortcode>/to be redirected
Configuration Options
Place in settings.py. Each setting can be overridden on a per-user basis using the UrlProfile section in the Django admin.
SHORTENER_ENABLED
Default: True
Controls whether users without a shortener profile can create shortlinks.
SHORTENER_MAX_URLS
Default: -1
Controls the default maximum limit of generated urls per account. -1 sets infinite.
SHORTENER_MAX_CONCURRENT
Default: -1
Controls the default maximum limit of concurrent (active) generated urls per account. -1 sets infinite.
SHORTENER_LIFESPAN
Default: -1
Sets the default lifespan of links in seconds. -1 sets infinite.
SHORTENER_MAX_USES
Default: -1
Sets the default amount of times a link can be followed. -1 sets infinite.
SHORTENER_LENGTH
Default: 5
Note: Omitted from UrlProfile.
Sets how many digits should be used for links. Tries up to three times to generate a unique shortcode where Each failure will result in length temporarily being increased by 1.
SHORTENER_ENABLE_TEST_PATH
Default: False
If true, creates shortlinks on authenticated requests to s/test/<url>/
and returns a shortcode.
Common Use Cases
goo.gl type usage (default). Unlimited concurrent links for an unlimited length of time
SHORTENER_ENABLED = True
SHORTENER_MAX_URLS = -1
SHORTENER_MAX_CONCURRENT = -1
SHORTENER_LIFESPAN = -1
SHORTENER_MAX_USES = -1
Internal temporary link usage. 100 active links with a lifespan of 1 hour. 1 usage per link.
SHORTENER_ENABLED = True
SHORTENER_MAX_URLS = -1
SHORTENER_MAX_CONCURRENT = 100
SHORTENER_LIFESPAN = 600
SHORTENER_MAX_USES = 1
Changelog
For versions > v0.5 see Release Notes
v0.5
- Replaced NullBooleanField with BooleanField (Credit: sen-den)
- Replaced travis-ci with github actions
v0.4
- Allow null values in UrlProfile; null fields will use global values
- str representation of UrlProfile in admin
- add user to str representation of UrlMap
- removed 256 char limit on full_url (Credit: Khaeshah)
Release files for django-link-shortener 1.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| django_link_shortener-1.1.0.tar.gz | 7.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| django_link_shortener-1.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 18.4 kB
Release files / django_link_shortener-1.1.0.tar.gz
| Download URL | django_link_shortener-1.1.0.tar.gz |
|---|---|
| Size | 7.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5784de21c16e265f0349d43529e1ec4625043aedea6e09b8e0f0fdceb32fc1f5
|
|
BLAKE2b-256 checksum How to use checksums |
7715eaa8c57813795ac3f22f55086004a3be73623221503d6e0595e37e5a0cee
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Dec 17, 2025.
Transparency logRelease files / django_link_shortener-1.1.0-py3-none-any.whl
| Download URL | django_link_shortener-1.1.0-py3-none-any.whl |
|---|---|
| Size | 10.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6c3a1cda9aaa58ac9d9a43bfca1b2d2242b89ad5a88bf4465b790c5c91450244
|
|
BLAKE2b-256 checksum How to use checksums |
1f97e9e79c4b9f57885fcf3ad5c5c7745aa8a8456c1d10db5947de9302b600da
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Dec 17, 2025.
Transparency log