TIL - 0226~0302

0226[수업 정리 할 것]

  • atom 저장을 잘 못 손대서 내용이 날라가버렸다. git.. 해놓을껄 후회중

[summary]

  • 멜론 artist ModelForm 이용, Like view 생성 [과제]
  • 멜론 song, album도 비슷하게 할것

0227

[summary]

[과제]

  • postman 다운
  • 디버깅 방법
  • 유투브 API - title, urls , vidoeID
  • Manytomany 필드로 video

페이스북 로그인

문서

OAuth란?

JSON이란?

그래프API

  • 엑세스 토큰 체크에 따라서 출력되는 값이 달라진다.
  • Input token은 우리가 액세스 토큰 (사용자 토큰)

Customizing authentication in Django¶

https://docs.djangoproject.com/en/2.0/topics/auth/customizing/

import requests
from django.conf import settings
from django.contrib.auth import get_user_model


User = get_user_model()


class FacebookBackend:
    CLIENT_ID = settings.FACEBOOK_APP_ID
    CLIENT_SECRET = settings.FACEBOOK_SECRET_CODE
    URL_ACCESS_TOKEN = 'https://graph.facebook.com/v2.12/oauth/access_token'
    URL_ME = 'https://graph.facebook.com/v2.12/me'

    def authenticate(self, request, code):
        def get_access_token(auth_code):
            """
             유저가 페이스북에서 우리 애플리케이션 사용에 '승인'한 경우,
             페이스북에서 우리 애플리케이션의 주소(redirect_uri)에 'code'라는  GET parameter로 전해주는
             인증코드 (auth_code)를 사용해서
             페이스북  GraphAPI에 access_token요청, 결과를 가져와 리턴
            :param auth_code: 유저가 페이스북에 로그인/앱/
            :return:
            """
            redirect_uri = 'http://localhost:8000/facebook-login/'
            # 아래 엔드포인트에 GET요청을 보냄
            params_access_token = {
                'client_id': self.CLIENT_ID,
                'redirect_uri': redirect_uri,
                'client_secret': self.CLIENT_SECRET,
                'code': auth_code,
            }
            response = requests.get(self.URL_ACCESS_TOKEN, params_access_token)
            # 전송받은 결과를 json형식의 텍스트,
            response_dict = response.json()
            return response_dict['access_token']

        def get_user_info(user_access_token):
            """
            User access token을 사용해서
            GraphAPI의 'User'항목을 리턴
            (엔드포인트 'me'를 사용해서 access_token에 해당하는 사용자의 정보를 가져옴)

            :param user_access_token:
            :return:
            """
            params = {
                'access_token': user_access_token,
                'fields': ','.join([
                    'id',
                    'name',
                    'first_name',
                    'last_name',
                ])
            }

            response = requests.get(self.URL_ME, params)
            response_dict = response.json()
            return response_dict

        # try:
        access_token = get_access_token(code)
        user_info = get_user_info(access_token)

        facebook_id = user_info['id']
        name = user_info['name']
        first_name = user_info['first_name']
        last_name = user_info['last_name']

        try:
            user = User.objects.get(username=facebook_id)
        except User.DoesNotExist:
            user = User.objects.create_user(
                username=facebook_id,
                first_name=first_name,
                last_name=last_name,
            )
        return user
        # except Exception:
        #     return None

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None
for item in response_dict['items']:
   ...:     print(item['snippet']['title'])

0228

[summary]

  • YouTubeAPI 사용 - artistdetail
  • 공부 방법 : 직접 코딩 - 비슷한거 만들기 - 그리고 설명 듣기
  • stackoflow를 보고 하되, 각 기능이 어떤 기능을 하는지 알아보기

[과제]

  • Django Gmail
  • 클린 코드를 위한 테스트 주도 개발 책 사기

reverse

coolDebelo per

https://www.coolsms.co.kr/developer https://www.coolsms.co.kr/Python_SDK_Start_here

  • 문자 전송

