How does Django execute SQL Query? (Korean version)

How does Django execute SQL Query? Django에서는 내부적으로 ORM 기능을 구현해두어 데이터베이스 연동 번거로움을 최소화해두었다. 또한, Django에서 지원해주는 ORM 기능 덕분에 Django에서는 보통 SQL Injection 취약점이 발생하지 않는다고 봐도 무방하다. Django에서 발생하는 SQL Injection 취약점을 분석하기 위해서는 Django가 내부적으로 어떻게 SQL 쿼리를 실행하는지 이해할 필요가 있다. 1. QuerySet 내부 매직메소드에 의한 private 메소드 실행 Django는 내부적으로 Lazy Loading 기능을 구현해두었다. Model.objects.all(), Model.objects.filter() 같이 QuerySet 내부의 메..

Search by function returns in Django Admin

장고를 사용하다 보면 search_fields 를 사용할 일이 생기는데, 이때 여러 fields 간의 결합된 것들 중 검색하고 싶을 때는 어떻게 해야하는지 단서를 제공할 수 있는 글이다. from django.contrib import admin from django.contrib.auth import get_user_model from django.contrib.auth.admin import UserAdmin User = get_user_model() class CustomUserAdmin(UserAdmin): search_fields = ['username'] # search by username def get_search_results(self, request, queryset, search_te..

Django How to delete superuser

Create Django Superuser $ python manage.py createsuperuser Delete Django Superuser (venv) $ python manage.py shell Python 3.7.6 (default, Jan 8 2020, 20:23:39) [MSC v.1916 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> from django.contrib.auth import get_user_model >>> >>> User = get_user_model() >>> User.objects.get(usern..

Django Parsing Json in Function based view

Django를 사용해서 RESTful API를 만들 일이 많아졌는데, 이 때 function based view에서 어떻게 하면 자동으로 JSON 형식의 데이터를 파싱하고 Swagger(drf-yasg)에 API화 할 수 있는지 포스팅하려고 한다. settings.py REST_FRAMEWORK = { 'DEFAULT_PARSER_CLASSES': [ 'rest_framework.parsers.JSONParser', ] } app/views.py from django.http import JsonResponse from rest_framework.parsers import JSONParser from rest_framework.decorators import api_view, parser_classes ..

Django Customizing Default User Model

장고를 사용하다보면 User Model에 새로운 정보를 추가해야 할 상황이 생긴다. 가장 쉽고 간편한 방법은 ProxyModel을 만드는 것이지만, 굳이 그렇게 하고 싶지 않은 상황이 올 수 밖에 없다. 최근 이러한 경우가 생겨서 관련 내용을 포스팅해보려고 한다. User/models.py # coding: utf-8 from django.db import models from django.contrib.auth.models import AbstractUser, UserManager as BaseUserManager from django.core.exceptions import ObjectDoesNotExist from django.db.utils import IntegrityError class Use..

Python3 requests에서 r.text와 r.content의 차이

1. 개요 Python3에서 불과 3~4년 전만 하더라도 urlib를 사용하여 HTTP 자원에 접근하는 코드가 많았지만, 이제는 거의다 requests 모듈을 사용하는 추세이다. 그만큼 requests 모듈의 편리성과 확장성이 Pythonic하다고 볼 수 있다. requests 모듈에서 HTTP Response에 접근하는 방법은 크게 두가지가 있다. 하나는 r.text이고 하나는 r.content이다. ※ 이 글에서 설명하는 내용은 다음과 같은 코드가 실행된 상태라고 가정한다. import requests url = 'https://www.example.com/' r = requests.get(url) 2. r.text r.text의 경우엔 HTTP Request를 보낸 URL에서 readable한 내용..

Django에서 Python Decorator 사용하기

데코레이터를 사용하면 여러줄의 코드를 여러번 작성할 필요없이 한줄만으로 특정한 메커니즘을 실행할 수 있다. from django.http import HttpResponse def only_admin(f): def check(request, *args, **kwargs): try: if request.user.admin is not True: return JsonResponse({ 'status': False, 'message': 'admin permission is required' }) except: return JsonResponse({ 'status': False, 'message': '\'sign in\' is required' }) return f(request, *args, **kwargs)..

백준 1018번 체스판 다시 칠하기 write-up

#!/usr/bin/env python3 # coding: utf-8 def set_plate(): n, m = map(int, input().split()) plate = [] for i in range(n): row = list(input()) plate.append(row) return n, m, plate def get_repaint(plate): result = [] row = [ ['W', 'B'] * 4, ['B', 'W'] * 4 ] for i in range(2): repaint = 0 for j in range(8): check = row[(i + j) % 2] for k in range(8): if plate[j][k] != check[k]: repaint += 1 result.app..

파이썬 가비지컬렉션

보통 C언어로 코딩할 때는 가비지컬렉션이 구현되어 있지 않아서 프로그래머가 직접 가비지컬렉션 기능을 사용하거나, 가비지컬렉션이 구현된 헤더파일을 include 하는 방식을 사용하는데 파이썬에서는 인터프리터단에서 자동으로 이 기능을 지원한다. 이 때 쓰이는 개념이 '레퍼런스 카운트'다. 레퍼런스 카운트란 말 그대로 '참조 수'인데, 다음과 같은 예시로 쉽게 이해할 수 있다. >>> var1 = [1,2,3] # Reference Count = 1 >>> var2 = var1 # Reference Count = 2 >>> var1 = 'python' # Reference Count = 1 >>> var2 = 1.0 # Reference Count = 0 주석으로 달아놓은 Reference Count는 [1,..