Python 서버배포 – Docker이미지 만들 때 poetry 사용하기

현상.

docker에서 poetry 쓰니까 설치할 때 느리다.. 심지어 타임아웃이 나버리는 상황..

의문.

  • poetry를 왜 쓰나?
  • 배포할 때 poetry를 왜 쓰나
  • docker!

결론.

안써도 된다

.gitignore에 requirements.txt 추가

poetry export --without-hashes --format=requirements.txt > requirements.txt
Dockerfile에서
pipenv install -r requirements.txt

!

Docker로 배포할 때 Poetry를 왜 쓰냐 병신아!

2023 파이썬으로 웹 서비스를 만드는게 잘 하는 짓일까?

최근에 본 글 두가지

하이퍼커넥트 기술블로그

https://hyperconnect.github.io/2023/05/30/Python-Performance-Tips.html
고성능 ML 백엔드를 위한 10가지 Python 성능 최적화 팁
2023-05-30

페이스북 인스타그램 메타의 스레드스

이름도 좌까치 지었어
– 장사의 신

https://github.com/facebookincubator/cinder

드장고로 만들고 런타임을 자기들이 고쳐서 썼다고 한다.
cinder…. 빠르다고 하는데… 진짜로 빠를까?
내년쯤에 인프라비용을 핑계로 자바나 고로 리뉴얼 해 버리는건 아닐까?

파이썬으로 대충 돌아가게 만들기

ML은 모든게 프로토타이핑이기 때문에
그리고 다른 모든 부분보다 학습에 코스트가 크게 발생하기 때문에
그리고 API호출시 응답보다 모델 돌리는데도 코스트가 크기 때문에
파이썬의 성능따위 신경 안 써도 되는거 아닐까

스레듯는 프로토타이핑이잖아
사용자가 많아질 때 까지 대충 돌리려고 하는거 아니었을까
하지만 언젠가 리뉴얼을 해야한다.

파이썬으로 만들던건 어떻게 할까

파이썬은 토이 프로젝트나 스크립트 용도 정도로만 썼는데
규모가 좀 있는걸 만들려고 보니….

어차피 스프링 프레임워크같은 구조가 되어버리고 있다.
괜히 성능만 떨어지는 쓰레기를 만드는건 아닐까 하는 불안감이 엄습한다.

이럴거면 spring, ktor, quarkus, go, node 중 하나로 지금이라도 옮겨야 하는거 아닌가 하는 생각이 들기도 하지만
그래도 프로토타이핑은 파이썬으로 끝내는게 좋다고 본다.

생산성은 조금 괜찮은 것 같기도…

나는 pandas dataframe도 pydantic validation도 마구마구 쓸 생각이다.

어차피 리뉴얼당할 운명
파이썬으로 웹 프로토타이핑 하면서 성능따위는 신경끄는게 현명한 것 아닐까?

2023 Python 프로젝트 시작하기

서버개발 시장에서 사라질 줄 알았던 언어… 파이썬…
어차피 서버는 켜 놓는거고 접속자는 얼마 안되니
성능은 개나줘버려 편한게 장땡인 생산성의 시대를 맞아
그리고 AI시대 tensorflow의 언어로 한자리 차지하게 된 파이썬
ChatGPT가 가장 선호하는 언어 1위

좆같은 문법체계가 마음에 안들기도 하지만… 막상 쓰면 편하기도 한 언어

프로젝트 언어의 선택 기준

  • Kotlin-Spring – 대충 잘 모르겠을 때
  • Python – 계산이나 외부API호출이 많고 API호출이 많지 않을 때
  • Go – 별 기능 없고 API호출 많을 때
  • Rust – 본인이 햄스터라면
  • Clojure – 정신병 걸렸을 때
  • RubyOnRails – 쓰지마 병ㅅ니아

WebFramework – FASTAPI

Fastapi: 차세대 빠른속도 API
Django: Meta에서 만든 Theads가 Django로 되어 있다고 한다. 런타임 환경은 cinder라는 cpython3.8의 fork. 서버 비용이 중요한 대규모 서비스인데 왜 그런 선택을….???
cinder를 이용해서 성능개선을 이뤄낼 역량이 되니 다른 회사에서 감히 같은 선택을 하기는 힘들다.