SMTP(간이 우편 전송 프로토콜)

  • stackoflow
  • 단방향성이라 수신확인이 가능
  • 수신확인, 발송취소와 관련한 기능이 없다. Gmail_참고 보안 수준이 낮은 앱 허용으로 인해서 위험이 있으니까 Test계정 만들기

AWS

  • IDC 데이터 센터 Amazon EC2/AWS Elastic Beanstalk

  • 클라우드 서비스 클라우드 서비스 종류
  • IaaS - O/S선택
  • PaaS - 장고만

  • 리소스 그룹 - E2C - 인스턴스

EC2란 무엇인가?

  • 성능이 필요하면 새로운 컴퓨터가 아니라 기존의 컴퓨터를 확장

키 페어

  • 개인키와 공개키
  • AWS자체에 개인키와 공개키가 있음 ,한번만 제공함
  • 프라이빗 키 파일 다운로드 후 .ssh 파일에 이동할 것

시큐어 셸(SSH)

  • 원격 시스템에서 명령을 실행하고 다른 시스템으로부터 파일을 가져올 수 있는 것
  • 포트 22
  • 브라우저로는 포트 80 번으로만 접근 가능해서 브라우저로는 접근이 불가
  • 퍼블릭 DNS로는 접근이 가능함

SSH 를 사용하여 Linux인스턴스 접근

  • ssh i 옵션 : 프라이빗 키가 존재할 때 이를 인증해서 접속하는 방법 (아마존에서 다운로드 받은 파일)


pyenv 설치

https://github.com/pyenv/pyenv/wiki/Common-build-problems

>> sudo apt-get update
>> sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \xz-utils tk-dev

zshell설치

설정참고

sudo apt-get install zsh
curl -L http://install.ohmyz.sh | sh
sudo chsh ubunt -s `which zsh`

srv

  • 서비스 디렉토리로 주로 인터넷 관련 파일이 위치합니다.
/*root로 나와서  */
>> cd
>> sudo chwon -R ubunt:ubunt /srv

>> srv
>> mkdir runserver -test
>> pyenv install 3.6.4

동작 방법

  • 기존 Browser(Client) -> runserver -> Djnago <===> PostgresSQL

  • 서버 Browser(Client) -> (SecurityGroup) -> EC2(Port 80)->

Nginx(WebServer)-> uWSGI(Web server gateway interface) -> Django

EC2 -> (runserver) ->Django(8000)

EC2 -> uWSGI(8000) -> Django

(runserver-tset) ➜  runserver-test uwsConnectionRefusedError: [Errno 111] Connection refused
gi \
--http :8000 \
--home /home/ubuntu/.pyenv/versions/runserver-tset \
--chdir /srv/runserver-test/mysite \
--module mysite.wsgi

EC2 -> Nginx -> uWSGI -> Django

WSGI 웹서버마다 요청이 다르기 때문에 중간에서 규격을 맞춰주는 인터페이스가 WSGI 그리고 규격에 맞는 것 웹 애플리케이션으로 넘겨줌

웹 서버 (Nginx) 같은 것을 의미함 / 이미지나, 텍스트와 같은 정적 파일을 처리 웹 애플리케이션 동적 파일 처리 (Django까지 감)

Nginx

  • 최신 버전 설치(작성 당시의 경우, 1.12.2) 설치
sudo -s

nginx=stable # use nginx=development for latest development version

add-apt-repository ppa:nginx/stable
apt-get update
apt-get install nginx

0302

[과제]

  • 다시 만들어보기 EC2

이메일 인증

  • base 64 : 이진데이터를 ASCII 문자로 바꾸는 것 이렇게 바꾸면 Text 형태로 전송 할 수 있다. 장점 : 문자열만 신경써주면 된다 . 단점 : 원본 크기보다 용량이 커진다. (30퍼센트정도) 예제서의 경우, User의 pk값을 노출하기 싫어서 사용

django site

  • DB는 공유하되 여러가지 사이트를 운영할 때 사용함(보이는게 서로 다름)

config 에서 secret 코드 따로 관리하는 법

Nginx 에서 포트 80번 접근

  • ddos
  • 80 번포트로 들어가면 nginx EC2 -> Nginx x-> uWSGI -> Django

nginx (virtualserver) <->(Unix Socket) uWSGI

http 전달 과정에서 많은 패킷이 필요로한다. 그래서 컴퓨터내에서 좀 더 효율적인 방법으로 Unix Socket을 사용한다

/home/ubuntu/.pyenv/versions/runserver-tset/bin/uwsgi \
--socket /tmp/app.sock \
--home /home/ubuntu/.pyenv/versions/runserver-tset \
--chdir /srv/runserver-test/mysite \
--module mysite.wsgi \
--vacuum

가상 서버 설정 들여쓰기 꼭 해야함!

<!-- 오류  -->
➜  sites-enabled sudo systemctl restart nginx
Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.
server {
        listen 80;
        server_name *.amazonaws.com;
        charset utf-8;
        client_max_body_size 128M;

        location / {
                uwsgi_pass unix:///tmp/app.sock;
                include uwsgi_params;
        }
}

site available unavailing 로 나뉨

/etc/nginx/sites-available default app

/etc/nagix/sites-enable default 는 삭제(파일은 남아있지만 링크만 삭제됨 파일가로가기로 이해하자) -> app의 link

sudo ln -s ../sites-available/app app

  • 하드링크 와 심볼릭 링크 알아보기
  • 502 bad gate uwgi와 연결이 안된 것 접근 할 수 있는 권한이 없음
*1 connect() to unix:///tmp/app.sock failed (2: No such file or directory) while connecting to upstream, client: 220.75.211.169, server: *.amazonaws.com, request: "GET / HTTP/1.1", upstream: "uwsgi://unix:///tmp/app.sock:", host: "ec2-13-125-198-112.ap-northeast-2.compute.amazonaws.com"
➜  nginx ps -aux | grep nginx
<!-- grep 정규표현식을 사용가능하다. ps 명령어가 뭔지, 옵션이 뭔지... -->
<!-- grep 줄단위로 nginx만 남겨있는 줄만 남기는 것이다.  -->

root      3093  0.0  0.1 150168  1564 ?        Ss   03:54   0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data  3099  0.0  0.3 150552  3404 ?        S    03:54   0:00 nginx: worker process
ubuntu    3263  0.0  0.0  12916   960 pts/1    S+   04:00   0:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn nginx

www-data 는 언제 생기는 유저인가?

 sudo systemctl restart nginx

### nginx (virtualserver) <->(Unix Socket) uWSGI

  • 시큐어 카피(scp 프로토콜 프로그램 ) 다른 서버로 파일 복사해서 보내기 $ scp 보낼파일 서버사용자계정@서버주소:복사될경로

기존 파일은 덮어쓰지만, 삭제된건 자동으로 방영이 되지 않는다. 그래서 삭제를 하고 실행하는게 좋다.

<!-- 삭제  -->
ssh -i ~/.ssh/fc-kahee.pem ubuntu@ec2-13-125-198-112.ap-northeast-2.compute.amazonaws.com rm -rf /srv/ec2-deploy

scp -i ~/.ssh/fc-kahee.pem -r ~/projects/django/deploy/ec2-deploy ubuntu@ec2-13-125-198-112.ap-northeast-2.compute.amazonaws.com:/srv
  • 서비스등록 시작 프로그램을 들어가는 것

직접 프로그램을 실행하는 것이 아닌, 시스템 트레이 엤듯이 백그라운드에서 실행되고 있는 프프로그램 service=daemon 프로세스를 DEMONIZATION -> 서비스화 한다.

sudo cp -f /srv/ec2-deploy/.config/uwsgi.service /etc/systemd/uwsgi.service