ABOUT ME

Today
Yesterday
Total
  • Web Dev Bootcamp TIL Day-30(Django Cont: user authorization)
    TIL 2022. 5. 27. 21:09

    Django's built-in user authorization model

    • notice the boolean fields that Django includes in its built-in user model
    • we can create more concise views when we use the inhereited functionality of our built-in user model
    • we can use python manage.py createsuperuser to add a user
    • to tweak this buil-in model, we can inherit the functionality of django's builtin AbstractUser and add our own features
    AUTH_USER_MODEL = 'user.UserModel'
    from django.contrib.auth.models import AbstractUser
    class UserModel(AbstractUser):
        class Meta:
            db_table = "my_user"
        bio = models.CharField(max_length=256, default='')

     

    • using django's built-in auth module, we can register, authorize and authenticate a user in simple steps
    from django.contrib.auth import authenticate, login, get_user_model, models
    def sign_up_view(request):
        if request.method == 'GET':
            return render(request, 'user/signup.html')
    
        elif request.method == 'POST':
            username = request.POST.get('username', None)
            password = request.POST.get('password', None)
            password2 = request.POST.get('password2', None)
            bio = request.POST.get('bio', None)
    
        #queries matching username to check if username is in use
        user_exists = get_user_model().objects.filter(username=username)
    
        #if username is in use or password does not match
        if user_exists or password!=password2:
            return redirect('/sign-up')
        else:
            UserModel.objects.create_user(username=username, password=password, bio=bio)
        return redirect('/sign-in')
    def sign_in_view(request):
        if request.method == 'GET':
            return render(request, 'user/signin.html')
    
        elif request.method == 'POST':
            username = request.POST.get('username', None)
            password = request.POST.get('password', None)
    
            user_info = authenticate(request, username=username, password=password)
            if user_info:
                login(request, user_info)
                return HttpResponse(user_info.username)
    
            return redirect('/sign-in')

     

     

     

    • django allows our base.html template to access the user information
    • we can create dynamic templates based on this feature
    {% if not user.is_authenticated %}
        <ul class="navbar-nav mr-auto">
            <li class="nav-item active">
                <a class="nav-link" href="/sign-in"> Sign In <span class="sr-only"></span></a>
            </li>
            <li class="nav-item active">
                <a class="nav-link" href="/sign-up"> Sign Up <span class="sr-only"></span></a>
            </li>
        </ul>
    {% else %}
        <ul class="navbar-nav mr-auto">
            <li class="nav-item active">
                <a class="nav-link" href="#"> {{ user.username }} 님 반갑습니다! <span class="sr-only"></span></a>
            </li>
            <li class="nav-item active">
                <a class="nav-link" href="/logout"> 로그아웃 <span class="sr-only"></span></a>
            </li>
        </ul>
    {% endif %}

     

Designed by Tistory.