Django 기본 정리

Haks.·2025년 2월 3일
0

Study

목록 보기
47/65

Django 프로젝트 기본 정리

Tip

  • Django ORM에서는 select_related()를 사용하여 INNER JOIN을 실행할 수 있음.

  • Django ORM에서는 prefetch_related()를 사용하여 LEFT JOIN을 실행할 수 있음.

  • 참조 : 하나의 모델에서 다른 모델을 직접 가리키는 관계

  • 역참조 : 모델의 반대방향에서 가져오는 것

구분설명예제
참조(Reference)ForeignKey로 연결된 객체를 직접 가져오는 것book.author
역참조(Reverse Reference)ForeignKey를 반대로 접근하는 것author.book_set.all() (or author.books.all() with related_name)
class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    
# author 를 같이 불러올수 잇음
book = Book.objects.create(title="Harry Potter", author=author)
author = Author.objects.get(name="J.K. Rowling")

# 역참조를 통해 해당 작가가 쓴 모든 책을 가져오기
books = author.book_set.all()  # book_set 자동 생성
for book in books:
    print(book.title)
  • related_name을 설정하면 book_set 대신 더 의미 있는 이름으로 역참조 가능합니다.
class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name="books")  # 역참조 이름 지정

author = Author.objects.get(name="J.K. Rowling")

# 역참조 (이제 book_set 대신 books 사용 가능)
books = author.books.all()
for book in books:
    print(book.title)  # "Harry Potter"
  • select_related() (ForeignKey 관계 최적화, 참조)
    • INNER JOIN을 사용하여 한 번의 SQL 쿼리로 가져옴 → 쿼리 수가 줄어들어 성능 최적화
# 기본 쿼리 (N+1 문제 발생)
books = Book.objects.all()
for book in books:
    print(book.author.name)  # 각 book마다 author 정보를 가져오면서 추가적인 쿼리 발생

# select_related() 사용 → INNER JOIN을 통해 한 번의 쿼리로 가져옴
books = Book.objects.select_related('author').all()
for book in books:
    print(book.author.name)
  • prefetch_related() (ManyToMany 관계 최적화, 역참조)
    • LEFT JOIN을 하지 않고 여러 개의 쿼리를 실행한 후, Django가 메모리에서 조합
    • ManyToManyField, 역참조(ForeignKey 반대 방향) 에서 주로 사용
# 기본 쿼리 (N+1 문제 발생)
courses = Course.objects.all()
for course in courses:
    print(course.students.all())  # 각 course마다 students를 가져오기 위해 추가적인 쿼리 발생

# prefetch_related() 사용 → Django가 두 개의 쿼리를 실행한 후 ORM에서 매칭
courses = Course.objects.prefetch_related('students').all()
for course in courses:
    print(course.students.all())  # Django가 메모리에서 데이터를 미리 로드하여 추가적인 쿼리 없이 가져옴

1. Django 프로젝트 세팅

1.1 가상환경 구축하는 방법 (with Poetry)

📌 Poetry 설치 (설치되지 않은 경우)

curl -sSL https://install.python-poetry.org | python3 -

📌 프로젝트 디렉토리 생성 및 이동

mkdir my_django_project && cd my_django_project

📌 Poetry 환경 설정 및 Django 설치

poetry init  # 프로젝트 초기화
poetry add django  # Django 설치

📌 가상환경 활성화

python3 -m venv 가상환경명
source 가상환경명/bin/activate

1.2 Django 설치 및 프로젝트 구성, 앱 세팅하는 방법

📌 Django 프로젝트 생성

django-admin startproject config .

. (점) 을 붙이면 현재 디렉토리에 프로젝트가 생성됨

📌 Django 앱 생성

python manage.py startapp 앱명

📌 앱을 INSTALLED_APPS에 추가 (settings.py)

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapp',  # 추가된 앱
]

1.3 templates 경로 지정하기

📌 settings.py에서 TEMPLATES 설정

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates'],  # templates 폴더 지정
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

프로젝트 루트에 templates/ 폴더를 생성하고, 템플릿 파일을 해당 폴더에 저장


1.4 static 경로 지정하기

📌 settings.py에서 STATICFILES_DIRS 설정

STATIC_URL = '/static/'
STATICFILES_DIRS = [BASE_DIR / 'static']

