humblem2 / backend-pre-task Goto Github PK
View Code? Open in Web Editor NEWThis project forked from kidsnote/backend-pre-task
구글 주소록 RESTful API
This project forked from kidsnote/backend-pre-task
구글 주소록 RESTful API
불필요한 코드정리
gitignore 내용 확인
**주의**
: .env
패밀리 push 금지 (팀내 매뉴얼 문서로 리다이렉션하는 업무흐름)페이징 위한 파일에 각 컨트롤러가 사용하는 페이지네이션 클래스 만들기
페이지네이션 클래스 mixin 고려해서 추상화 할지 말지 코드 적으면 모아두기 -> 체크 후 결정
주소록API
목표: API 에 대해 커버리지 80% 이상
coverage report 활용하여 점진적으로 강화
이후
입니다.)/api/labels/{label_id}/contacts/
경로를 통한 API 요청에서 label_id
경로변수가 제대로 Look-up 처리되지 않음현재 LabelContactsViewSet
의 get_queryset
메서드에서 label_id
값을 추출하는 로직이
따라서 URL Path Varible로 전달된
label_id
가 쿼리에 반영되지 않고 있음
router.register(r'labels/(?P<label_id>\d+)/contacts', LabelContactsViewSet, basename='label-contacts')
class LabelContactsViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
"""`특정 라벨`에 대응되는 `연락처 리스트`"""
queryset = m.Contact.objects.all()
serializer_class = cs.ContactListSerializer
pagination_class = pn.DefaultContactPagination
authentication_classes = [JWTAuthentication]
permission_classes = [IsAuthenticated, pm.IsOwnerOfContact]
def get_queryset(self):
"""@overide URL에서 `label` 쿼리 파라미터를 기반으로 특정 라벨에 해당하는 연락처리스트를 반환"""
if not self.request.user.is_authenticated:
return m.Contact.objects.none()
queryset = m.Contact.objects.filter(user=self.request.user)
label_id = self.request.query_params.get('label_id', None) // ✅ 여기가 문제
if label_id:
contact_ids = m.ContactLabel.objects.filter(label=label_id).values_list('contact', flat=True)
queryset = queryset.filter(id__in=contact_ids)
return queryset
self.kwargs
를 사용하여 Path Varible 인 label_id
값을 URL에서 올바르게 추출하도록 코드를 수정하는 것이 필요400/Bad Request
혹은 404
응답되도록 로직 개선단위 테스트
를 추가 필요하고 함께 커밋====================================
master -> hotfix-1.0.0 -> master
hotfix-1.0.0 -> develop
release/tag v1.0.1
=====================================
쿼리스트링인 경우
self.request.query_params
label_id = self.request.query_params.get('label_id', None)
Path variable 인 경우
label_id = self.kwargs['label_id']
label_id = self.kwargs.get('label_id', None)
Connection to Python debugger failed. Socket closed
토스트박스PYDEVD_USE_CYTHON=NO
추가PYTHONUNBUFFERED=1;DJANGO_SETTINGS_MODULE=conf.settings.development;PYDEVD_USE_CYTHON=NO
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys
from typing import Dict
import pymysql
from decouple import Config, config, RepositoryEnv
from termcolor import colored
from conf.settings.base import BASE_DIR
def load_environment() -> Dict[str, str]:
"""환경변수 파일(`.env`)을 기반으로 배포환경을 고려한 Django 설정 모듈을 로드합니다."""
# 배포환경에 따라 환경변수 파일 선택
environment = config('ENVIRONMENT', default='development')
env_file = f'.env.{environment}'
selected_env_file = str(BASE_DIR / env_file)
# 선택한 환경변수 파일로부터 설정 로드
custom_config = Config(RepositoryEnv(selected_env_file))
django_settings_module = custom_config('DJANGO_SETTINGS_MODULE', default='conf.settings.development')
return {
'environment': environment,
'selected_env_file': selected_env_file,
'django_settings_module': django_settings_module
}
def pretty_print_colored(**kwargs):
"""중요 정보 색상화하여 출력"""
box_width = 70
print(colored("┌" + "─"*(box_width-2) + "┐", 'yellow'))
for key, value in kwargs.items():
formatted_key = key.replace("_", " ").capitalize() # 'selected_env_file' -> 'Selected env file'
key_width = len(formatted_key) + 2
print(colored(f"│ {formatted_key}: {value:<{box_width - key_width - 2}}│", 'green'))
print(colored("└" + "─"*(box_width-2) + "┘", 'yellow'))
def install_pymysql_as_mysqldb():
"""PyMySQL을 MySQLdb처럼 사용하기 위한 설정"""
pymysql.install_as_MySQLdb()
def main():
"""Run administrative tasks."""
install_pymysql_as_mysqldb()
environment_data = load_environment()
django_settings_module = environment_data['django_settings_module']
pretty_print_colored(**environment_data)
os.environ.setdefault('DJANGO_SETTINGS_MODULE', django_settings_module)
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
if __name__ == '__main__':
main()
ENVIRONMENT=development
DJANGO_SETTINGS_MODULE=conf.settings.development
RDBMS_NAME=addressbookdb
RDBMS_USER=root
RDBMS_PASSWORD=root
RDBMS_HOST=localhost
RDBMS_PORT=3306
TEST_RDBMS_NAME=test_addressbookdb
DJANGO_USE_PYMYSQL_AS_MYSQLDB=True
django-mysql
버전: 4.11.0
mysqlclient
버전: 2.2.0
PyMySQL 패키지를 사용하여 mysqlclient 대신 연동. 추후 특정 이슈로 인해 방법변경이 필요하다고 판단이 될 경우, mysqlclient를 적용하여 다시 검토할 예정 (우선순위: 낮음
).
변경 사항
requirements.in
PyMySQL==1.1.0
manage.py
def install_pymysql_as_mysqldb():
"""PyMySQL을 MySQLdb처럼 사용하기 위한 설정"""
import pymysql
pymysql.install_as_MySQLdb()
PyMySQL.install_as_MySQLdb()
를 호출하면 Django가 PyMySQL을 MySQLdb로 인식한다.settings.py
의 DATABASES 설정을 MySQLdb 스타일로 할 수 있다.스웨거는 옵션이나 기본(API개발)에 충실 하되 redoc 와 함께 사용가능하도록 확장성 있게
개발 중 테스트시에 있어도 편하긴 함 API 만들때 개발하거나 마지막에 하거나
DDL 및 DML SQL
기타 개발 시 사용하는 유틸성 SQL
db/~
보관
data.sql
schema.sql
serializer 관련 Mixin 추가하기
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.