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 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