화요일(01.13)
Python Before Django(PBD) -피바다 by 김종혁 선배님
ipynb파일 참고할것.
-f-string 포맷팅의 혁명
f’{name:^10s}’ 네임을 스트링 10칸짜리 가운데정렬(^)로 넣겠다는말
포맷팅 방법은 신방식(f-string), 구방식(%s, format)하나로 통일할것… 웬만하면 신방식으로.
-comprehension
리스트 안에서 반복하고 바로 출력해버리는 형식이 제일 좋다. 웬만하면 컴프리헨션 쓰자.
enumerate(시퀀스) 함수 -> 인덱스와 요소를 같이 반환한다.
튜플이 리스트보다 메모리상에서 이점이 있기 때문에 아예 바꾸지 않을 리스트면 튜플로 만들어주는게 좋다.
-conditional statement 조건문
if elif로 길게 늘일수도 있지만 단순한 입력이 스위치 케이스가 많을 경우 딕셔너리로 분기하는게 좋다.
meal_dic3 = {0: ‘짜장’, 1: ‘짬뽕’, 2: ‘볶음밥’, 3: ‘잡채밥’}
-*args 와 *kwargs
*args가 *kwargs보다 강하므로 값 설정이 두번 되어있을경우 *args가 *kwargs를 먹어버린다.
애스터리스크가 한개일 때는 이랬는데 애스터리스크가 두개일 때는 **kwargs 내의 키워드 인자들을 딕셔너리로 묶는다.
args와 kwargs는 언제봐도 헷갈린다. 프로젝트 들어가기 전에 한번 파이썬 특성에 정리해두고 가는게 좋겠다.
-dict_keys, dict_values의 타입
dictionery에서 keys나 values나 items를 반환했을때 타입을 확인해보면 list가 아니다.
dict_keys, dict_values라는 타입이 따로 있다.
items는 튜플 타입이다.
-내장 함수의 사용
enumerate(시퀀스) : 시퀀스를 받아서 인덱스와 요소를 함께 반환하므로, 회원 리스트 관리같은 것에 편하다.
filter(함수, 시퀀스) :시퀀스의 요소중 함수에 대한 반환값이 참인것만 돌려주는 함수.
map/filter : 맵객체나 필터객체를 반환하므로 바로 리스트로 사용할 수 없다. list(map()), list(filter())식으로 반환값을 리스트로 바꾸어 주면 리스트로 사용할 수 있다.
lambda는 필터/맵과 궁합이 좋아서 같이쓰면 편하다. 근데 너무 길게 늘여쓰면 가독성을 해쳐서… 쉽고 확실한 로직의 함수를 람다로 대체하여 사용할 것.
zip (*시퀀스) : 시퀀스 객체 n개의 요소들을 인덱스별로 묶어서 튜플로 만들어준다. 단, 개수가 맞아야한다. 개수가 틀리면 각 시퀀스중 가장 작은 길이의 시퀀스 길이 기준으로 튜플을 만들어준다.
dir(객체) : 객체 내의 변수/함수를 전부 보여준다. 모듈을 불러올 때 모듈 내의 메소드가 뭐있는지 까먹었을 때 확인해보려고 사용하기 좋다.
-예외처리문의 사용 생활화
예외의 이름을 명시해서 각 예외를 다 잡아주는것이 좋다.
try except else finally의 구조를 자주 사용하는 것을 습관화하자.
-circular import
각 모듈들이 서로 상대방을 import할수는 없다.
서로 임포트하면 초반 참조할 때 무한루프를 돌기때문에… 서로 꼬이지 않도록 참조 순서를 잘 지정해야한다.
-random 모듈의 randint, randrange차이
randrange (시작수, 끝수) : 시작수 이상 끝수 미만 (시작수 <= 범위 < 끝수)
randint(시작수, 끝수) : 시작수 이상 끝수 이하 (시작수 <= 범위 <= 끝수)
random.choice(시퀀스) : 시퀀스 객체에서 랜덤으로 하나를 뽑아준다.
-datetime 모듈
time, date, datetime, timedelta <— 4개를 가장 많이 사용한다.
-유용한 모듈 정리
uuid : 미디어 파일들의 난수 이름을 정할때 사용하는 모듈
arrow : datetime 모듈처럼 시간을 다루는 모듈인데 더 깔끔하다고한다.
re - 정규표현식
os/sys - 크게 필요는 없다(웹개발에)
pilkit/Pillow - 장고 서버단에서 이미지 자료 처리할때 사용한다. (강의에 나온다)
가상환경 그리고 settings.py by 이재원 선배님
-Virtual Environment (가상환경)
수업 참조
-Django의 개념
브라우저(user)가 request를 보내면, 서버에서 그에 맞는 response를 보내준다.
이때 request를 날리는 주소는 URL(Uniform Resource Locator). 해당 위치에 접속하면 response를 주도록 설정되어 있는 것이다.
URL은 HTML,CSS,PNG,JAVASCRIPT 파일 등의 주소를 이야기하는 것이고, 이 URL에 대해 들어온 요청에 response로 컨텐츠를 전송함.
-MTV(MVC) Pattern
Model - Template(View) - View(Controller)
써야되는 이유 : request에 대한 response를 더 효율적으로 던져줄 수 있기 때문에.
Model : DB와 연결되어있는 클래스. (백엔드쪽)
Template : HTML과 CSS를 작성하는곳 (프론트엔드쪽)
View : Response를 던져주는 곳. 사실 M이나 T없이도 View만으로 페이지를 만들 수 있기는 함. 안이뻐서 그렇지… 가장 중요한 요소.
URLConf : 라우팅과 비슷한 용어로 들어온 리퀘스트를 올바른 주소(URL)로 보내주는 중간거점들
리퀘스트를 보내면 URLConf를 거쳐 view로 도달하고 view에서 model과 template을 이용해 리스폰스를 응답해줌.
-settings.py (전반적인 기본설정파일)
DEBUG : 배포할땐 False로 바꾸어줌
ROOT_URLCONF : 열 수 있는 URL페이지들을 모아놓은 리스트 파일 urls.py를 참조함
TEMPLATES : 각 템플릿에 대한 설정
WSGI_APPLICATION : 리퀘스트를 웹서버가 받아서 WSGI로 전달해줌( 배포 할 때 아니면 쓸 일 없음)
DATABASES : 지금 연결되어있는 DB를 보여준다
-request
request는 사용자가 날린 객체로, 요청에 필요한 정보들을 가지고 있는 객체이다.
이 request객체를 받아서 view는 알맞은 response를 날려준다.
-template과 model
template을 사용하는 진가는 model(DB)을 사용할때 나온다.
model의 수많은 내용들에 맞춰서 다 화면을 만들수는 없으므로, 템플릿에 context를 담아줄 틀을 만들어놓고 model에 있는 정보들을 가져와 템플릿에 얹음으로써 정보를 표시한다.
-render과 httpresponse
httpresponse는 그냥 아주 간단한 리스폰스만 가능하다.
render는 템플릿과 모델을 뷰에서 조합하여 주기 위해 사용하는 함수.(기반은 httpresponse로 되어있다)
뷰에서 모델(ex-post)를 받아오고
템플릿에 html에서 템플릿언어으로 모델의 내용을 표시할 수 있게 바꾸어준다 ex - {{post.title}}
목요일 (01.16)
HTTP, MVC패턴 by 김창회 선배님
-서버사이드와 클라이언트사이드의 기준은 상대적이다.
ex) 날씨api를 기상청에서 받아와 뿌리는 웹 서비스가 있다면 —> 기상청 : 서버 사이드, 웹서비스 : 클라이언트 사이드 이지만 웹서비스 : 서버사이드이면서 유저들이 클라이언트 사이드이기도 하다.
-DNS
생활 코딩의 DNS부분을 참조하자.(https://opentutorials.org/course/3276/20303)
-HTTP
사용자가 request를 요청하는 방식을 정해놓은 규약. 참고(https://ko.wikipedia.org/wiki/HTTP)
request->HTTP패킷이 전송이 되면 그냥 평문(string)으로 오지만, 그 평문을 구석구석 뜯어보면
header : method종류, 리소스요청(사이트의 컨텐츠-즉, html등의 파일-를 요구하는것), 메타 데이터(Content_Length, Content_Type등)가 찍힌다. 요청 그 자체에 대한 정보를 담고있다.
body : HTML에서 form 태그에 input을 넣듯이, 사용자가 입력하는 값. 즉, 요청이 전송하는 정보를 담고있다. 따라서 요청하는 정보가 없으면 body는 비어있다.
-주의해 둘 4가지 메서드
GET(일반적으로 주소창(URL)에 찍어서 요청하는것), POST, DELETE, PUT
GET : 요청에 body를 넣을 수 없기때문에 URL에 request정보(민감한 ID,PASSWORD등도)를 넣어 전송할 수 밖에 없음. 탈취가 쉬워서 보안에 취약.
POST : GET 방식과 달리 데이터 전송을 목적으로 한 요청방식으로, 사용자가 데이터를 입력한 것을 전송해줘야하기 때문에 body파트를 사용한다. body부분에 정보가 있으므로 URL에 정보가 찍히지 않아 GET방식보다는 보안적으로 낫다. 그러나 "GET 방식에 비해" 나을 뿐이지, 두 방식 모두 데이터를 클라이언트측에서 볼 수 있다는 점은 같으므로 암호화가 요구된다.
DELETE와 PUT 메서드는 자주사용하는 4가지 메서드중 하나로 꼽으셨는데, 구글링해보니 실제로는 GET POST를 제외한 대부분의 메서드들을 잘 사용할 일이 없다고 한다. DELETE는 정보 삭제를 요청, PUT은 정보의 업데이트를 요청하는 메서드라는데 왜 그런지는 더 알아봐야 할 것 같다.
-request객체 :사용자가 서버에 무엇을 요청하는지에 대한 정보들을 담아놓은 객체
-MTV(MVC)패턴에 따른 장고 웹개발의 과정
- URL mapping ( 앱으로 URL을 연결하든지, View로 바로 연결하든지… path지정)
- T와 M을 조합해서 response를 보내는 로직을 만듬 (이 과정에서 request 메서드에 따라 view를 지정하든지 index같은 내부 변수값에 따라 다른페이지로 redirect 시키든지)
- View에서 render할 Template, Model 구축
토요일 (01.18)
모델 사용법 by 손준혁 선배님
수업내용
Class Article을 가지고 list(CREATE), detail(READ),delete(DELETE),update(UPDATE)까지 해보기.
migrate를 이용해 DB에 정보 반영시키기.
admin.site.register로 앱 내의 모델 admin페이지에 나오게 하기.
python shell에서 모델 객체 생성 후 save()로 객체 저장하기.
Django CRUD by 김수빈 선배님
C reate
R etrive(Read)
U pdate
D estroy(Delete)
CRUD : 기본적인 데이터 처리 기능인 Create(생성), Read(읽기), Update(갱신), Delete(삭제)를 묶어서 일컫는 말이다.
DB를 다루기 위한 기초적 4가지 용법이므로, 해당 4가지 기능을 구현해보자.
verbose_name, help_text : admin페이지에서 필드에 대한 설명이 나오게 한다.
ImageField : Pillow를 설치해야하는 필드로, 이미지 파일을 업로드할 수 있는 필드이다.
굳이 template안에 앱이름 폴더 다시 만드는 이유
다른 앱에서 똑같은 이름의 html만들면 같은이름이라 충돌난다. 그래서 앱이름 안에 넣어서 경로 명시시켜주는것.
template을 탐색하는 django의 로더에는 파일 시스템 로더와 앱 디렉토리 로더가 있다.
파일 시스템 로더 : settings의 기본 템플릿 디렉토리에서 여러앱에서 사용할 템플릿을 탐색해준다.
앱 디렉토리 로더 : APP내에 있는 템플릿 디렉토리에서 템플릿을 탐색해준다.
이 중 우선순위는 파일 시스템 로더가 높다. 따라서 기본 템플릿 디렉토리와 APP내의 템플릿 디렉토리에 같은 이름의 파일(ex-index.html)이 존재한다면 우선순위의 기본템플릿 디렉토리내의 index.html만 적용된다. 이런 충돌을 방지하기 위해서 앱 내의 템플릿들은 앱 네임을 가진 폴더 아래에 넣어 경로를 명확히 명시해주는것이다.
render (request, template, dictionary(context))
리퀘스트에 대하여 템플릿의 형식 내에 있는 파이썬 코드들을 dictionary에 있는 내용으로 치환시켜 내보내겠다
redirect( url path함수 이름, 인자)
해당 path로 url을 옮겨주는데, 만약 해당 url에 인자가 필요하면 인자를 집어넣어서 페이지를 보여준다.
django queryset API
https://docs.djangoproject.com/en/3.0/ref/models/querysets/#field-lookups
in과 contain 차이 알아보기.
contains : 문자열 내에서 특정 문자열을 검색하고 싶을 때 사용한다. 단, 대소문자를 구별한다.
icontains : contains와 같으나 대소문자를 구별하지 않는다.
in : iterable객체, 즉 리스트와 튜플, 쿼리셋 따위의 내부에 존재하는 요소들을 가져올 때 사용한다. 문자열에도 사용할 수 있지만 잘 사용하지 않는다. 문자열에 사용할 때에는 contains를 이용해 특정 문자열을 가져와 변수에 할당한 뒤, 해당 변수에서 요소들을 in으로 뽑아내는 방식으로 사용하곤한다.
이번주는 실습 / 강의 따라해보기로 대부분의 수업이 진행되었어서 내용이 많지 않은것같다. 팀플 하면 힘들기야 하겠지만 반성하고 공부할 점이 많이 생기는데, 지금은 너무 공부/지식습득 위주로 되어있어서 실제 구현시에 구멍이 뻥뻥 뚫릴까봐 걱정된다.
'Always Awake > 피로그래밍 12기(19.12.31~20.02.22)' 카테고리의 다른 글
피로그래밍 12기 4주차 활동 정리(20.01.21~20.01.27) (0) | 2020.01.27 |
---|---|
4주차 설 개인과제 - 재고 관리 사이트 만들기 (0) | 2020.01.27 |
피로그래밍 12기 2주차 활동정리(20.01.07~20.01.13) (0) | 2020.01.13 |
2주차 수요일 개인과제 - bootstrap 사용하여 카피하기 (0) | 2020.01.08 |
피로그래밍 12기 1주차 활동 정리 (19.12.31~20.01.06) (0) | 2020.01.06 |
댓글