내용

파트너센터 error 로그에 Apache/mod_wsgi 에러 발생 확인

 

원인

  • 서버에서 클라이언트로 응답을 보낼 때 중간에 끊길 때 발생하는 에러 확인
  • IE에서 파트너센터 font를 다운로드 할 때 500에러 발생
    • IE에서 캐쉬를 사용하지 않을 경우 font를 정상적으로 응답 받지 못함 
  • error 로그 내용
    • mod_wsgi (pid=xxxx): Exception occurred processing WSGI script '/home/service/was/partner/app.wsgi'
    • IOError: Apache/mod_wsgi failed to write response data : Broken Pip.

 

조치

  • 파트너센터 app.py에서 after_request 주석 처리
  • 아래 소스 주석 처리

 

@app.after_request

def response_checker(response):

    # disable cache

    from datetime import datetime

    response.headers['Last-Modified'] = datetime.now()

    response.headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0'

    response.headers['Pragma'] = 'no-cache'

    response.headers['Expires'] = '-1'

    return response

'개발 > Python' 카테고리의 다른 글

CentOS7 Python + Apache 설정  (0) 2020.03.22
다국어 설정(Django)  (0) 2019.05.10
Python isinstance Decimal 확인 오류  (0) 2019.03.20
pymssql transaction없이 실행  (0) 2019.03.05
Flask + Beaker 사용 시 "MySQL server has gone away"  (0) 2019.03.05


Skip to end of metadata

Go to start of metadata

 

내용

python isinstance를 통해서 Decimal 클래스를 확인하지 못하는 현상 확인

if isinstance(obj, decimal.Decimal):
    return obj

 

원인

  • decimal.Decimal 클래스가 Google App Engine SDK 내부 어딘가에서 패치된 것(또는 모듈을 다시 로드)으로 추즉 됨(stackoverflow 내용)
    • 이 현상은  MySQL conversions 라이브러리가 decimal을 import 할 때와 사용자가 같은 것을 import 하는 사이에 발생 됨
    • 자세한 내용 추가 확인 필요
    • 관련 내용 바로가기

 

조치

  •  MySQL conversions 테이블을 업데이트
    • 조치에 대한 내용 확인 필요

 

from MySQLdb.constants import FIELD_TYPE
from MySQLdb.converters import conversions
import decimal
 
 
conversions[FIELD_TYPE.DECIMAL] = conversions[FIELD_TYPE.NEWDECIMAL] = decimal.Decimal
  
if isinstance(o, conversions[FIELD_TYPE.DECIMAL]):
    return str(o)


'개발 > Python' 카테고리의 다른 글

다국어 설정(Django)  (0) 2019.05.10
Apache/mod_wsgi 파이프 깨짐 현상  (0) 2019.03.27
pymssql transaction없이 실행  (0) 2019.03.05
Flask + Beaker 사용 시 "MySQL server has gone away"  (0) 2019.03.05
pip 설치시 SSL 에러  (0) 2018.09.10

pymssql transaction없이 실행


pymssql에서는 명시적으로 변경된 데이터를 유지하려면 모든 트랜잭션을 명시적으로 commit해줘야한다.

자동커밋(autocommit)은 작업이 성공되자마자 바로 commit된다. 트랜잭션을 사용하지 않고 작업을 실행할 경우

connection 객체의 autocommit()메서드에 인자값을 True로 설정하고 호출한뒤 작업을 진행하면 된다.


원문내용

Where status is a boolean value. This method turns autocommit mode on or off.

By default, autocommit mode is off, what means every transaction must be explicitly committed if changed data is to be persisted in the database.

You can turn autocommit mode on, what means every single operation commits itself as soon as it succeeds.

A pymssql extension to the DB-API 2.0.


예제코드 : 

import pymssql
conn = pymssql.connect(server, user, password, "tempdb")
conn .autocommit(status)
...
conn.execute("select 1")
conn.close()


Flask + Beaker 사용 시 "MySQL server has gone away" 


  • 내용 
    • 관리자 사이트 개발 시 다음날 아침에 접속하려고 할 때 "OperationalError: (pymysql.err.OperationalError) (2006, "MySQL server has gone away (error(32, 'Broken pipe'))") [SQL: u'SELECT beaker_cache.data \nFROM beaker_cache \nWHERE beaker_cache.namespace = %(namespace_1)s'] [parameters: {u'namespace_1': '5640182909d9482fa42baa6f52fa57e9'}]" 에러내용을 확인.
  • 원인
    •  Beaker 사용 시 'session.type'을 'ext:database'를 사용하고 pymysql을 통해서 접근할 때, MySQL Connection이 생성되는데 이 때 'wait_timeout'이 만큼 sleep이 경과되고 MySQL connection이 제가거 되고 난 뒤에 다시 접근할 때 "MySQL server has gone away" 에러 발생
  • 조치
    • beaker session option의 'sa.pool_recycle' 활용
    • 'wait_timeout'보다 적은 시간 만큼 request 요청하기 (crontab, health check 등)

  • 조치1(pool_recycle 사용)
