Django implementation of Cap.js Server for Proof of Work captcha
Project description
Django Cap
This is a implementation of Cap.js Server for Django, which provides challenge generation and verification for PoW (Proof of Work) captcha. See
Usage
Installation
To install the package, simply run:
pip install django-cap
If you want to use the Django Ninja integration, you can install it with:
pip install django-cap[ninja]
Or if you want to use the Django Rest Framework integration, you can install it with:
pip install django-cap[drf]
TODO: only ninja integration and vanilla Django Json views are implemented, DRF integration will be added in the future.
Configuration
To use this package, you need to add django_cap to your INSTALLED_APPS in your Django settings file:
INSTALLED_APPS = [
...
'django_cap',
'django_cap.ninja', # Add this if you want enable ninja integration
]
You need to configure the url patterns in your Django project's urls.py file:
from django_cap.example_views import urls as example_views_urls
# import examples if you want to see them
urlpatterns = [
...
path("cap/", include("django_cap.urls")),
path("cap/examples/", include("django_cap.example.urls")),, # add this if you want to see examples
...
]
You can access the api at /cap/v1/[challenge|redeem|validate] endpoints. This is compatible with Cap.js/widgets. If your frontend is not hosted by Django, you need to refer Cap.js documentation for the installation, and simply configure the api endpoint as following:
<cap-widget id="cap" data-cap-api-endpoint="https://your-api-site/cap/v1/"></cap-widget>
By default, ninja doc will be avaliable at /cap/v1/docs/ and /cap/v1/openapi.json. If you want to disable the ninja doc, you can disable it in your Django settings file:
#django_settings.py
...
CAP_NINJA_API_ENABLE_DOCS = False
...
Use with Django Templates and Forms
This package provides comprehensive Django form integration for CAP verification. You can easily add CAP verification to any Django form:
Basic Form Integration
- Add
CapFieldto your form:
from django import forms
from django_cap.forms import CapField
class MyForm(forms.Form):
name = forms.CharField(max_length=100)
email = forms.EmailField()
# Add CapField for CAP verification
cap_token = CapField(help_text="Please retry the verification challenge.")
- In your template, render the form as usual:
<form method="post">
{% csrf_token %}
{{ form.name.label_tag }} {{ form.name }}
{{ form.email.label_tag }} {{ form.email }}
{{ form.cap_token.label_tag }} {{ form.cap_token }}
{% if form.cap_token.errors %}
<div class="form-errors">
{% for error in form.cap_token.errors %}<div class="error">{{ error }}</div>{% endfor %}
</div>
{% endif %}
<button type="submit">Submit</button>
</form>
That's it! The CapField will automatically handle the CAP verification process, including generating the challenge and validating the response.
Configuration Options
CAP_NINJA_API_ENABLE_DOCS: Enable or disable the ninja API docs. Default isTrue.CAP_CHALLENGE_COUNT: The number of answer required for one challenge. Default is 50.CAP_CHALLENGE_SIZE: The size of the challenge string. Default is 32.CAP_CHALLENGE_DIFFICULTY: The difficulty of the challenge, Default is 4CAP_CHALLENGE_EXPIRES_S: The expiration time of the challenge in seconds. Default is 30 seconds.CAP_TOKEN_EXPIRES_S: The expiration time of the token in seconds. Default is 10 minutes.CAP_CLEANUP_INTERVAL_S: The interval for cleaning up expired challenges and tokens in seconds. Default is 60 seconds.
Dev environment setup
-
Clone this repository.
-
Make sure you have python 3.13 installed.
python --version -
Make sure you have uv installed.
# for MacOS, recommend using homebrew brew install uv
# for Linux, recommend using their installer # curl curl -LsSf https://astral.sh/uv/install.sh | sh # wget wget -qO- https://astral.sh/uv/install.sh | sh
# for Windows, recommend using WinGet winget install --id=astral-sh.uv -e # you can also use scoop scoop install main/uv
-
Install the dependencies:
uv sync -
Activate the virtual environment:
# for linux/macOS source .venv/bin/activate
# for windows .\.venv\Scripts\Activate.ps1
-
Run tests:
uv run pytest
-
Run linting and formatting:
# Check code quality uv run ruff check # Format code uv run ruff format
-
Build the package:
uv run pdm build
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
License
This project is licensed under the Apache License 2.0 - see the LICENSE file for details.
Links
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file django_cap-0.2.1.tar.gz.
File metadata
- Download URL: django_cap-0.2.1.tar.gz
- Upload date:
- Size: 26.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7c155d34888299455f992ef1ee65073125d4f7bfe95800bd667c513eb8bc2a59
|
|
| MD5 |
5131ddfc218984ffc2ee6500c20c5a3c
|
|
| BLAKE2b-256 |
612f08c1301fcabecd52ca4cf55e94806c59cefe70505504f983cfad58f3bc0e
|
Provenance
The following attestation bundles were made for django_cap-0.2.1.tar.gz:
Publisher:
release.yml on Somiona/django_cap
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
django_cap-0.2.1.tar.gz -
Subject digest:
7c155d34888299455f992ef1ee65073125d4f7bfe95800bd667c513eb8bc2a59 - Sigstore transparency entry: 285591537
- Sigstore integration time:
-
Permalink:
Somiona/django_cap@209c8dbdbc7abf1a9173013bd619bf018d1d3ea7 -
Branch / Tag:
refs/tags/0.2.1 - Owner: https://github.com/Somiona
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@209c8dbdbc7abf1a9173013bd619bf018d1d3ea7 -
Trigger Event:
push
-
Statement type:
File details
Details for the file django_cap-0.2.1-py3-none-any.whl.
File metadata
- Download URL: django_cap-0.2.1-py3-none-any.whl
- Upload date:
- Size: 31.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
40d51101a05782fed9d658dd2263048c80f844ea1a3edb7127c024332fc79e16
|
|
| MD5 |
84db1ef896790d539b12c890dfb76333
|
|
| BLAKE2b-256 |
2c9fdb02e3fd1612b06f09992149e7336fe87a049124585587aac129ff5e8639
|
Provenance
The following attestation bundles were made for django_cap-0.2.1-py3-none-any.whl:
Publisher:
release.yml on Somiona/django_cap
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
django_cap-0.2.1-py3-none-any.whl -
Subject digest:
40d51101a05782fed9d658dd2263048c80f844ea1a3edb7127c024332fc79e16 - Sigstore transparency entry: 285591547
- Sigstore integration time:
-
Permalink:
Somiona/django_cap@209c8dbdbc7abf1a9173013bd619bf018d1d3ea7 -
Branch / Tag:
refs/tags/0.2.1 - Owner: https://github.com/Somiona
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@209c8dbdbc7abf1a9173013bd619bf018d1d3ea7 -
Trigger Event:
push
-
Statement type: