python 프로젝트를 할때마다 환경 설정이 다르기 때문에 (python 버전이나 설치 패키지들.) virtualenv 모듈을 통해 가상환경을 만들어 줘야 합니다. 

해당 포스팅은  pycharm에서의 virtualenv 셋팅에 대한 글입니다. 

(mac 환경에서 진행하였으며, python3.7 / pip3 를 기본으로 하였습니다.)


먼저 하단의 terminal를 실행 시켜 보면 로컬에 설치 되어 있던 모든 모듈/패키지가 작동하지 않습니다. 


$ echo $PATH

일반 터미널에서 해당 명령어를 실행하면 아래와 같이 설정이 잡힌것을 볼 수 있습니다. 


다시 pycharm의  터미널에서 실행하면 아래 환경설정만 나오는것을 볼수 있습니다. (/url/local/bin 이 빠진것을 확인할 수 있습니다.)

pycharm의 새 프로젝트 시작시 다른 PATH가 설정되어 명령어가 동작하지 않습니다. 먼저 PATH 를 잡아줍니다.


$ export PATH=$HOME/bin:/usr/local/bin:$PATH

위의 명령어를 pycharm의 터미널에서 실행 후 다시  echo $PATH로 확인해보면 local/bin 이 추가 되었음을 확인 할 수 있습니다.


이제 기존에 로컬에 설치 하였던 모듈과 패키지들을 불러올수 있습니다. pip3 가 작동하는지 확인합니다. 

(혹시 pip3가 설치가 되있지 않다면 $ sudo apt-get install python3-pip 를 실행하여 설치하시면 됩니다. )

$ pip3 -v

pip3의 버전이 확인 되었습니다. 이제 virtualenv를 통해 가상환경을 만들어 줍니다. 

pycharm의 터미널에서 아래의 명령어를 실행 합니다. 

$ python3 -m virtualenv venv

(혹시 virtualenv가 설치 되지 않았다면 $ pip3 install --upgrade virtualenv 를 실행하여 설치 합니다.)


완료가 되었다면 해당 프로젝트 내에 venv라는 폴더 생성과 함께 가상환경의 기본 모듈들이 들어가 있음을 확을 확인 할수 있습니다. 

이제 해당 가상 환경을 적용하기 위해 아래의 명령어를 실행합니다. 

$ source venv/bin/activate


터미널의 명령줄 앞에 (venv)라고 표기가 되면 정상적으로 적용이 된 것입니다. 

하지만!!!!  pycharm을 끝내면 해당 activate한 환경이 다시 풀려 있음을 확인할수 있습니다.

pycharm의 환경설정에서 해당 가상환경으로 셋팅을 추가해줘야 합니다. 

메뉴바 -> Pycharm -> Preferences -> Project -> Project Interpreter 로 이동합니다. 

해당 화면에서 오른쪽 상단의 설정 버튼을 눌러주면 add / show all 선택 화면이 나옵니다. show all 버튼을 눌러줍니다.


아래 화면과 같이 기존의 로컬 환경 설정이 나옵니다. (저의 경우 기존 추가한 환경 설정이 보입니다.)

아래의 + 버튼을 눌러줍니다. 


Add Python Interpreter 화면이 나옵니다. 

첫번째 virtualenv Environment 탭에서 Existing environment 를 선택해 줍니다. 

Interpreter는 현재 폴더에 추가한 venv폴더를 선택해 줍니다.(자동 선택 되어 있을겁니다.)

OK를 눌러줍니다. 


방급 추가한 가상환경을 선택하고  OK를 눌러줍니다. 


이제 Project Interpreter는 가상환경이 적용되어 설치된 모듈이 3가지 밖에 없는 깨끗한? 환경을 볼수 있습니다. 


터미널을 다시 켜면 앞에 (venv)가 적용되어 가상환경이 적용된것을 확인할수 있습니다. 



참고

https://intellij-support.jetbrains.com/hc/en-us/community/posts/208567485-Pycharm-terminal-is-missing-part-of-PATH


WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret

프로그램을 작성시 테스트를 통해 수많은 에러를 겪으며 프로그램을 작성한다.  

단위 테스트, 통합 테스트 등 수많은 테스트를 겪었으니 해당 프로그램은  에러가 없을까?

세상에 완벽한 프로그램이 없듯이 자의든 타의든 프로그램엔 에러가 있을 수 밖에 없다. 

에러 발견을 메신져 알림을 통해 바로 확인하게 할수도 있고, 디비에 해당 내역을 기록할수 도 있다. 