Flask: 빠른속도를 내세웠는데 속도가 쳐지면… 사라질 때… 이제는 FastAPI를 쓴다

ORM – peewee

옛날 사람들은 SqlAlchemy를 떠올리겠지만…
https://github.com/coleifer/peewee 의 Stargazers 10.2k
SqlAlchemy는 7.5k
ponyorm/pyny 3.3k

코드만 보면 뭐가 특별히 좋아 보이진 않는다. 대표들이 데이나화이트랑 같이 만나서 한판뜨고 인터넷 생중계 한 다음에 이긴쪽으로 합쳐버리면 좋을 것 같다.

class Customer(db.Entity):
    email = Required(str, unique=True)
    password = Required(str)
    name = Required(str)
    country = Required(str)
    address = Required(str)
    cart_items = Set("CartItem")
    orders = Set("Order")

class Address(Base):
     __tablename__ = "address"

     id = Column(Integer, primary_key=True)
     email_address = Column(String, nullable=False)
     user_id = Column(Integer, ForeignKey("user_account.id"), nullable=False)

     user = relationship("User", back_populates="addresses")

     def __repr__(self):
         return f"Address(id={self.id!r}, email_address={self.email_address!r})"

class Tweet(BaseModel):
    user = ForeignKeyField(User, backref='tweets')
    message = TextField()
    created_date = DateTimeField(default=datetime.datetime.now)
    is_published = BooleanField(default=True)
  • prisma처럼 reverse로 디비 스키마를 가지고오는 기능
    http://docs.peewee-orm.com/en/latest/peewee/playhouse.html#pwiz
  • activerecord, flyway처럼 쿼리로 하는 것 보다 migration_api가 지원되서 좋다.
    스크립트와 함께 작성하면 좋으니.. 마이그레이션이 단순히 디비 스키마만 변경하면 되는게 아니라서
    http://docs.peewee-orm.com/en/latest/peewee/playhouse.html#schema-migrations
    https://github.com/klen/peewee_migrate
    ->
    1. 백업 후 마이그레이션
    2. 스냅샷 백업 후 백업 후 복원

실행 – unicorn

https://fastapi.tiangolo.com/deployment/docker/

docker에서 unicorn으로 실행

버전관리 – Poetry

파이썬에서 버전관리 툴로 거쳐간것들이 꽤 된다.

기본 패키지 관리툴: pip install -r requirements.txt
가상환경: conda, pipenv, venv
npm따라한거: poetry

생각 해 보니 이것들 특성이 제각각이라 분류를 하기 애매하다.
poetry에 와서야 노드 npm처럼 패키지가 관리된다. .lock파일도 있고

Lint – pylint

pylint, flake8, bandit, bandit

~

쓰는 사람이 많으니 계속 발전하는 것 같다.

대신 문법 자체가 바뀔 여지는 더 줄었다.

ChatGPT가 가장 잘 알려주는 언어라는 장점도

[기술서] 파이썬 병렬 프로그래밍 – 내용없음

리뷰 내용 말고 책 내용없음
스레드나 그 메커니즘을 자세히 설명한 것도 아니고
튜토리얼이 잘 나온것도 아니다

GIL이라던가.. 하는 파이썬에서 논란이 많은 부분에 대한 설명이있었으면 했는데
그냥 키워드만 나온다
각 기술의 차이도 비교가 상세히 되어있지 않다.

그냥 파이썬에서 병렬프로그래밍을 할 수 있는 기술과 그 샘플코드 정도만 소개 돼 있다.

내부모듈 이용

  1. threading
  2. multiprocessing

라이브러리 이용(추상화계층을 얹어서 병렬프로그래밍 구현)

  1. Celery: 표준. https://docs.celeryproject.org/en/stable/
    multiprocessing, gevent, eventlet 등 활용
  2. PP: Parallel Python 안쓰이지 않나….

파이썬 분산형 서버를 만들때 사용하는 기술

이 책에서는 참고할게 없고 그냥 일반적으로는

  • RabbitMQ, Redis 사용시에는 Celery 사용
  • Kafka와 StreamData를 다룰 때는 FaustStreams 사용

threading이나 multiprocessing은 쓸 일이 있을까
한 서버에서 돌릴수 있는 정도의 프로그램을 만들때
웹프로그램에서는 사용하지 않음

Python Flask 관련기술

파이썬 전반적인 부분과는 별개로 Flask 사용할 때 필요한 부분들

파이썬으로 복잡한 API 는 만들지 말자. 금지기술

역겨운 부분

app.py에는 db(Flask-Sqlalchemy), flask_app(Flask), jwt(Flask-JWT)
server.py에서 app.py를 본다. server.py는 models.module을 본다. server.py에는 jwt custom이 들어간다.
routes.module에서 app.py를 본다
models.module에서 app.py를 본다

jwt custom decorator는 어디다 넣어야되나
파이썬은 규모있는 API를 만든건 처음이긴한데
파이썬은 그냥 한개파일에 쑤셔넣을 정도 사이즈로만 사용해야 하는거 아닐까

로그인

  • Flask-JWT
    업데이트 안됨. extended와 pyjwt 의존성 버전충돌
    개인적으로는 아래것들도 안쓰고 코드를 퍼다가 프로젝트에 넣고 사용함
  • Flask-JWT-Extended
  • Flask-JWT-Simple
  • flask-bcrypt
  • Flask-Login
  • Flask-User
  • Flask-Security

API

  • Flask-CORS
  • Flask-Restful
  • Flask-Restplus
  • Flask-RESTX
    위에 두는 폐기.. 해야하겠지만 의존성 문제가 있으려나

Validation

  • cerberus
  • Flask-Validator

Doc

Test

  • unittest
  • pytest

StarterKit

  • https://github.com/lingthio/Flask-User-starter-app.git

2023 Python 서버기술

파이썬으로 제대로된 서버개발을 한 적은 없어서 몇 가지 조사하다가 발견한것들
2020작성 – 20230712 업뎃
크게 변한게 없어서 새로 작성 안하고 업뎃

WebFramework

  • Django https://github.com/django/django
  • Flask https://github.com/pallets/flask
  • FastAPI https://github.com/tiangolo/fastapi
    https://towardsdatascience.com/why-we-switched-from-flask-to-fastapi-for-production-machine-learning-765aab9b3679

미만잡..

  • Bottle https://github.com/bottlepy/bottle https://bottlepy.org/docs/dev
  • Pylons https://github.com/Pylons/pylons
  • Pyramid https://github.com/Pylons/pyramid https://trypyramid.com/
  • Falcon https://github.com/falconry/falcon
  • Eve https://github.com/pyeve/eve
  • CherryPy https://github.com/cherrypy/cherrypy
  • https://github.com/juancarlospaco/faster-than-requests

엄청많다

ORM

  • SqlAlchemy
  • https://github.com/python-gino/gino
  • PonyORM
    https://ponyorm.org/
  • DjangoORM

SQL

  • PyPika
    https://pypika.readthedocs.io/en/latest/
  • https://github.com/tmuzzin/PythonSQLGenerator
  • https://github.com/hhyo/mybatis-mapper2sql
  • PyDAL
    https://github.com/web2py/pydal

비동기 기술

  • celery
  • faust
  • async
  • PyKafka
    https://pykafka.readthedocs.io/en/latest/
  • kafka-python
    https://github.com/dpkp/kafka-python
  • Winton Kafka Streams
    https://github.com/wintoncode/winton-kafka-streams

개발환경

버전관리, 프로젝트별 의존성 격리 도구

기본도구: pip install -r requirements.txt

미만잡

빌드배포용

  • autoenv
  • setuptools
  • pip-tools

실행환경

  • Gunicorn
  • uWSGI
  • Uvicorn(ASGI)
    https://www.uvicorn.org
  • supervisord
    http://supervisord.org/
  • honcho
    https://github.com/nickstenning/honcho
  • forever
  • pm2
  • unicorn

배포환경

  • zappa – aws lambda (반푼이)
  • serverless – aws lambda
  • https://github.com/GoogleCloudPlatform/functions-framework-python
  • https://github.com/tiangolo/uwsgi-nginx-flask-docker
  • https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker

기타 참고

  • https://dev.to/sm0ke/flask-dashboard-simple-open-source-starters-4noc

Python Anaconda – 버전관리? 환경구성?

https://conda.io/docs/user-guide/tasks/manage-environments.html

환경 목록

conda info –envs

환경 생성

conda create –name envname python=3.6

--no-default-packages
기본패키지도 설치안하고 설치

 

Activate the new environment:

  • Windows: activate myenv
  • macOS and Linux: source activate myenv

 

환경 삭제

conda remove –name envname –all

설치된 패키지 목록

conda list

Oracle – python 연동

Oracle은 별로 쓰고싶지 않은데…  또…

이번엔 clob 데이터 문제… mssql의 데이터를 oracle로 옮겨야되는데… clob자료형이다.
sql developer에서 insert query로 뽑아내서 옮기려고 하는데 clob라서 안된다.
python으로 스크립트를 짜서 처리를 하려고 하는데~~

Oracle은 만만한 녀석이 아니다.

프로세스 진행상황을 순차적으로 기록하면

1. MS-SQL 연동(은 덤으로)

pymssql을 설치하니까 간단히 연동이 된다.

import pymssql

conn = pymssql.connect(server='ipiphosthost', user='username', password='pwd_passwddddrd', database='dbnanmmnell')
cursor = conn.cursor()
cursor.execute('SELECT top 100 * FROM prod')
row = cursor.fetchone()
while row:
    print(str(row[0]) + " " + str(row[1]) + " " + str(row[2]) + " " + str(row[3]))
    row = cursor.fetchone()

바로 잘 돌아간다.

단, 내 컴퓨터에는

Visual Studio 2015, MSSQL(sql server 2008 r2)서버가 설치되어 있다. 조건이 다르다면 바로 안될수도 있다.

 

 

2. Oracle 연동

import cx_Oracle

PORT_NUM = 1521
dsn = cx_Oracle.makedsn("SERVER_HOST", PORT_NUM, "ORCLE_SID_NAME")
db = cx_Oracle.connect("USERNAME", "PASSWORD", dsn)
cursor = db.cursor()

cursor.execute("""SELECT * FROM sso_data.t_users where rownum < 100""")
row = cursor.fetchone()
while row:
    print(str(row[0]) + " " + str(row[1]) + " " + str(row[2]) + " " + str(row[3]))
    row = cursor.fetchone()

샘플코드는 이렇다.

도큐먼트 : http://cx-oracle.readthedocs.io/en/latest/index.html

 

오라클답게 쉽게 설치되지 않는다.
pip install cx_Oracle

pip로 설치후에 발견되는 에러
ImportError:DLL load failed:지정된 프로시저를 찾을 수 없습니다.
InterfaceError:Unable to acquire Oracle environment handle

 

위에러가 자꾸 나와서.

oracle instant client설치
C:\oracle\instantclient_12_1 이 경로에 설치 해 주고 path 잡아줬다.

cx_Oracle 설치
https://pypi.python.org/pypi/cx_Oracle/5.2.1 여기서 받아다가 설치

설치할 때 32/64비트 그리고 파이썬 버전을 잘 맞춰야된다.
오라클 버전도..

며칠 지났다고 기억이 안나네

Python 2.7 – Useful modules

1. Nose

https://pypi.python.org/pypi/nose/1.1.2

nose extends unittest to make testing easier

2. Numpy

http://sourceforge.net/projects/numpy/files/NumPy/1.6.1/

3. SciPy

http://sourceforge.net/projects/scipy/files/scipy/0.10.0/

4. MathPlotLib

http://matplotlib.org/

5. PyFtpdLib

https://code.google.com/p/pyftpdlib/

6. Paramiko

python ssh lib

7. BeautifulSoup4