session_opts = {
'session.sa.pool_recycle': 250
}


  • 조치2(crontab 사용)
0 */3 * * * /usr/lib/python/python2.7 {경로}/crontab.py





'개발 > Python' 카테고리의 다른 글

Python isinstance Decimal 확인 오류  (0) 2019.03.20
pymssql transaction없이 실행  (0) 2019.03.05
pip 설치시 SSL 에러  (0) 2018.09.10
db migrate 에러 관련 사항(SQLAlchemy)  (0) 2018.09.10
db column 변경(SQLAlchemy)  (0) 2018.09.10

python pip를 사용하여 패키지 설치가 되지 않는 경우 (SSL : CERTIFICATE_VERIFY_FAILED 에러 발생시)

 

... \Lib\site-packages\pip\_vendor\requests\sessions.py에서 SSL 관련 소스 수정

# ......
  
# : SSL Verification default.
self.verify = False
  
# .....

 

alembic.util.exc.commanderror: target database is not up to date.

지정된 데이터베이스버전과 migrate에 버전이 맞지 않아 생기는 오류로 파악

  • 만약을 대비해 모든 것을 백업
  • migrations 폴더를 다른 폴더(즉, migrations-old)로 변경
  • run flask db init --multidb
  • migrations-old/versions/* 의 파일을 새로 생성된 migrations/versions/으로 복사
  • run flask db stamp head (추가 데이터베이스를 업데이트 중으로 표시합니다.)
  • migrations-old 삭제

alembic.util.exc.commanderror: directory migrations already exists

이미 migrations 되어있는 db를 init(초기화)하려고 하는 경우

  • 이 경우는 다시 초기화 할 필요가 없음


'개발 > Python' 카테고리의 다른 글

Flask + Beaker 사용 시 "MySQL server has gone away"  (0) 2019.03.05
pip 설치시 SSL 에러  (0) 2018.09.10
db column 변경(SQLAlchemy)  (0) 2018.09.10
에플리케이션 / 리퀘스트 컨텍스트(Flask)  (0) 2018.09.10
설치(Flask)  (0) 2018.09.10

기존 테이블의 컬럼을 변경하기 위해서 "python2 db.py db migrate"을 하였으나 변경되지 않을경우

  • migrations 디렉터리의 "env.py" 파일
  • run_migrations_online() 함수에서  compare_type=True 추가
def run_migrations_online():
    # ...
    context.configure(
                connection=connection,
                target_metadata=target_metadata,
                compare_type=True
                )
    # ...


'개발 > Python' 카테고리의 다른 글

pip 설치시 SSL 에러  (0) 2018.09.10
db migrate 에러 관련 사항(SQLAlchemy)  (0) 2018.09.10
에플리케이션 / 리퀘스트 컨텍스트(Flask)  (0) 2018.09.10
설치(Flask)  (0) 2018.09.10
블루프린트(Flask)  (0) 2018.09.10

리퀘스트 오브젝트 : 플라스크가 클라이언트에서 요청(request)를 수신하면 요청을 처리하기위해서 사용하는 몇 개의 오브젝트

컨텍스트 : 임시적으로 오브젝트를 글로벌하게 엑세스 가능. 컨텍스트를 사용하면 플라스크는 다른 스레드의 개입 없이 임의의 변수들이 전역적으로 스레드에 엑세스될 수 있게 해준다.

 

변수 이름
컨텍스트
설명
current_app에플리케이션 컨텍스트활성화된 애플리케이션을 위한 애플리케이션 인스턴스
g에플리케이션 컨텍스트

리퀘스트를 처리하는 동안 애플리케이션이 임시 스토리지를 사용할 수 있는 오브젝트

해당 변수는 각 리퀘스트에 따리 리셋

request리퀘스트 컨텍스트클라이언트에 의해 송신된 HTTP 리퀘스트의 콘텐츠를 캡슐화하는 리퀘스트 오브젝트
session리퀘스트 컨텍스트사용자 세션이며, 애플리케이션이 리퀘스트 사이의 "remember" 값들을 저장하는데 사용하는 딕셔너리

 

리퀘스트 후크

리퀘스트가 뷰 함수에 디스패치되는 전후에 실행되도록 설정

  • before_first_request : 함수를 등록하여 첫 번째 리퀘스트가 처리되기 전에 실행
  • befoore_request: 각 리퀘스트 전에 실행하는 함수를 등록
  • after_request : 처리되지 않는 예외가 발생하지 않는다면 ,각 리퀘스트 이후에 실행하는 함수를 등록
  • teardown_request : 처리되지 않는 예외가 발생하더라도, 각 리퀘스트 이후에 실행하는 함수를 등록


'개발 > Python' 카테고리의 다른 글

db migrate 에러 관련 사항(SQLAlchemy)  (0) 2018.09.10
db column 변경(SQLAlchemy)  (0) 2018.09.10
설치(Flask)  (0) 2018.09.10
블루프린트(Flask)  (0) 2018.09.10
SQLAlchemy(Flask)  (0) 2018.09.10

가상환경의 사용

개별적으로 설치하는 패키지에 대한 파이썬 인터프리터의 프라이빗 복사본 환경을 의미한다. 시스템의 설치된 글로벌 파이썬 인터프리터에 영향을 미치지 않는다.

가상 환경은 마구잡이 식의 패키지 통합이나 시스템의 파이썬 인터프리터에서 버전 충돌의 발생을 막을 수 있기 때문에 유용하고 각 애플리케이션에 대한 가상환경을 구축하여

애플리케이션이 사용하는 패키지만을 엑세스할 수 있으며 다른 가상 환경을 추가로 만들어 사용할 수 있다. 관리자 권한이 필요하지 않다는 점도 있다.

 

  1. 유틸리티 설치 확인
    1. virtualenv --version
  2. 설치
    1. (우분투) sudo apt-get install python-virtualenv
  3. 파이썬 가상환경 생성
    1. virtualenv 커맨드 사용
    2. 인수의 의미는 가상환경의 이름
    3. 공통적으로 사용하는 명명 규칙은 venv
    4. virtualenv venv
  4. 가상환경 활성화
    1. source vevn/bin/activate
    2. (venv) $
  5. 가상환경 비활성화
    1. (venv) $ deactivate

 

pip를 이용한 파이썬 패키지의 설치

대부분의 파이썬 패키지는 pip라는 유틸리티를 사용하여 설치한다. 가상 환경이 활성화되면 pip유틸리티의 위치는 PATH에 추가된다.

 

  1. (venv) $ pip install flask
    1. import flask 후 이상없으면 정상적으로 설치

 

Windows 환경 이슈

pip 설치시 "there was a problem confirming the ssl certificate ssl certificate_verify_failed" 이슈로 인하여 설치가 되지 않을경우

C:\Python27\Lib\site-packages\pip\_vendor\requests

경로의 session.py 파일에서 "self.verify = True" 값을 "False"로 수정(가상환경에서 마찬가지로 pip가 안먹힐 경우 virtualenv에서 해당경로의 verify 값을 false로 설정)

#: SSL Verification default.
self.verify = False

 

'개발 > Python' 카테고리의 다른 글

db column 변경(SQLAlchemy)  (0) 2018.09.10
에플리케이션 / 리퀘스트 컨텍스트(Flask)  (0) 2018.09.10
블루프린트(Flask)  (0) 2018.09.10
SQLAlchemy(Flask)  (0) 2018.09.10
Jinja2 템플릿(flask)  (0) 2018.09.10


플라스크에서 라우트는 app.route 데코레이터를 사용하여 쉽게 정의된다. 그러나 애플리케이션이 런타임에 생성되면

app.route 데코레이터는 app이 생성되고 난 뒤에야 존재할 수 있다.

블루프린트와 관련된 라우트는 블루프린트가 애플리케이션과 함께 등록될 때까지 휴면상태로 존재하고, 애플리케이션이 함께 등록되는

시점에서 라우트도 애플리케이션의 한 부분이 되어서 앞선 상황보다는 더 나은 해결책으로 사용할 수 있다.

from flask import Blueprint
  
main = Blueprint("main", __name__)
  
from import views, errors

Blueprint클래스의 생성자는 두 개의 인수를 필요로 한다

  • 이름
  • 블루프린트가 위치하게 될 모듈이나 패키지

 

원형 의존성을 피하기 위해서 모듈들을 애플리케이션의 초기화시에 Blueprint를 설정한다.

'개발 > Python' 카테고리의 다른 글

에플리케이션 / 리퀘스트 컨텍스트(Flask)  (0) 2018.09.10
설치(Flask)  (0) 2018.09.10
SQLAlchemy(Flask)  (0) 2018.09.10
Jinja2 템플릿(flask)  (0) 2018.09.10
함수  (0) 2018.09.10

+ Recent posts