Skip to main content

Django implementation of Cap.js Server for Proof of Work captcha

Project description

django_cap_tests cov release downloads PyPI - Status

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

  1. Add CapField to 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.")
  1. 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 is True.
  • 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 4
  • CAP_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

  1. Clone this repository.

  2. Make sure you have python 3.13 installed.

    python --version
    
  3. 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
    
  4. Install the dependencies:

    uv sync
    
  5. Activate the virtual environment:

    # for linux/macOS
    source .venv/bin/activate
    
    # for windows
    .\.venv\Scripts\Activate.ps1
    
  6. Run tests:

    uv run pytest
    
  7. Run linting and formatting:

    # Check code quality
    uv run ruff check
    
    # Format code
    uv run ruff format
    
  8. 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

django_cap-0.2.1.tar.gz (26.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

django_cap-0.2.1-py3-none-any.whl (31.8 kB view details)

Uploaded Python 3

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

Hashes for django_cap-0.2.1.tar.gz
Algorithm Hash digest
SHA256 7c155d34888299455f992ef1ee65073125d4f7bfe95800bd667c513eb8bc2a59
MD5 5131ddfc218984ffc2ee6500c20c5a3c
BLAKE2b-256 612f08c1301fcabecd52ca4cf55e94806c59cefe70505504f983cfad58f3bc0e

See more details on using hashes here.

Provenance

The following attestation bundles were made for django_cap-0.2.1.tar.gz:

Publisher: release.yml on Somiona/django_cap

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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

Hashes for django_cap-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 40d51101a05782fed9d658dd2263048c80f844ea1a3edb7127c024332fc79e16
MD5 84db1ef896790d539b12c890dfb76333
BLAKE2b-256 2c9fdb02e3fd1612b06f09992149e7336fe87a049124585587aac129ff5e8639

See more details on using hashes here.

Provenance

The following attestation bundles were made for django_cap-0.2.1-py3-none-any.whl:

Publisher: release.yml on Somiona/django_cap

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page