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 내부의 메..

django graphene_jwt 상속을 통한 로그인 로깅

개요 최근 진행했던 회사 프로젝트 중에 Django와 GraphQL을 사용한 프로젝트가 있었다. 사용자의 이용 기록을 저장해야 할 필요가 있던 프로젝트라 사용자가 로그인하는 것을 포함해서 행위를 기록하는 기능을 추가해야했다. 근데 누군가 만들어 둔 패키지에는 로깅 기능을 별도로 추가할 수 있는 기능은 없었고 이것을 어떻게 해결했는지 기록하는 글이다. 본문 Django에서 GraphQL을 구현한 패키지인 django-graphene을 사용했고 로그인하는 것을 django-graphene-jwt 를 통해 구현했다. JWT 토큰을 생성하는 뮤테이션은 django-graphene-jwt를 통해 아래와 같이 등록한다. JWT 인증 패키지의 미들웨어가 있었으면 좋겠다고 생각했는데 아무리 찾아봐도 그런 기능이 없는 ..

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..

React Semantic UI vs. Chakra UI

Semantic UI 장점 사용이 매우 간편하다. 공식 홈페이지에 컴포넌트 별로 props도 정리가 잘 되어있고 사용법도 상세하게 잘 나와있음. 디자인. 사용하기 직관적이고 일관적이었음. 미리 구현된 것이 많아서 빠르고 편하게 사용할 수 있다는 장점이 있음. 단점 계속 사용하게 되면 Bootstrap처럼 개성없는 디자인으로 변질될 가능성이 있어 보인다. (다행히 아직 React의 시장 점유율이 낮아서 망정이지) 살짝 밋밋한 느낌? Bootstrap 보다는 낫지만 그래도 어딘가 부족해보인다. Chakra UI 장점 디자인이 정말 깔끔하고 모던하게 예쁘다. 어떤 단점이 있어도 디자인이 깔끔하고 모던하다는게 단점을 압도할 수 있을 것 같음. 단점 구현된게 별로 없어서 내가 컴포넌트를 만들어가면서 해야한다는게...

How to show image, not download in nodejs express

const attachment = await AttachmentAPI.get_file_by_id(attachment_id); /* ... */ const filename = attachment.filename; const extension = filename.split('.').pop().toLowerCase(); /* ... */ res.contentType(`image/${extension}`); /* ... */ try { const content = await fs.readFileSync(attachment.path); res.end(content); } catch (error) { // Error Handling } Use res.end(), not res.send() OK?

How to connect to MySQL running in Docker

고등학교 때만 해도 'Docker는 어렵다!'라는 생각이 머릿 속에 박혀있던 탓에, Dockerizing을 하지 않았다. 그게 심지어 해킹대회 문제였을지라도 Linux의 기본 RWX 권한을 사용해 시스템을 구축했었다. docker-compose 라는 도구를 알게 되고, 회사에서도 반복적으로 Dockerizing을 한 결과 Docker를 능수능란하게 다룰 수 있게 되었다. Docker 안에 데이터베이스 서버를 넣고 해당 서버에 접속하기 위한 2가지 방법이 있는데 오늘은 그것을 까먹지 않기 위해 적어보려고 한다. 방법 1. mysql -h localhost -P 3306 --protocol=tcp -u root -p mysql-client에 --protocol 옵션을 사용해서 접속하는 방법. 방법 2. su..

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..