수많은 프로그램이 난무 하는 가운데 그중 하나인 sentry.io를 소개 한다. 


사용법이 간단하고(아마도??) 통합적으로 관리할수 있는 뷰가 있어서 sentry.io를 선택했다. 


먼저 회원가입을 하면 사용하는 언어/프레임워크를 선택한다. 

저의 경우 python을 선택했다.

sentry-sdk 라는 패키지 설치 및 해당 프로젝트에 해당 api key를 선언해 준다.

sentry.io로 에러 부분을 보내는 방법은 exception 부분으로 감싸져 있는 부분만 보내진다. (설치한 패키지가 exception이 발생하면 에러를 전송한다.)


파이썬엔 데코레이션이라는 아주 좋은 기능이 있으므로 logging을 데코레이션으로 한후 해당 데코레이션 함수에 try로 감싸서 해결했다.

import logging

import functools

logger = logging.getLogger()


def log_error(logger):
def decorated(f):
@functools.wraps(f)
def wrapped(*args, **kwargs):
try:
return f(*args, **kwargs)
except Exception as e:
if logger:
logger.exception(e)
raise
return wrapped
return decorated

위와 같이 데코레이션을 선언후 함수 상단에 데코레이션을 선언해주면 된다.

@log_error(logger)
def solution(n):
pass .....


일부러 에러를 발생시켜 보면 (ret_arr의 max값은 100이다. 해당 배열은 참조없으므로 에러가 발생한다.) 실행시켜 보면


@log_error(logger)
def solution(n):
ret_arr = [x for x in range(1, n+1)]
ret_arr[999999999]

위와 같이 에러가 전송된것을 확인할수 있다. 


강제 메시지 전송 및 캡쳐는 다음의 링크를 참조 하자. 

https://docs.sentry.io/error-reporting/capturing/?platform=python


sentry.io는 개인 보다는 회사나 프로젝트 단위로 관리되어야 하며, 여러 사람이 과거에 어떤 에러가 발생했었고, 어떻게 해결 했는지를 관리 할수 있는 툴이다. ( 에러에 대한 기록 내역 서비스) 개발자 회의에서 에러에 대해 확인하고, 향후 개발해야 하는 방향을 정할수도 있으며,  효과적인 에러 관리를 통해 프로젝트의 관리 및 서비스 품질을 높힐 수 있을 것이다.



WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret


REST_FRAMEWORK에서 오른쪽 상단의 로그인을 통해 로그인을 해도 세션이 유지가 안되고, 

유저 객체가 AnonymousUser만 뜬다면


setting 의 REST_FRAMEWORK 속성에 auth관련 속성을 추가해 주면 된다.

REST_FRAMEWORK = {

    .......

    'DEFAULT_AUTHENTICATION_CLASSES': (

        'rest_framework.authentication.TokenAuthentication',

        'rest_framework.authentication.SessionAuthentication'

    )

}


'web > Django_rest_framework' 카테고리의 다른 글

django REST_FRAMEWORK login  (0) 2019.01.11
9. href  (0) 2016.07.30
8 pagination  (0) 2016.07.29
7 search  (0) 2016.07.28
6 저장/수정시 유저 저장  (0) 2016.07.27
5. create  (0) 2016.07.27

WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret

nginx + uwsgi 연동

web/Django 2019.01.11 03:29


uwsgi 연동 에서 이어짐


nginx 설치 

$ sudo apt-get install nginx


nginx에 프로젝트 설정 파일 추가 

$ cd /etc/nginx/sites-available/

$ sudo vi django_project.conf

server {

    listen 80; # 수신 포트 설정

    server_name _; # 도메인 설정 ip로 할경우 언더바 _ 로 하면 됨 

    location / { 

        # 요청을 전달할 소켓 파일 지정 (해당 파일은 uwsgi.ini에서 socket로 지정했음)

        uwsgi_pass unix:///tmp/django_project.sock; 

        include uwsgi_params; # uwsgi 사용, 리눅스에서 소켓은 파일처럼 취급된다.

    }

}


/etc/nginx/sites-enabled/ 에도 같은 파일이 필요. 심볼릭 링크로 추가

$ ln -s /etc/nginx/sites-available/django_project.conf /etc/nginx/sites-enabled/


!! 아이피로 할경우 default의 파일과 충돌하여 작동하지 않습니다. 도메인이 아닌 ip로 할경우 default파일을 지워줘야 합니다. ( 도메인이면 지우지 않아도 됩니다.)

$ sudo rm /etc/nginx/sites-enabled/default

