Use namespaces in requests using Django.
With django-namespaces, we get a new way to group resources based on request.namespace
.
Use a virtual environment whenever using Python packages. The built-in venv module is great.
python3 -m venv venv
source venv/bin/activate
$(venv) python -m pip install django-namespaces --upgrade
Add django_namespaces
to INSTALLED_APPS
:
INSTALLED_APPS = [
# ...
"django_namespaces",
]
Update MIDDLEWARE
:
MIDDLEWARE = [
# ...
"django_namespaces.middleware.NamespaceMiddleware",
]
This gives us access to the request.namespace
object in our views.
Add django_namespaces.context_processors.user_namespaces
to TEMPLATE_CONTEXT_PROCESSORS
:
TEMPLATE_CONTEXT_PROCESSORS = [
# ...
"django_namespaces.context_processors.user_namespaces",
]
from django.contrib.auth import get_user_model
from django_namespaces.models import Namespace
User = get_user_model()
user = User.objects.create_user(username="jon.snow", password="youknowsomething")
namespace = Namespace.objects.create(handle="winterfell", user=user)
namespace2 = Namespace.objects.create(handle="thewall", user=user)
import django_namespaces
django_namespaces.activate("winterfell")
This will add a namespace to the request object.
def my_hello_world_view(request):
print(request.namespace) # <Namespace: winterfell>
print(request.namespace.handle) # winterfell
return HttpResponse("Hello World")
from django.db import models
from django_namespaces.models import Namespace
class Location(models.Model):
name = models.CharField(max_length=255, blank=True, null=True)
namespace = models.ForeignKey(Namespace, on_delete=models.CASCADE)
If you want to use a custom namespace model, you can do so by setting the DJANGO_NAMESPACES_NAMESPACE_MODEL
setting.
DJANGO_NAMESPACES_NAMESPACE_MODEL = "orgs.Organization"
Example model in orgs.models.py
:
from django.db import models
class Organization(models.Model):
handle = models.CharField(max_length=255, unique=True)
handle
is the only required field to swap the model.
Using views are optional. You can also use the activate
function to activate a namespace.
Update urls.py
to include namespaces.urls
:
urlpatterns = [
# ...
path("namespaces/", include("django_namespaces.urls")),
]
Create a namespace by visiting http://localhost:8000/namespaces/create/
and filling out the form.
Activate a namespace by visiting http://localhost:8000/namespaces/
and hitting activate
on your newly created namespace.
You can also use: