Python 114

[Utils] Custom Pre-commit hook 구현

Custom Pre-commit Hook 구현하기 👉 사용 사례 - API 문서 배포시 자동으로 error 코드가 적힌 html 문서가 같이 만들어 지도록 hook 에 추가 - hook은 (.py) 파일 구현 👉 구현 방법 - repo : local 값 - id와 name 설정 및 entry 로 .py 실행 - language : python 설정 # See https://pre-commit.com for more information # See https://pre-commit.com/hooks.html for more hooks repos: # make error code html - repo: local hooks: - id: make-error-enum-html name: make-error-en..

Python/Utils 2023.06.24

[Crawling] Beautiful Soup 와 Selenium 선택 기준

Selenium vs Beautiful Soup Selenium과 Beautiful Soup는 웹 스크래핑과 웹 자동화를 위해 사용되는 Python 라이브러리 둘 중에 크롤링을 위해 선택하는 기준은 목적성에 있으며, 때에 따라서는 혼합해서 사용도 가능하다. Selenium 웹 자동화를 위해 사용되는 도구 웹 브라우저를 자동으로 제어 (ex. 클릭 등)하고, 사용자의 동작을 시뮬레이션을 통해 웹 어플리케이션 테스트 및 정보 스크래핑에 사용된다. 웹 브라우저를 제어하기 때문에, JavaScript로 작성된 동적 웹 페이지를 다룰 수 있다. 웹 요소를 조작 하고 제어하기 위해 XPath 또는 CSS Selector(선택자)를 사용 가능하다. ex) 만약 페이지가 단순 html, css가 아닌 JavaScrip..

Python/Crawling 2023.06.10

[배포] Python ASGI 배포 서버 종류 비교

Python ASGI 배포 서버Python에서 웹 어플리케이션(Django, FastAPI, Flask 등)을 배포시 비동기 요청 처리를 위해, ASGI 서버를 사용하여 배포하게 되는데, Python 기반의 ASGI 서버들을 비교해보며, 종류와 특징에 대해 알아 본다. 주로 많이 언급되는 건 다음과 같다.Uvicorn (asyncio, uvloop)DaphneHypercornStarlette 사실 결론부터 말하자면, 사용하는 프레임워크나 기능에 따라 배포 서버에 대한 선택지가 한정적인 것으로 생각되는데 FastAPI로 배포를 희망→ 공식문서에서 지원하는 Uvicorn이나 Hypercorn 을 쓰는 것이 일반적 Django / Flask 에 Websocket 프로토콜 처리가 필요→ Daphne 이 적절  ..

Python/Deployment 2023.06.06

[Django Ninja] Path Variable & Query Parameter 사용 방법

1. Path Variable - 기본# Case 1. Path Variable@api.get("/problem/{problem_id}", response=ProblemOut)def get_problem(request, problem_id:int): return Problem.object.get(problem_id=problem_id) 2. Path Variable - 상위 Router상위 Router(or api)에 Path Variable이 붙어 있는 경우, Path() 를 사용하여 받는다.Path(...) 를 명시하지 않으면, Query Parameter로 인식된다.# Case 2. Path Variable - Routerfrom ninja import NinjaAPIapi = NinjaAPI..

Python/Django Ninja 2023.06.03

[Python] Circular Import에 따른 파일 구조 개선

이슈 배경 - 비즈니스 로직이 구현되어 있는 service layer의 service_xxx.py 들 간에 Circular import가 발생 구현 코드 기존에 정상적으로 동작하는 코드 ### service_a.py from service_b import Service_B class Service_A: def a1(): Service_B.b1() def a2(): pass ### service_b.py class Service_B: def b1(): pass 로직 추가 후 circular import 발생 ### service_a.py from service_b import Service_B class Service_A: def a1(): Service_B.b1() def a2(): pass ### se..

Python/Advanced 2023.05.29

[Python] Datetime 이해 - aware, naive, datetime, timezone 등

Datetime 패키지 이해하기 Python에서 기본적으로 제공하는 Datetime 패키지에 대해 이해해 본다. - Datetime 모듈은 date와 time에 대한 조작을 위해 사용된다. Datetime 모듈 예시 1. naive vs aware - 해당 패키지에서 사용되는 날짜/시간 객체는 timezone 포함 여부에 따라 naive와 aware로 구분된다. - naive : tzinfo 정보를 포함하지 않는 날짜, 시간 객체 - aware : tzinfo, DST(daylight saving time) 정보를 포함한 날짜, 시간 객체 - 활용 1) 들어오는 datetime 값 (aware인지 naive인지)에 대한 형태 정의 - 활용 2) tzinfo 체크 및 시간대 변경 - 활용 3) tzinfo..

Python/Utils 2023.05.29

[Python Utils] 코드 컨벤션 템플릿 셋팅 (pre-commit, black, pycharm)

협업 간 코드 스타일/컨벤션을 맞추기 위해 다음과 같은 간단한 Code Formatter를 설정하였다. 목표 기능 1. git에 코드 push시 자동으로 formatting 체크 및 변경 2. 평소 IDE에서 코드 작성 후 저장시 자동으로 formatting 변경 사용 Tool - pre-commit-hook (pip install pre-commit-hooks) - Black (pip install black) - Pycharm (IDE) 1. pre-commit-hook.yaml 파일 - black을 hook으로 등록 (추가적으로 .flake8, isort 등 등록 가능) # See https://pre-commit.com for more information # See https://pre-comm..

Python/Utils 2023.05.29

[Django Ninja] GIS 데이터 처리 관련 정리

Django Ninja & GIS 관련 설계 조사 정리 내용 Postgis : PostgreSQL DB의 gis 기능이 추가 된 확장 플러그인 (GIS 데이터 처리에 용이)GIS 데이터라 함은 위/경도 데이터 및 반경 내 xx 조사 등, GIS 기반의 기능 구현에 사용됨  1. Postgis 및 GIS 데이터 활용하기 위해서 일반적인 방법- geoDjango라는 Project 기반으로 작업 가능 - PointField 등 자유롭게 활용 가능 - 단, 프로젝트 자체가 geoDjango로 진행되어야 한다는 단점이 존재- https://docs.djangoproject.com/en/4.1/ref/contrib/gis/install/   2. Django Ninja + Pydantic (geo_json)- Dj..

Python/Django Ninja 2023.05.24

[Django Ninja] 정참조, 역참조 Schema 구현

Ninja 정참조 구현models.py는 Comment 테이블에서 Post 테이블을 정참조 함schema.py는 댓글(Comment)에서 게시글(Post) 정보를 하위 항목으로 조회 한다.# models.pyclass Post(models.Model): title = models.CharField(max_length=100) content = models.TextField(max_length=300)class Comment(models.Model): message = models.CharField(max_length=20) post = models.ForeignKey(Post, on_delete=models.CASCADE)# ================================..

Python/Django Ninja 2023.04.29