본문 바로가기

Back-end & Server/Django

[Django] 고급 기능들

728x90
반응형

디버그 모드의 특수 케이스 URL

URL 패턴을 동적으로 생성하는 방법, DEBUG 설정이 True로 되어 있어야함

# views.py
from django.http import HttpResponse as HR

def debug(request):
    return HR('<h1>추가된 페이지</h1>')
    
# urls.py
from django.urls import re_path
from django.conf import settings

if settings.DEBUG:
    urlpatterns +=[re_path(r'^debuginfo/$',debug)]

 

원시 쿼리 실행

모델 객체.objects.raw(raw_query, params=None, translations=None)으로 원시 쿼리를 수행할 수 있음

Publisher.objects.raw('SELECT * FROM books_publisher')
# Publisher.objects.all() 실행 결과와 같음

이 코드는 django.db.models.query.RawQuerySet 인스턴스를 반환함, for 반복문 등을 통해 레코드를 추출할 수 있음

 

사용자 정의 SQL 직접 실행

raw만으로 충분하지 않고 모델에 완전히 매핑되지 않은 쿼리 수행, UPDATE, INSERT, DELETE 등을 직접해야 할 때도 있음

이러한 경우 Django는 django.db.connection모델 계층을 전체적으로 라우팅해 데이터베이스에 직접 액세스 할 수 있음

  • 연결
from django.db import connection

cur = connection.cursor()
  • 쿼리 수행
# execute(sql, [params])

cur.execute("UPDATE books_publisher SET name='Pupbani2' WHERE name = 'Pupbani1'")
# 파라미터 전달
cur.execute("SELECT * FROM books_publisher WHERE city = %s",['Dongtan'])
  • 결과 반환
rows = cur.fetchall()
for row in rows:
   print(row[0],row[1],row[2],row[3],row[4],row[5],row[6])
  • 커밋
connection.commit()
  • 롤백
connection.rollback()
  • 연결 종료
connection.close()

 

사용자 인증

Django는 세션과 미들웨어를 사용해 인증 시스템을 요청 객체에 연결함

현재 사용자를 표현하는 모든 요청에 대해 request.user 속성을 제공

  • 사용자가 로그인하지 않은 경우 - AnonymousUser 인스턴스로 설정
  • 사용자가 로그인 한경우 - User 인스턴스 설정

 

다음과 같은 코드로 인증된 사용자에 대한 작업을 실행할 수 있음

  • 이 코드를 사용해 로그인한 사용자와 아닌 사용자가 사용하는 뷰를 다르게 표시할 수 있음
if request.user.is_authenticated():
    # 인증된 사용자일 경우
else :
    # 익명 사용자일 경우

 

Django 뷰에서 사용자 로그인을 하는 방법은 다음과 같은 방법을 권장함

  • login()은 Django의 세션 프레임워크를 활용함
from Django.contrib.auth import authenticate, login

def login_view(request):
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(username=username, password=password)
    if user is not None:
        if user.is_active:
            login(request,user)
            # 성공 웹 페이지로 이동
        else :
            # '사용 중지된 계정' 오류 메시지 반환
    else :
        # '잘못된 로그인' 오류 메시지 반환

로그아웃은 다음과 같음

from Django.contrib.auth import logout

def logout(request):
    logout(request)
    # 성공 페이지로 리디렉션

사용자를 추가하는 방법은 다음과 같음

from Django.contrib.auth.models import User
user = User.objects.create_user('name','email','password')
# 이 시점에서 user는 이미 데이터베이스에 저장된 User 객체
user.save()
728x90
반응형

'Back-end & Server > Django' 카테고리의 다른 글

[Django] 배포  (0) 2023.01.31
[Django] 테스팅  (0) 2023.01.22
[Django] 폼(Form)  (0) 2023.01.20
[Django] Admin 사이트  (0) 2023.01.16
[Django] 모델  (0) 2023.01.16