DEV Community

Cover image for User Accounts With django-allauth - Building SaaS #41
Matt Layman
Matt Layman

Posted on • Originally published at


User Accounts With django-allauth - Building SaaS #41

In this episode, we added django-allauth to create accounts that default to email instead of using usernames. We added the package, configured some templates, and created tests.

We continued to look at Will Vincent's django-allauth post on creating user accounts with email and passwords.

django-allauth let's us swap out username and email so that users won't need to create a username, which is the behavior that I want for this service.

In, I installed django-allauth:


Then ran pip-compile to create the new requirements.txt and pip to install the actual package.

(venv) $ pip-compile --output-file=requirements.txt
(venv) $ pip install -r requirements.txt

After that, we needed to put django-allauth into INSTALLED_APPS.

# project/

Then I added the settings that Will outlines. These are settings that django-allauth needs to set things up for email-based accounts.

# project/
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'




Finally, we created some place for the django-allauth views to reside.

# project/
urlpatterns = [
    path("accounts/", include("allauth.urls")),

This gave us enough configuration to see the views in action on the local site.

After that, we created an area for templates at the root of the project. We have to tell Django where the templates directory is.

# project/
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        "DIRS": [os.path.join(BASE_DIR, "templates")],

Following template configuration, we added some custom templates for login.html and signup.html.

With templates in place, I needed to make a place for user's to land after they logged in. I created a view named app and pointed the settings at that view.

# homeschool/schools/
from django.contrib.auth.decorators import login_required
from django.shortcuts import render

def app(request):
    context = {}
    return render(request, "schools/app.html", context)
# project/

To finish off the night, I wrote some tests to verify the behavior of my new view.

# homeschool/schools/tests/
from django.test import Client, TestCase
from django.urls import reverse

from homeschool.users.tests.factories import UserFactory

class TestApp(TestCase):
    def test_ok(self):
        """The app returns 200 OK for a user."""
        client = Client()
        user = UserFactory()

        response = client.get(reverse("app"))

        self.assertEqual(response.status_code, 200)

    def test_unauthenticated_access(self):
        """Unauthenticated users are redirected to the login page."""
        client = Client()

        response = client.get(reverse("app"))

        self.assertEqual(response.status_code, 302)
        self.assertIn(reverse("account_login"), response.get("Location"))

These tests prove that an authenticated user can access the site and an unauthenticated user get redirected to the login page.

Next time, we will move on to some of the core models of the project.

This article first appeared on

Top comments (0)

Timeless DEV post...

Git Concepts I Wish I Knew Years Ago

The most used technology by developers is not Javascript.

It's not Python or HTML.

It hardly even gets mentioned in interviews or listed as a pre-requisite for jobs.

I'm talking about Git and version control of course.

One does not simply learn git