프로젝트 루트에 static/ 폴더를 생성하고, 정적 파일을 해당 폴더에 저장


1.5 media 경로 지정하기

📌 settings.py에서 MEDIA_URLMEDIA_ROOT 설정

MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'

프로젝트 루트에 media/ 폴더를 생성하고, 업로드 파일을 저장


2. Database Model

2.1 데이터베이스 모델 정의하기

📌 models.py에서 모델 정의

from django.db import models

class User(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField(unique=True)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name

2.2 각 필드별 특징 정리하기

  • 텍스트

    • CharField : 짧은글 / 길이제한 O
    • TextField : 긴글 / 길이제한 X
    • UrlField : URL 저장 / 사실상 CharField
    • SlugField : Slug저장 / 사실상 CharField / 잘안씀
    • UUIDField : UUID 저장 / 잘안씀
  • 파일

    • EmailField : 이메일 저장
    • FileField : 파일 저장
    • ImageField : 이미지 저장
  • 숫자

    • IntegerField : 숫자 필드
    • PositiveIntegerField : 양수
    • BigIntegerField : 큰 숫자 필드
    • PositiveBigIntegerField : 양수만 가능한 큰 숫자 필드
    • DecimalField : Decimal 저장 / 고정 소수점 => 정확하지만 상대적으로 작은 수
    • FloatField : Float 저장 / 부동소수점 => 조금 부정확하지만 큰 수를 표현
  • 날짜, 시간

    • DateTimeField : 날짜 및 시간
    • DateField : 날짜만 저장
    • TimeField : 시간만 저장
  • 연결

    • ForeignKey : 1:N 관계 / 내가 N
    • ManyToManyField : N:N 관계
    • OneToOneField : 1:1 관계
  • 기타

    • JSONField : 리스트나 딕셔너리 형태로 받을 수 있음, 컬럼으로 받긴 애매하고 데이터를 받아야 할떄 사용
class Payment(mdoels.Mdoel):
    payment_response = models.JSONField(default = {},[])
  • django fields 검색해서 보면 찾아서 사용

2.3 Migration에 대해서 정리하기

📌 마이그레이션 파일 생성

python manage.py makemigrations

📌 마이그레이션 적용

python manage.py migrate

📌 마이그레이션 취소 및 수정

python manage.py showmigrations : 현재 migrations 항목 도출
post
 [X] 0001_initial
 [X] 0002_alter_postimage_post_comment_tag
sessions
 [X] 0001_initial

python manage.py migrate post 0001 : 2번을 취소하고 싶을때 입력시 X가 취소되는것을 showmigrations를 통해 확인 가능
post
 [X] 0001_initial
 [ ] 0002_alter_postimage_post_comment_tag
  • migrations 폴더에서 잘못된 파일 삭제 후 showmigrations 하면 0002 자체가 사라져 있는 것을 확인.
  • 그 후 python manage.py makemigrations 를 통해 다시 마이그레이션

3. Jinja

3.1 Jinja 문법 정리하기

  • {{ 변수 }}: 변수를 출력
  • {% if 조건 %} ... {% endif %}: 조건문
  • {% for item in 리스트 %} ... {% endfor %}: 반복문

3.2 block 사용법

{% block content %}
    <h1>메인 콘텐츠</h1>
{% endblock %}

3.3 extends 사용법

{% extends 'base.html' %}

{% block content %}
    <p>이 페이지는 base.html을 상속받습니다.</p>
{% endblock %}

3.4 load 사용법

{% load static %}
{% load custom_tag %}
<!-- custom_tag에서 설정해 놓은 함수 가져오기 -->
{% add_like_class request.user post.likes.all %}

4. FBV(Function Based View)

4.1 FBV란?

  • Django의 View를 함수형으로 작성하는 방식
  • 간단한 View 처리에 적합

4.2 간단한 View 메소드 작성법

📌 render 사용

from django.shortcuts import render

def home(request):
    return render(request, 'home.html')

📌 redirect 사용

from django.shortcuts import redirect

def go_to_home(request):
    return redirect('home')

5. Urls

5.1 URL 엔드포인트란?

  • 사용자가 특정 URL을 요청하면, Django가 해당 URL에 맞는 View를 실행

5.2 urlpatterns

from django.urls import path
from . import views

urlpatterns = [
    path('', views.home, name='home'),
]

5.3 URL Include 개념 및 방법

📌 URL Include란?

  • Django에서는 URL 구성을 모듈화하여 앱 단위로 분리할 수 있음.
  • include() 함수를 사용하면 앱 내부의 URL을 프로젝트의 메인 URL과 연결할 수 있음.
  • 이를 통해 프로젝트의 유지보수성을 높이고, URL 패턴을 더 체계적으로 관리할 수 있음.

📌 사용 예시

프로젝트의 urls.py (최상위 URL 설정)

from django.urls import path, include

urlpatterns = [
    path('myapp/', include('myapp.urls')),  # myapp의 URL을 포함
]

앱 내부의 myapp/urls.py (개별 앱의 URL 설정)

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),  # 'myapp/'로 들어오면 index 뷰 실행
    path('detail/', views.detail, name='detail'),  # 'myapp/detail/'로 들어오면 detail 뷰 실행
]

📌 URL 연결 흐름

  1. 사용자가 http://localhost:8000/myapp/ 요청 → config/urls.py에서 myapp.urls로 연결
  2. myapp/urls.py에서 빈 경로 ''views.index에 매칭되어 해당 뷰 실행
  3. 만약 http://localhost:8000/myapp/detail/ 요청 시, views.detail이 실행됨

include()를 사용하면 myapp/urls.py 내부에서 URL을 자유롭게 관리할 수 있으므로, 프로젝트 구조를 깔끔하게 유지할 수 있음.


5.4 path와 include의 차이

  • path(): 개별 URL 패턴을 정의할 때 사용
  • include(): 앱별로 URL을 분리하여 관리할 때 사용

6. Django Form

Django의 forms.Form 또는 forms.ModelForm을 사용하여 웹 애플리케이션의 입력 양식을 쉽게 관리할 수 있습니다.

📌 Form 생성하는 법

Django의 forms.Form을 사용하여 입력 폼을 정의할 수 있습니다.

from django import forms

class SampleForm(forms.Form):
    name = forms.CharField(label="이름", max_length=100)
    age = forms.IntegerField(label="나이")

📌 widgets

Django에서는 다양한 위젯을 제공하여 폼 필드의 입력 방식을 커스텀할 수 있습니다.

class CustomForm(forms.Form):
    email = forms.EmailField(widget=forms.EmailInput(attrs={'class': 'form-control'}))
    password = forms.CharField(widget=forms.PasswordInput(attrs={'placeholder': '비밀번호 입력'}))

📌 UserCreationForm (회원가입 폼)

Django의 UserCreationForm을 상속하여 사용자 생성 폼을 만들 수 있습니다.

from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User

class CustomUserCreationForm(UserCreationForm):
    class Meta:
        model = User
        fields = ("username", "email", "password1", "password2")

📌 AuthenticationForm (로그인 폼)

Django 기본 제공 로그인 폼을 사용할 수 있습니다.

from django.contrib.auth.forms import AuthenticationForm

class CustomAuthenticationForm(AuthenticationForm):
    pass

📌 is_valid()

폼 데이터를 검증할 때 사용되며, 유효하지 않으면 form.errors를 통해 오류를 확인할 수 있습니다.

form = SampleForm(request.POST)
if form.is_valid():
    print(form.cleaned_data)
else:
    print(form.errors)

7. Django ORM

Django의 ORM(Object Relational Mapping)은 데이터베이스 조작을 Python 코드로 수행할 수 있도록 해줍니다.

📌 ORM 이란?

SQL 없이 Python 코드로 데이터베이스를 조작하는 기술을 의미합니다.

📌 Django ORM 의 특징

  • 데이터베이스 테이블을 Python 클래스로 매핑
  • SQL 없이 Python 코드로 데이터 조작 가능
  • 데이터베이스를 추상화하여 여러 DB 엔진과 호환 가능

📌 기본적인 사용방법

✅ 데이터 조회 (objects.all())

from myapp.models import User

users = User.objects.all()

✅ 조건 조회 (filter())

users = User.objects.filter(age__gte=18)  # 18세 이상 사용자 조회

✅ 특정 객체 조회 (get())

user = User.objects.get(username="admin")

✅ 정렬 (order_by())

users = User.objects.order_by('-created_at')  # 최신순 정렬

✅ 데이터 생성 (create())

User.objects.create(username="new_user", email="user@example.com")

