11 Feb 2019
|
TIL
방과후 집으로 돌아와 하루종일 github 블로그를 만지며 삽질을 거듭했는데, 그 중 아래의 2가지 문제점을 해결하느라 정말 고생했다.
코드박스 길이 & 블로그 Body space 문제
마크다운 - 코드박스에 작성된 내용이 길 경우, 블로그의 Body 공간이 초과되어 코드블럭 하단에 스크롤바가 생겨버렸다. body 부분의 space를 조절하는 css 파일을 찾는데 엄청난 시간이 소비 되었다.
- github내에 다른 분들의 코드를 참조해서 이것저것 수정하여 다행히 고쳤긴한데.. 실제로 어떤 코드로 인해서 그부분이 수정되었는지 아직까지 감이 안온다.
- 이 블로그는 codinfox 템플릿을 사용했는데, 이 테마를 사용한 유저나 개발자 분들이 많지 않아, 관련 정보를 찾는데 더 고생을 한 것 같다.
- jekyll 템플릿에 대해 공부를 해야하겠다는 것이 절실히 느껴졌다.
jekyll 로컬 서버 실행 오류
(jekyll 3.8.5 Error: incompatible character encodings: CP949 and UTF- 8)
- 어제, Typora로 작성한 Markdown을 블로그에 올렸을 때, Markdown style이 제대로 되지 않아 하나하나를 수정 & 커밋을 하는, 굉장히 비효율적인 과정을 겪었었다. 그래서 commit을 하기 전에 jekyll 로컬 서버로 업데이트된 화면을 실시간으로 보고 싶었으나 인코딩에러가 발생하였다.
- 구글링을 통해 여러가지 해결방법이 있는걸 발견했지만 어떠한 방법도 나에겐 도움이 되지않았다 ㅠ
- _config.yml 파일에 UTF-8 인코딩 추가
- Ruby command prompt에서 서버 실행 전 “chcp 65001” 코드 입력
- Ruby 가 설치된 디렉토리 내 sass 파일에 “Encoding.default_external = Encoding.find(‘utf-8’)” 추가
- 정말로 몇시간동안 삽질을 하다가 결국 윈도우에 저장된 사용자 계정 이름이 한글로 되어 있는 것이 문제라는 것을 알게 되었다. 게다가 한번 설정된 사용자 계정 이름은 변경되어도 컴퓨터 내 폴더 명은 변경되지 않았다.
- 결국, 원격 저장소를 C드라이브에서 다시 clone하여 문제점을 해결하였다.. 윈도우에서 사용자 계정이름은 절대 한글로 지정하지 말자..
Github blog를 운영하는 것이 티스토리나 네이버 블로그에 비해 정말 많은 어려움이 있다는 것을 뼈저리 느끼고 있지만, 여기서 포기 하지 말고 하나하나직접 부딪히며 삽질하다보면 언젠가 빛을 볼 날이 오지 않을까 싶다.
수업시간에 배운 Django에 대한 필기노트를 정리하여 블로그에 포스팅을 하고 오늘을 마무리 해야겠다.
11 Feb 2019
|
Django
What is Django?
- Static Web : HTML & CSS 등으로만 구성된 정말 단순한 웹서비스
- 이문서를 주세요 라고 요청하면, 어떠한 변형, 연산등도 없이, 단순히 문서를 보냄(응답). 서버의 파일이 도서관의 책처럼 적재되어 있고 클라이언트의 요청을 통해서해당 파일을 마치 책을 보는 것처럼 꺼 내 올 수만 있는 웹 서비스.
- Dynamic Web(Web Application program)
- Static Web과 상반되는 개념. 동적으로파일을 생성하여 뿌려주는 Web. 장고는 Dynamic web이라고 하는 내부적으로 연산도 가능하고, 사용자의 인풋마다 다른 아웃풋을 보여주는 동적웹임.
- 웹 앱(웹 서비스) 를 만드는 것은 카페를 만드는 것과 매우 유사
- 카페 창업의 두가지 방법
- A-Z 모두 직접하기
“홍보 마케팅. 대출 점포인테리어, 레시피개발, 원자재 거래처 확보, 매출정산”
- 프렌차이즈 창업
“ 기본적인 레시피나 필요한 재료는 알아서 제공해줄게. 넌 좋은 카페 만드는데 집중해!”
- 웹서비스 제작의 두가지 방법
- URL Parsing, DB setting, ORM, Security, Content Management Template, Caching, Web Server Settting
- 웹 프레임워크 사용
“기본적인 구조나 필요한 코드들은 알아서 제공해줄게. 넌 그냥 좋은 웹 서비스 만드는데 집중해!”
ex) Express JS, Ruby on Rails, Python django, JAVA Spring, PHP Laravel
- 이미 다 차려놓은것에서 필요한 것만 가져다 쓰면 되기 때문에 편리함.
많은 웹사이트가 웹프레임워크 - 장고를 기반으로 제작이 되어있음
(인스타그램, NASA, 모질라, 빗버켓)
Django의 동작 원리(구조)
구조 |
데이터 관리 |
사용자가 보는 화면 |
중간 관리자 |
Standard |
Model |
Template |
View |
Django |
Model |
View |
Controller |
- C9 에 git ignore 설정하기
- https://github.com/github/gitignore/blob/master/Python.gitignore
- 해당 github의 파일을 raw 로 열어서 최상위 폴더 내에 .gitignore 이라는 이름으로
파일 생성 후 내용 붙임.
Django 기본 설정하기
Django 기본 설정은 cloud 기반의 웹서버를 대여해주는 c9 을 기반으로 작성되었습니다. Django를 사용하는 환경에 따라 기본 설정 방식이 조금씩 다를 수 있습니다.
1. 파이썬 가상환경 생성
#intro-venv 라는 가상환경 생성
$ pyenv virtualenv 3.6.7 intro-venv
#가상환경으로 만들고자 하는 디렉토리 접속 후 명령어 입력
$ pyenv local intro-venv
2. 장고 설치 및 프로젝트/어플리케이션 생성
pip install django
: 장고 설치
django-admin startproject intro .
- intro 라는 프로젝트를 장고 내에 생성
.
을 입력하면, 현재 디렉토리에 어플리케이션을 생성함.
python manage.py runserver $IP:$PORT
: 서버실행
$ python manage.py runserver $IP:$PORT
Performing system checks...
System check identified no issues (0 silenced).
You have 15 unapplied migration(s).
Your project may not work properly until you apply
the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
January 24, 2019 - 01:35:48
Django version 2.1.5, using settings 'intro.settings'
Starting development server at http://0.0.0.0:8080/
Quit the server with CONTROL-C.
#서버 접속 시, 아래와 같이 에러
#setting.py - ALLOWED_HOST에 추가를 해줘야함.
DisallowedHost at /
Invalid HTTP_HOST header: 'playground-tothefullest08.c9users.io:8080'.
You may need to add 'playground-tothefullest08.c9users.io' to ALLOWED_HOSTS.
#setting.py
ALLOWED_HOSTS = ['playground-harrylee0810.c9users.io']
#장고는 디버깅 모드가 기본으로 설정되어 있어서 저장하고 새로고침하면 소스 내용이 자동 적용됨.
파일종류 |
내용 |
__init__.py |
Intro 라는 폴더(프로젝트로 지정한 폴더)를 하나의 패키지/모듈로 인식시킴. 이를 통해 intro.urls intro.settings 와 같은 기능을 사용 할 수 있음. 파이썬 파일을 불러오기 위해서는 __init___ 파일이 필요함. |
setting.py |
Django 내 설정들을 모아놓는 파일 |
urls.py |
프로젝트에 접근하기 위한 첫번째 문(문지기) 라는 개념임. 어떠한 요청이 Django 서버에 오면, 그 요청이 도착하는 곳이 urls.py이다. 요청을 urls.py에서 분석해서 어떠한 요청이 왔는지, 어떠한 주소로 왔는지를 보고 다른곳으로 전환하는 중개기(라우터)의 역할을 함. |
wsgi.py |
실제로 서비스를 하기 위해서, 완성을 해서 24시간 돌아가는 서버에다가 코드를 올려놓고 사람들이 access하고 수정을 할 수 있게 하는 파일 |
manage.py |
서버를 실행하기 위한 명령어 등을 저장하는 파일 |
- __init__.py 파일의 역할
- intro.settings와 같이
.
으로 타고 들어갈 수 있게 해주는 파일이 _init__.py임.
- 특정 폴더 내 파일에 접근하기 위해서는, __init__.py라는 파일이 있어야 그 폴더(intro; 프로젝트 명)를 하나의 모듈로 보고, 그 밑으로 들어갈 수 있게됨.
- ex)
intro.settings
: intro라는 폴더(프로젝트로 지정된 폴더) 내에 settings.py라는 파일을 불러오겠다!
#manage.py
import os
import sys
if __name__ == '__main__':
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'intro.settings')
3. 어플리케이션 생성
python manage.py startapp 어플명
: 어플리케이션을 생성하는 명령어
- 어플리케이션 기본 설정:
[어플리케이션명].apps.[클래스명]
- 어플리케이션을 생성하면, 어플리케이션을 생성했다는 것을 django 에게 알려서 등록을 해야함. 앱의 정보는 apps.py (pages 라는 어플명의 폴더 안에 위치)에 저장되어있으며, 해당 파일 안의 클래스 명인 Pages.Config를 settings.py에 등록해아함.
#apps.py
from django.apps import AppConfig
class PagesConfig(AppConfig):
name = 'pages'
#settings.py의 33rd line
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
#추가
'pages.apps.PagesConfig',
]
#settings.py의 107~109th line
#변경전
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
#변경후
LANGUAGE_CODE = 'ko-kr'
TIME_ZONE = 'Asia/Seoul'
- 어플리케이션 폴더(예. pages) 내 파일 종류
파일종류 |
내용 |
__init__.py |
인트로라는 폴더가 하나의 패키지로 인식됨. intro.urls intro.settings 와 같은 기능을 사용 할 수 있음. 파이썬 파일을 불러오기 위해서는 __init___ 파일이 필요함. |
apps.py |
만든 어플리케이션의 정보가 담긴 파일 |
models.py |
DB 관련된 코드를 작성하는 곳. 어플리케이션(예; pages)에서 사용할 DB를 정의함. 어떠한 데이터베이스 테이블을 만들건지 등을 정의하는 곳. |
tests.py |
작성한 코드가 잘 동작하는지? 테스트하는곳. 테스트를 해주는 코드가 또 있음. 코드를 테스트하는 코드 (코드를 테스트하는 코드가 되려 더 많아질수도있음 - 주객전도) |
views.py |
어떠한 요청이 들어왔을 때, 무엇을 실행할건지? 우리가 보게될 페이지를 만드는 곳? 페이지들이 모여있는 곳임. |
4. templates 폴더 생성
- 사용자가 보는 화면에 해당 하는 html 파일을 어플리켓이션 내에 templates 라는 폴더내에 저장시킨다.
Django 기본 설정 명령어 정리
명령어 |
정의 |
pyenv virtualenv 3.6.7 [가상환경 명] |
가상환경 생성 |
pyenv local [가상환경 명] |
가상환경으로 설정 |
pip install django |
장고 설치 |
django-admin startproject [프로젝트이름] . |
프로젝트 생성(현재 폴더 내) |
python manage.py startapp [앱이름] |
어플리케이션 생성 |
python manage.py runserver $IP:$PORT |
서버 실행 |
10 Feb 2019
|
Git
brach 소개
- 파일을 용도에 따라 나누고, 다시 합치는 경우는 매우 까다로우나 git을 사용하면 훨씬 쉽고 세련되게 관리를 할 수 있음.
- 작업을 진행하다 분기되는 현상 : branch를 만든다
- 위의 예시의 경우, 기존의 branch + 분기된 branch; 총2개의 branch를 갖게됨.
- branch의 개념은 위험하며 어렵고, 용량이 많이 차지하여 타 프로그램에서 사용되어 오지 않았으나, git은 이 기능을 쓸만한 수준까지 올렸다는 것임.
brach 만들기
#master: 현재 master 이라는 branch 를 사용하고 있다는 의미
해리@DESKTOP-8D71JEB MINGW64 ~/gitfth (master)
git branch
: 브랜치의 목록을 표시
git branch "새로운 브랜치 명"
: 브랜치 생성
git branch -d "브랜치 명"
: 브랜치 삭제
git branch -D "브랜치 명"
: 병합하지 않은 브랜치를 강제 삭제
git checkout "전환하려는 브랜치 명"
: 브랜치를 전환(체크아웃)
브랜치를 전환하면, 파일이 현재 어느 브랜치에 속해 있느냐에 따라 내용이 완전히 달라짐
브랜치 사용의 대표적 예시:
원래 소스코드는 그래로 두면서, 고객을 위한 customizing에 해당하는 기능을 추가해야할 경우
branch 정보확인
branch를 만들면 상당히 복잡해지고 어려워 지는데, 이는 효용에 대한 댓가라고 생각함.
branch룰 만들었을 때, 현재 어떠한 상황인지 판단 할 수 있도록 여러가지 방법을 살펴보자
git log "비교할 브랜치명1".."비교할 브랜치명2"
: 브랜치간에 비교
git log --branches --decorate
: 좀 더 상세히 브랜치간 비교
- exp branch의 최신 commit: “4”
- master brancch의 최신 commit: “6”
- HEAD: 현재 checkout 된 branch를 나타냄 (현재 checkout된 branch는 master)
$ git log --branches --decorate
commit 9b64d819b11d9dee601c5961f8172a592f5df9fa (HEAD -> master)
Author: Harry Lee <tothefullest08@gmail.com>
Date: Sun Feb 10 21:21:49 2019 +0900
6
commit 920d9826fcbe1556688e28247fe522a686607309 (exp)
Author: Harry Lee <tothefullest08@gmail.com>
Date: Sun Feb 10 21:05:25 2019 +0900
4
commit df422af85c3b6b17e190faaa77053b93247bced6
Author: Harry Lee <tothefullest08@gmail.com>
Date: Sun Feb 10 21:02:34 2019 +0900
3
commit ee6abf9bba1718690cd7968079c59467a6c753d3
Author: Harry Lee <tothefullest08@gmail.com>
Date: Sun Feb 10 20:54:29 2019 +0900
2
commit e4ba2b0b61cd8296d046ab19164e97844182c6a7
Author: Harry Lee <tothefullest08@gmail.com>
Date: Sun Feb 10 20:53:50 2019 +0900
1
git log --branches --decorate --graph
: 로그에 모든 브랜치를 표시 + 그래프 + 브랜치명
$ git log --branches --decorate --graph
* commit 9b64d819b11d9dee601c5961f8172a592f5df9fa (HEAD -> master)
| Author: Harry Lee <tothefullest08@gmail.com>
| Date: Sun Feb 10 21:21:49 2019 +0900
|
| 6
|
| * commit 920d9826fcbe1556688e28247fe522a686607309 (exp)
| | Author: Harry Lee <tothefullest08@gmail.com>
| | Date: Sun Feb 10 21:05:25 2019 +0900
| |
| | 4
| |
| * commit df422af85c3b6b17e190faaa77053b93247bced6
|/ Author: Harry Lee <tothefullest08@gmail.com>
| Date: Sun Feb 10 21:02:34 2019 +0900
|
| 3
|
* commit ee6abf9bba1718690cd7968079c59467a6c753d3
| Author: Harry Lee <tothefullest08@gmail.com>
| Date: Sun Feb 10 20:54:29 2019 +0900
|
| 2
|
* commit e4ba2b0b61cd8296d046ab19164e97844182c6a7
Author: Harry Lee <tothefullest08@gmail.com>
Date: Sun Feb 10 20:53:50 2019 +0900
1
git log --branches --decorate --graph
: 한줄로 요약하여 현상태를 표시함
$ git log --branches --decorate --graph --oneline
* 9b64d81 (HEAD -> master) 6
| * 920d982 (exp) 4
| * df422af 3
|/
* ee6abf9 2
* e4ba2b0 1
git log "브랜치명1".."브랜치명2"
: 브랜치명 사이의 로그를 비교
git log -p "브랜치명1".."브랜치명2"
: 브랜치명 사이의 로그 + 소스코드까지 비교
#exp branch에는 없고, master branch에 있는 로그 표시
해리@DESKTOP-8D71JEB MINGW64 ~/gitfth (master)
$ git log exp..master
commit 9b64d819b11d9dee601c5961f8172a592f5df9fa (HEAD -> master)
Author: Harry Lee <tothefullest08@gmail.com>
Date: Sun Feb 10 21:21:49 2019 +0900
6
#exp branch에는 없고 master branch에 있는 로그 + 소스코드 표시
$ git log -p exp..master
commit 9b64d819b11d9dee601c5961f8172a592f5df9fa (HEAD -> master)
Author: Harry Lee <tothefullest08@gmail.com>
Date: Sun Feb 10 21:21:49 2019 +0900
6
diff --git a/f3.txt b/f3.txt
new file mode 100644
index 0000000..442406a
--- /dev/null
+++ b/f3.txt
@@ -0,0 +1,2 @@
+a
+
#master branch에는 없고, exp branch에 있는 로그 표시
해리@DESKTOP-8D71JEB MINGW64 ~/gitfth (master)
$ git log master..exp
commit 920d9826fcbe1556688e28247fe522a686607309 (exp)
Author: Harry Lee <tothefullest08@gmail.com>
Date: Sun Feb 10 21:05:25 2019 +0900
4
commit df422af85c3b6b17e190faaa77053b93247bced6
Author: Harry Lee <tothefullest08@gmail.com>
Date: Sun Feb 10 21:02:34 2019 +0900
3
git diff "브랜치명1".."브랜치명2"
각 branch의 현재 상태를 비교
$ git diff master..exp
diff --git a/f1.txt b/f1.txt
index 422c2b7..de98044 100644
--- a/f1.txt #master branch
+++ b/f1.txt #exp branch
@@ -1,2 +1,3 @@
a
b
+c #exp brancch의 경우, C 라는 내용이 추가되어있음을 의미