$ sudo rm /etc/nginx/sites-available/default



nginx 재시작

$ sudo service nginx start

'web > Django' 카테고리의 다른 글

nginx + uwsgi 연동  (0) 2019.01.11
uwsgi -- unavailable modifier requested: 0 --  (0) 2019.01.10
ubuntu uwsgi  (0) 2019.01.10
django middleware  (0) 2016.08.15
django-summernote 사용하기  (4) 2016.07.23
get 방식의 글자 256자 제한은 잘못된 상식  (1) 2016.05.24

WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret


nginx + uwsgi 로 진행시 


-- unavailable modifier requested: 0 --

-- unavailable modifier requested: 0 --

-- unavailable modifier requested: 0 --



와 같이 접근이 안된다면 python3의 패키지나 옵션을 추가해 주시면 됩니다. 


1. uwsgi-plugin-python3 를 설치하고 다시 시작

$ sudo apt-get install uwsgi-plugin-python3


2. uwsgi 실행시  --plugin python3 옵션을 추가해서 시작

$ sudo uwsgi -i uwsgi.ini --plugin python3

'web > Django' 카테고리의 다른 글

nginx + uwsgi 연동  (0) 2019.01.11
uwsgi -- unavailable modifier requested: 0 --  (0) 2019.01.10
ubuntu uwsgi  (0) 2019.01.10
django middleware  (0) 2016.08.15
django-summernote 사용하기  (4) 2016.07.23
get 방식의 글자 256자 제한은 잘못된 상식  (1) 2016.05.24

WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret

ubuntu uwsgi

web/Django 2019.01.10 00:49

가상환경 추가

$ virtualenv -p python3 venv


django 설치 및  프로젝트 생성

$ sudo apt-get install build-essential python-dev

$ pip3 install uwsgi

$ pip3 install django 

$ cd ~

$ django-admin.py startproject django_project


uwsgi 실행 확인 (에러시 포트 바인딩 확인)

$ cd django_project

$ uwsgi --http :8089 --module django_project.wsgi


ini 파일로 uwsgi 실행 

$ cd ..

$ vi uwsgi.ini

( base 의 경로 확인 필요 )

[uwsgi]


base = /home/ubuntu

project = django_project

chdir = %(base)/%(project) 

module = %(project).wsgi:application   

master = true    

processes = 1    

socket= /tmp/%(project).sock  

chmod-socket = 666

vacuum = true    

pidfile = %(base)/%(project).pid 

daemonize = %(base)/%(project).log


$ uwsgi -i uwsgi.ini



데몬으로 uwsgi 실행 ( uwsgi 설치 )

$ sudo apt-get install uwsgi

$ sudo apt-get install uwsgi-plugin-python3


$ sudo uwsgi -i uwsgi.ini

-> [uWSGI] getting INI configuration from uwsgi.ini 

출력과 함께 실행됨

로그를 보고 싶다면

$ tail -f -n 1000 django_project.log (ini파일의 deamonize의 경로의 log 파일)


uwsgi 종료시

$  sudo uwsgi --stop django_project.pid (ini 파일의 pidfile 경로의 pid 파일)




'web > Django' 카테고리의 다른 글

nginx + uwsgi 연동  (0) 2019.01.11
uwsgi -- unavailable modifier requested: 0 --  (0) 2019.01.10
ubuntu uwsgi  (0) 2019.01.10
django middleware  (0) 2016.08.15
django-summernote 사용하기  (4) 2016.07.23
get 방식의 글자 256자 제한은 잘못된 상식  (1) 2016.05.24

WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret

pytest 설치

테스트 코드를 작성하고 실행할 수 있도록 pytest를 설치한다.

pip install -U pytest

간단히 hello_test.py를 만들어 보자.

def test_hello():
    assert hello('JOKER') == 'Hello, JOKER!'

pytest를 실행하면 해당 프로젝트의 *_test.py 파일 안에 있는 모든 test_* 테스트 함수를 확인하게 된다.

pytest

간단히 통과시키자.

def hello(name):
    return 'Hello, {}!'.format(name)


def test_hello():
    assert hello('JOKER') == 'Hello, JOKER!'

파일이 수정될 때마다 자동으로 실행하게 하려면 pytest-watch를 쓰면 된다.

pip install -U pytest-watch

실행할 때는 오히려 더 짧게 쓰면 된다.

ptw

pylama 설치

올바르게 코딩하는 걸 도울 수 있도록 정적 분석기를 사용하자. 여기서는 Pylava를 이용해 검사한다.