✅ 데이터 삭제 (delete())

user = User.objects.get(username="delete_me")
user.delete()

✅ 데이터 업데이트 (update())

User.objects.filter(username="update_me").update(email="new@example.com")

get_object_or_404() 사용

from django.shortcuts import get_object_or_404
user = get_object_or_404(User, username="admin")

8. Django Auth

Django에서 제공하는 인증 및 권한 관리 시스템을 이해하고 활용할 수 있습니다.

📌 Django UserModel

Django 기본 User 모델을 확장하거나 직접 정의할 수 있습니다.

✅ accounts (기본 User 모델)

Django의 User 모델은 django.contrib.auth.models에서 제공됩니다.

from django.contrib.auth.models import User

# 모든 사용자 조회
users = User.objects.all()

✅ Custom UserModel (사용자 모델 커스텀)

Django에서는 AbstractUser 또는 AbstractBaseUser를 확장하여 커스텀 사용자 모델을 만들 수 있습니다.

from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    nickname = models.CharField(max_length=50, unique=True)

✅ AbstractUser vs AbstractBaseUser

  • AbstractUser: Django의 기본 User 모델을 확장하여 쉽게 사용자 모델을 커스텀할 수 있음
  • AbstractBaseUser: 사용자 모델을 처음부터 직접 정의할 때 사용

✅ PermissionMixin

사용자 권한을 확장할 때 사용되며, 그룹 및 개별 사용자 권한을 추가할 수 있습니다.

✅ BaseUserManager & UserManager

사용자 생성 로직을 커스텀할 때 BaseUserManager를 활용할 수 있습니다.

from django.contrib.auth.models import BaseUserManager

class CustomUserManager(BaseUserManager):
    def create_user(self, email, password=None, **extra_fields):
        if not email:
            raise ValueError("The Email field must be set")
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

📌 authenticate() (사용자 인증)

사용자가 입력한 아이디와 비밀번호가 올바른지 확인하는 함수

from django.contrib.auth import authenticate

user = authenticate(username="admin", password="password")
if user is not None:
    print("인증 성공")
else:
    print("인증 실패")

📌 login() (사용자 로그인)

사용자를 로그인 상태로 만듭니다.

from django.contrib.auth import login

def user_login(request):
    user = authenticate(username="admin", password="password")
    if user is not None:
        login(request, user)
        return HttpResponse("로그인 성공")
    return HttpResponse("로그인 실패")

📌 logout() (사용자 로그아웃)

현재 로그인된 사용자를 로그아웃 처리합니다.

from django.contrib.auth import logout

def user_logout(request):
    logout(request)
    return HttpResponse("로그아웃 성공")

📌 @login_required (로그인 필요)

로그인이 필요한 뷰에 데코레이터를 추가할 수 있습니다.

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
    return HttpResponse("로그인한 사용자만 접근 가능")

9. CBV (Class-Based View)

Django의 클래스 기반 뷰(Class-Based View, CBV)를 이해하고 활용할 수 있습니다.

📌 CBV 란?

클래스를 기반으로 한 Django 뷰 시스템으로, 코드 재사용성이 높아지고 유지보수가 편리합니다.

📌 View 기본 구조

Django의 View 클래스를 상속받아 GET/POST 요청을 처리할 수 있습니다.

from django.http import HttpResponse
from django.views import View

class MyView(View):
    def get(self, request):
        return HttpResponse("Hello, world!")

📌 Generic Views (Django에서 제공하는 CBV)

Django는 CRUD(Create, Read, Update, Delete) 작업을 쉽게 수행할 수 있도록 제네릭 뷰(Generic Views)를 제공합니다.

CreateView (객체 생성)

새로운 객체를 생성하는 뷰

from django.views.generic import CreateView
from myapp.models import Post
from django.urls import reverse_lazy

class PostCreateView(CreateView):
    model = Post
    fields = ["title", "content"]
    success_url = reverse_lazy("post_list")  # 성공 후 이동할 URL

*📍 기본적으로 제공하는 메서드**

  • form_valid(form): 폼이 유효할 때 호출 (객체를 저장한 후 리디렉트)
  • form_invalid(form): 폼이 유효하지 않을 때 호출
  • get_form_class(): 사용할 폼 클래스를 반환
  • get_form_kwargs(): 폼에 전달할 인자를 정의
  • get_success_url(): 성공 후 리디렉트할 URL을 반환

*📍 기본적으로 제공하는 컨텍스트 데이터**

  • form: 생성할 객체의 폼(form)
  • object: 생성된 객체

ListView (객체 목록 조회)

객체 리스트를 보여주는 뷰

from django.views.generic import ListView

class PostListView(ListView):
    model = Post
    template_name = "post_list.html"

*📍 기본적으로 제공하는 메서드**

  • get_queryset(): 기본적으로 model.objects.all() 반환 (조회할 데이터셋을 설정 가능)
  • get_context_data(**kwargs): 템플릿에서 사용할 컨텍스트 데이터를 추가할 때 사용

*📍 기본적으로 제공하는 컨텍스트 데이터**

  • object_list: 모델의 모든 객체 리스트 (예: Post.objects.all())
  • is_paginated: 페이지네이션이 적용되었는지 여부 (True 또는 False)
  • paginator: 페이지네이션 객체

DetailView (객체 상세 조회)

단일 객체의 상세 정보를 보여주는 뷰

from django.views.generic import DetailView

class PostDetailView(DetailView):
    model = Post

*📍 기본적으로 제공하는 메서드**

  • get_object(): 기본적으로 model.objects.get(pk=값)을 실행하여 객체를 가져옴
  • get_context_data(**kwargs): 템플릿에서 사용할 컨텍스트 데이터를 추가할 때 사용

*📍 기본적으로 제공하는 컨텍스트 데이터**

  • object: 조회된 단일 객체 (예: Post.objects.get(pk=값))

📍 기본적으로 제공하는 메서드

  • get_object(): 기본적으로 model.objects.get(pk=값)을 실행하여 객체를 가져옴
  • get_context_data(**kwargs): 템플릿에서 사용할 컨텍스트 데이터를 추가할 때 사용

📍 기본적으로 제공하는 컨텍스트 데이터

  • object: 조회된 단일 객체 (예: Post.objects.get(pk=값))

📌 Request 객체 다루기

user 가져오기 (현재 로그인한 사용자)

current_user = request.user
print(current_user.username)

data 가져오기 (POST 요청 데이터)

username = request.POST.get("username")

✅ URL 파라미터 (Path Parameter)

def my_view(request, user_id):
    print(user_id)  # URL에서 user_id 값 가져오기

✅ 쿼리 파라미터 (Query Parameter)

search_query = request.GET.get("q")  # ?q=검색어

📌 Response 객체

HttpResponseRedirect (리다이렉트)

from django.http import HttpResponseRedirect

return HttpResponseRedirect("/home/")

HttpResponse (간단한 응답)

from django.http import HttpResponse

return HttpResponse("Hello, world!")

status code (HTTP 응답 코드 설정)

return HttpResponse("Forbidden", status=403)

10. Django Mail

Django에서 이메일을 보내는 방법

📌 send_mail

from django.core.mail import send_mail

send_mail(
    "Subject",
    "Message",
    "from@example.com",
    ["to@example.com"],
    fail_silently=False,
)

📌 django.core.signing

Django의 django.core.signing 모듈은 데이터를 서명하고 검증하는 기능을 제공합니다.
이 모듈을 사용하면 데이터를 변조되지 않도록 보호할 수 있습니다.

django.core.signing 사용법

1. 서명(Sign) 생성하기

from django.core import signing

data = "secure_data"
signed_data = signing.sign(data)

print(signed_data)  # 서명된 데이터 출력

2. 서명 검증 및 원본 데이터 복구

original_data = signing.unsign(signed_data)
print(original_data)  # 'secure_data' 출력

📌 TimestampSigner

시간 제한 서명 생성

from django.core.signing import TimestampSigner

signer = TimestampSigner()
value = signer.sign("my_value")

original = signer.unsign(value, max_age=3600)  # 1시간 유효

11. ImageField

Django의 ImageField는 이미지 파일을 저장하고 관리할 수 있도록 해주는 모델 필드입니다.

📌 ImageField 특징과 사용법

  • ImageField는 Django 모델에서 이미지 파일을 저장하는 데 사용됩니다.
  • Pillow 라이브러리가 필요합니다.
from django.db import models

class Profile(models.Model):
    avatar = models.ImageField(upload_to='avatars/')

📌 Pillow란?

  • Python에서 이미지를 다루기 위한 라이브러리
  • Django에서 ImageField를 사용할 때 필요
pip install pillow

📌 django-cleanup이란?

  • Django 모델에서 파일 필드를 삭제하면 실제 파일도 자동으로 삭제해주는 라이브러리
pip install django-cleanup

📌 MEDIA_ROOTMEDIA_URL

  • MEDIA_ROOT: 업로드된 파일이 저장되는 디렉터리
  • MEDIA_URL: 업로드된 파일에 접근할 수 있는 URL
import os
from django.conf import settings

MEDIA_ROOT = os.path.join(settings.BASE_DIR, 'media')
MEDIA_URL = '/media/'

12. Django-summernote

📌 Django-summernote 란?

  • WYSIWYG(What You See Is What You Get) 에디터로, HTML 에디터 기능을 제공하는 Django 패키지

📌 특징

  • 텍스트 입력을 리치 텍스트(HTML)로 변환 가능
  • 이미지 및 파일 업로드 지원

📌 django-summernote 설치 및 설정

pip install django-summernote
INSTALLED_APPS = [
    'django_summernote',
]

# urls.py
from django.urls import path, include

urlpatterns = [
    path('summernote/', include('django_summernote.urls')),
]

📌 사용법

from django.db import models
from django_summernote.fields import SummernoteTextField

class Post(models.Model):
    content = SummernoteTextField()

13. Django-extensions

📌 django-extensions 란?

  • Django 개발을 도와주는 다양한 기능을 제공하는 라이브러리

📌 주요 기능

  • Python shell (shell_plus)
  • 모델 필드 자동 다이어그램 생성 (graph_models)

📌 설치 및 설정

pip install django-extensions
INSTALLED_APPS = [
    'django_extensions',
]

📌 shell_plus 사용법

python manage.py shell_plus

14. OAuth2

📌 OAuth2 정리

  • OAuth2는 타사 서비스에서 인증을 수행할 수 있도록 해주는 프로토콜입니다.
  • Access Token을 사용하여 인증을 수행

📌 Naver Social Login

✅ 네이버 로그인 절차 분석

아래 절차에 따라 네이버 소셜 로그인을 구현합니다.

  1. 사용자가 네이버 로그인 버튼 클릭
  2. 네이버 OAuth 서버에서 client_idredirect_uri를 확인
  3. 사용자가 네이버 로그인 후 인증 코드 발급
  4. Django 서버에서 네이버에 access_token 요청
  5. access_token으로 사용자 정보 조회

✅ 네이버 로그인 환경변수 설정하기

NAVER_CLIENT_ID = "네이버 클라이언트 ID"
NAVER_CLIENT_SECRET = "네이버 클라이언트 시크릿"
NAVER_CALLBACK_URL = "http://localhost:8000/oauth/naver/callback/"

✅ 네이버 로그인 기능 개발하기

import requests
from django.conf import settings

def get_naver_access_token(code, state):
    params = {
        'grant_type': 'authorization_code',
        'client_id': settings.NAVER_CLIENT_ID,
        'client_secret': settings.NAVER_CLIENT_SECRET,
        'code': code,
        'state': state,
    }
    response = requests.get("https://nid.naver.com/oauth2.0/token", params=params)
    return response.json().get('access_token')

✅ 네이버 프로필 정보 가져오기

def get_naver_profile(access_token):
    headers = {
        'Authorization': f'Bearer {access_token}'
    }
    response = requests.get("https://openapi.naver.com/v1/nid/me", headers=headers)
    return response.json().get('response')

ETC

User모델을 커스터 마이징 했을 경우

from django.contrib.auth.models import User  # ❌ 이렇게 직접 가져오면 안 됨

object_list = User.objects.filter(nickname__icontains=q)

이렇게 가져오면 커스타미이징한 User를 가져오지 않는다

from django.contrib.auth import get_user_model

User = get_user_model()
object_list = User.objects.filter(nickname__icontains=q)  # ✅ nickname 필드가 존재하는 커스텀 User 모델을 자동으로 가져옴

장고 파일 폴더로 변경해서 파일 관리하기

-> 우클릭 refactor -> Convert to Python Package -> __init__ 이름 변경 및 , __init__생성 -> __init__ 파일에 from .파일명 import * 작성

0개의 댓글

관련 채용 정보