Skip to main content

Django Require Login

Build Status codecov PyPI Code style: black License

Forked from django-stronghold

Require login on all your django URLs by default

Supported Versions

  • Python 3.10, 3.11, 3.12
  • Django 4.2, 5.0

Installation and Setup

Install via pip.

pip install django-require-login

Then add the middleware to your MIDDLEWARE in your Django settings file

MIDDLEWARE = [
    #...
    "django_require_login.middleware.LoginRequiredMiddleware",
]

After adding the middleware, all your Django views will default to login required.

If your LOGIN_URL and LOGOUT_REDIRECT_URL contain a named URL pattern add REQUIRE_LOGIN_PUBLIC_NAMED_URLS to your settings file with your LOGIN_URL and LOGOUT_REDIRECT_URL

REQUIRE_LOGIN_PUBLIC_NAMED_URLS = (LOGIN_URL, LOGOUT_REDIRECT_URL)

If your LOGIN_URL and LOGOUT_REDIRECT_URL don't contain a named URL pattern add REQUIRE_LOGIN_PUBLIC_URLS to your settings file with your LOGIN_URL and LOGOUT_REDIRECT_URL

REQUIRE_LOGIN_PUBLIC_URLS = (LOGIN_URL, LOGOUT_REDIRECT_URL)

Usage

To make a view public again you can use the public decorator:

For function based views

from django_require_login.decorators import public
from django.http import HttpResponse


@public
def my_view(request):
    return HttpResponse("Public")

For class based views (decorator)

from django.utils.decorators import method_decorator
from django_require_login.decorators import public
from django.views.generic import View
from django.http import HttpResponse


class SomeView(View):
    def get(self, request, *args, **kwargs):
        return HttpResponse("Public view")
    
    @method_decorator(public)
    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)

For class based views (mixin)

from django_require_login.mixins import PublicViewMixin
from django.views.generic import View


class SomeView(PublicViewMixin, View):
	pass

Configuration (optional)

You can add a tuple of url regexes in your settings file with the REQUIRE_LOGIN_PUBLIC_URLS setting. Any url that matches against these patterns will be made public without using the @public decorator.

REQUIRE_LOGIN_PUBLIC_URLS

Default:

REQUIRE_LOGIN_PUBLIC_URLS = ()

Development Defaults

If DEBUG is True, REQUIRE_LOGIN_PUBLIC_URLS contains:

from django.conf import settings

(
    r'{}.+$'.format(settings.STATIC_URL),
    r'{}.+$'.format(settings.MEDIA_URL),
)

This is additive to your settings to support serving static files and media files from the development server. It does not replace any settings you may have in REQUIRE_LOGIN_PUBLIC_URLS.

Note: Public URL regexes are matched against HttpRequest.path_info.

REQUIRE_LOGIN_PUBLIC_NAMED_URLS

You can add a tuple of url names in your settings file with the REQUIRE_LOGIN_PUBLIC_NAMED_URLS setting. Names in this setting will be reversed using django.urls.reverse and any url matching the output of the reverse call will be made public without using the @public decorator:

Default:

REQUIRE_LOGIN_PUBLIC_NAMED_URLS = ()

REQUIRE_LOGIN_USER_TEST_FUNC

Optionally, set REQUIRE_LOGIN_USER_TEST_FUNC to a callable to limit access to users that pass a custom test. The callback receives a User object and should return True if the user is authorized. This is equivalent to decorating a view with user_passes_test.

Example:

REQUIRE_LOGIN_USER_TEST_FUNC = lambda user: user.is_staff

Default:

REQUIRE_LOGIN_USER_TEST_FUNC = lambda user: user.is_authenticated

Integration with Django REST Framework

Django REST Framework is not part of Django and uses its own authentication system. For this reason, you need to make all of your DRF views public and rely on DRF's authentication system.

Example

Assuming all your DRF views live under /api/ you can make them all public using a regex:

REQUIRE_LOGIN_PUBLIC_URLS = (r"^/api/.*",)

Security

If you believe you've found a bug with security implications, please do not disclose this issue in a public forum.

Email us at support@laac.dev

Contribute

See CONTRIBUTING.md

Metadata

Release files for django-require-login 1.1.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for django-require-login 1.1.4
File Size Uploaded
django_require_login-1.1.4.tar.gz 6.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for django-require-login 1.1.4
File Interpreter ABI Platform
django_require_login-1.1.4-py3-none-any.whl Python 3 none any Details

Total release size: 13.4 kB

Release files / django_require_login-1.1.4.tar.gz

Download URL django_require_login-1.1.4.tar.gz
Size 6.1 kB
Tags Source
SHA-256 checksum
How to use checksums
0320128ace94561afbca3f3580bce6df4b8a90ba20313b43971bc26ed2e4cce0
BLAKE2b-256 checksum
How to use checksums
3890ebe23c4e2cb9c0d883b92a98aae9b1d45b8e0e7e385cbe7b684300a36588
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.4.2 CPython/3.11.3 Linux/5.15.0-92-generic

Release files / django_require_login-1.1.4-py3-none-any.whl

Download URL django_require_login-1.1.4-py3-none-any.whl
Size 7.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
71e2e85c6148985afa2cc8a52afa9e3a0ec3f77bb6766d4d9c618529e43f7856
BLAKE2b-256 checksum
How to use checksums
c0edb0cf23e38b2fc0f5c19d1d1a169b2103558149fefae5efbd03d7c948f4a1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.4.2 CPython/3.11.3 Linux/5.15.0-92-generic

Release history Release notifications | RSS feed

This release

1.1.4 This release

2 release files

1.1.2

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.2

2 release files

1.0.1

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page