pip install -U pylava

간단히 돌려보자.

pylava

venv 폴더가 있다면 그것도 포함해서 검사하기 때문에 지나치게 오래 걸린다. --skip 플래그로 해당 폴더를 제외하자.

pylava --skip "venv/*"

Pylint도 함께 사용해 보자. Pylava의 기본 Linter 목록은 여기에서 확인할 수 있다.

# Pylint 설치
pip install -U pylava-pylint

# Linter 목록 바꿔서 실행
pylava --skip "venv/*" --linters "pycodestyle,pyflakes,mccabe,pylint"

매번 linters 플래그를 적어주는 게 불편하다면 pylava.ini 또는 pytest.ini 파일을 만들어서 다음 내용을 넣어준다.

[pylava]
skip = venv/*
linters = pycodestyle,pyflakes,mccabe,pylint

docstring이 빠졌고 빈 줄이 부족하다고 하니 모두 추가하자.

"""Sample test code."""


def hello(name):
    """Return greeting message."""
    return 'Hello, {}!'.format(name)


def test_hello():
    """hello function test."""
    assert hello('JOKER') == 'Hello, JOKER!'

pytest와 pylava를 통합해 보자.

pytest --pylava

매번 --pylava 플래그를 입력하는 게 불편하면 pytest.ini 파일에 다음을 추가한다.

[pytest]
addopts = --pylava

이제 python-watch 하나만 실행하면 코드가 올바른지 계속 감시할 수 있다.

ptw





WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret

우주라이크

쓰레기장"" 2018.12.28 19:46




우주라이크. http://wouldyoulike.org/

천문학 단체로 주최된 "천문학자는 어떻게 우주를 바라보는가?" 에 대한 주제 강연이였다.

먼저 강연자이신 지웅배님.... 말씀 엄청 잘하신다;;; 강연경력이 장난아니신듯 하다.

우주에 대한 그동안의 연구들을 정말 깔끔하고 쉽게 설명해 주셨다. 

지금 인류가 무엇을 하고 있고, 어떻게 하고 있는지. 

사실 천문학은 돈이 안되는게 사실이라 많이 어려운 학문임에도 이렇게 힘써주시는 단체가 있어서 감사하기만 하다. 

우주에 대해서 한번쯤 다시 생각할 수 있는 좋은 시간이였다.


- 경품 당첨이라니..ㅜㅡㅜ 화성 뱃지 최고!!!

- 지웅배님의 서적들은 한번쯤 읽어봐야 겠다. 


WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret

1. 요구사항의 명확화 - 정확히 무엇을 할것인지를 정의할것

2. 파라미터 정의 - int / array / date / timestamp 인지 파라미터를 명확히 한다. 

3. 기능의 순서 설계 - 요구사항을 진행하기 위해서 어떤 순서로 코드를 작성할 것인가? 
    UML / 다이어그램  / 순서도 등을 통해 순처리/예외처리를 확인 을 통해 간결해 진다.

4. 코드 작성 및 리팩토링 (코드를 짜면서 기능을 추가 할수도 있으며, 기능 단위로 다시 묶음으로써 리팩토링이 가능해 진다. )

5. 추가 사항이 있는가 확인. 있다면 다시 1번으로 

- 버그나 에러는 1, 2번에서 빠진게 있는것. 만일 이게 아니라면 기능상의 오류
   (기능정의부터 잘못됨)
- 코드부터 작성하지 말자. 기능과 파라미터를 명확히 하면 더 시간을 아낄수 있다
- 내가 하는 일을 말로 설명할수 있어야 한다. 만일 이것을 못한다면 코딩을 하는게 아니라 버그를 만드는것이다.  


'server > 아키텍쳐' 카테고리의 다른 글

코딩을 하기전 해야할 일들  (0) 2018.12.28
web developer roadmap  (0) 2018.12.20
DSR ( direct server return )  (0) 2018.12.11
서버 구조 생각하기  (0) 2018.11.29

WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret

 No such file or directory: 'geckodriver': 'geckodriver'

selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs to be in PATH.

혹시 selnium 패키지를 이용하여 테스트를 할시 위와 같은 에러가 발생한다면 selenimu에서 사용하는 gecko 브라우져의 드라이버를 추가해줘야 한다. 


https://github.com/mozilla/geckodriver/releases


자신의 OS에 맞는 드라이버를 다운로드 한후 


MAC의 경우 /usr/local/bin/ 폴더에 복사 해주면 정상 작동한다.


WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret