hello world
Django 스터디
조현호 고우석 김재윤 이정현
매주 월요일 오후 9시
- working directory: 현재 작업 중이 프로젝트가 위치한 디렉토리
- Staging: commit 할 파일의 예비 저장소
- Local Repository: 각 컴퓨터의 git이 관리하는 로컬 저장소
- Remote Repository: 외부에 위치한 원격 저장소
- 나의 프로젝트가 위치하 곳으로 이동 후 터미널에서 명령 실행
- git init: 현재 디렉토리에서 git을 사용할 수 있도록 초기화
- .git 디렉토리: Staging, Local Repository가 들어있음
- .gitignore: 같은 위치에 있는 파일을 git에서 무시 ex) 데이터베이스 계정, 클라우드 시크릿 키, 각종 민감 정보
- git status: git 상태를 확인하기 위한 명령어
- on branch main: 현재 main 브랜치에 있음
- No commits yet: 아직 commit한 파일이 없음
- untracked files: 버전을 아직 한 번도 관리하지 않은 파일
- git add <file>: working directory -> staging
- git add . : working directory에 있는 모든 파일을 staging에 이동
- git commit -m " " : staging -> local repository
- git log: 저장소에 저장된 버전을 확인할 때 사용
- git pull origin main : 원격 저장소에서 commit을 pull할 때 사용하는 명령어
- git commit -am " " : staging과 commit을 한 번에 처리, 한 번이라도 commit한 적이 있는 파일을 다시 커밋할 때만 사용 가능
- git remote add origin <원격저장소의 주소> : 원격 저장소에 origin(github 저장소 주소)을 추가하겠다고 git에게 알려 주는 명령어
ex) git remote add origin https://github.com/LEEJH1029/Django1.git
- git push -u origin <브랜치명> : 지역 저장소의 브랜치를 origin의 브랜치로 push하라는 명령어
- -u: 지역 저장소의 브랜치를 원격 저장소의 브랜치에 연결하기 위한 옵션. 처음 한 번만 사용하면 됨
ex) git push -u origin main
- git clone <원격저장소의 주소> : 원격 저장소 -> 지역 저장소 복제
ex) git clone https://github.com/Likelion-Kwangwoon/Django1.git
- git checkout -b <브랜치명> : branch를 새로 만들고 해당 branch로 이동
- git checkout <브랜치명> : <브랜치명>으로 이동
- git merge <브랜치명> : 현재 있는 branch로 <브랜치명>을 병합
- git branch <브랜치명> : branch 생성
- git switch <브랜치명> : <브랜치명>으로 이동
- 변수 선언
- greeting = “Hello World”
- 주의 사항
- 변수 사이에 공백 허용되지 않음
- 단어 사이는 _ 로 연결
- 문자열은 숫자/특수문자로 시작이 불가
- 예약어 변수로 선언 불가
- 가급적 소문자 사용
문자열
- upper, lower, strip 함수
- removeprefix 함수 : 특정 문자열 변수에서 없애고 싶은 부분을 지울 수 있음
- replace 함수 : replace(”A”, “B”)를 통해 A를 B로 변경할 수 있음
- f string : 변수와 문자열을 혼합해서 사용하기 위함
- Ex) print(f”{변수})
숫자
- 정수, 실수 기억할 것
- +, -, *, / 와 같이 사칙 연산 가능
- 문자열 - 숫자 간 변환 기억할 것
- str(), int(), float()
논리형
- True, False
명령 프롬프트
- text = input(”설치 진행하겠습니까 ? ”)
조건문
- If 문
반복문
- for 문
- while 문
*선언
list=[] 숫자,문자형 상관없음 (자료형 신경 쓸 필요가 없음)
lst=[]
*추가 , 리스트 맨 뒤에 추가
lst.append(value)
*추가 2,원하는 위치에 삽입
lst.insert(index,value)
*제거(데이터 삭제)
del lst[index]
*제거 2(데이터 삭제 ~> 반환)
index를 넣는 경우도 있지만 잘 사용 x
lst.pop(index)
*제거 3(리스트에서 직접 값을 찾아서 삭제)
lst.remove(value)
*정렬 (c++ 정렬과 동일)(원본이 정렬됨)
lst.sort()
*정렬2(원본은 유지한 채 정렬된 새로운 리스트 만들고 싶을 때)
new=sorted(lst)
*역순정렬
lst.sort(reverse=True)
*슬라이싱(리스트 함수 중 제일 중요하다고 생각함) (start<= <end,jump는 몇 칸씩 이동할지)
lst[start:end:jump]
(0<= <4)
lst[:4]
(1<= <=end)
lst[1:]
(리스트 제일 뒤에서 하나 출력도 가능)
lst[-1]
(역순으로도 필요한 만큼 출력도 가능)
3번 인덱스 부터 0번 인덱스까지 역순으로(3,2,1,0)
lst[3::-1]
-
[deep copy,shallow copy] (https://wikidocs.net/16038)
-
반복문
for i in lst:
print(i) #기본이 출력후 줄바꿈
- 최대,최소,합
max(lst)
min(lst)
sum(lst)
- 선언
tup=()
- 리스트로 변환법
list(tup)
- 함수
tuple(lst).index(5)#튜플 안에 5 값을 찾아서 그 인덱스를 반환
tuple(lst).count(2)#lst안에 값이 몇 개 있는 지 출력
- 선언
student={'student num':'12345','major':'CS'}
student['major']#'CS' 출력
- 추가
student['성적']=4.0 # {'student num': '12345', 'major': 'CS', '성적': 4.0}
- 수정
student[value]=new value
- 삭제
del student[value]#키값을 찾아서 key:values 모두 삭제
- 함수
student.get('student num')#key 를 넣으면 value'12345' 출력
a = {'name': 'pey', 'phone': '010-9999-1234', 'birth': '1118'}
a.keys()#출력 dict_keys(['name', 'phone', 'birth'])
a.values()#dict_values(['pey', '010-9999-1234', '1118'])
a.items()#dict_items([('name', 'pey'), ('phone', '010-9999-1234'), ('birth', '1118')])
a.clear()# 딕셔너리 안에 있는 모든 값 삭제
- 딕셔너리에서의 반복문
for key,value in student.items():#key값과 value 모두 출력됨
print(key,value)
for i in student:#key 값만 출력됨
print(i)
class 클래스명: // 클래스명 첫글자는 대문자로 작성
def __init__(self, 속성1, 속성2): // self를 첫번째 인자로 하지 않으면 문제가 발생
self.속성1 = 속성1 // 초기화 과정
self.속성2 = 속성2 // 초기화 과정
def 함수명1(self, 매개변수):
class Student:
def __init__(self, name, major, is_graduated):
self.name = name
self.major = major
self.is_graduated = is_graduated
# Method: 클래스 안에 구현된 함수
def study(self):
print(f'{self.name} 학생은 공부중입니다.')
# 인스턴스 생성
student_1 = Student('kwu', '소프트웨어학부', False)
# 각 속성 출력
print(student_1.name)
# 메소드 출력
student_1.study()
class Student:
def __init__(self, name, major):
self.name = name
self.major = major
self.is_graduated = False
# Method: 클래스 안에 구현된 함수
def study(self):
print(f'{self.name} 학생은 공부중입니다.')
def edit_major(self, new_major):
self.major = new_major
# 인스턴스 생성
student_1 = Student('kwu1', '소프트웨어학부')
print(student_1.is_graduated)
# 인스턴스 속성을 수정. 직접적인 수정은 좋지 않은 방법 -> 함수를 만들어서 수정하는 것이 좋음
student_1.major = '전자공학과'
class 클래스 이름(상속할 클래스 이름)
- 부모 클래스의 임시적인 객체를 반환하여 부모 클래스의 메소드를 사용할 수 있게 해주는 함수
- 부모 클래스 정의한 내용을 가져옴
- super().init(): 자식 클래스에도 부모 클래스의 인스턴스 속성과 동일한 속성이 생성
class ForeignStudent(Student):
def __init__(self, name, major, country):
super().__init__(name, major)
self.country = country
foreign_student_1 = ForeignStudent('kw', '국어국문학과', '미국')
- 부모 클래스에 있는 메소드를 동일한 이름으로 다시 만드는 것
- 부모 클래스의 메소드 대신 오버라이딩한 메소드가 호출된다.
class ForeignStudent(Student):
def __init__(self, name, major, country):
super().__init__(name, major)
self.country = country
def study(self):
print(f'{self.name} is studying.')
# 다른 파일에 있는 특정 클래스를 사용하고 싶을 때
import classes from Student, ForeignStudent
# 다른 파일에 있는 모든 클래스를 사용하고 싶을 때
import classes from *
파이썬에는 FileNotFoundError, ZeroDivisionError, IndexError 등등 기본적으로 내장 예외들이 있음
- ValueError: 부적절한 값을 가진 인자를 받았을 때 발생
- IndexError: 인덱스 범위를 벗어나는 경우에 발생
- SyntaxError: 파이썬 문법 오류가 발생하는 경우
- NameError: 지역변수, 전역 변수 이름을 찾을 수 없는 경우
- ZeroDivisionError: 0으로 나누려는 경우에 발생
- FileNotFoundError: 파일이나 디렉토리에 접근하려 할 때, 해당 파일이나 디렉토리가 없는 경우 발생
- TypeError: 잘못된 타입을 전달했을 때 발생
- AttributeError: 클래스(모듈)의 객체에 해당하는 메서드나 속성을 잘못 호출하거나 대입했을 때 발생
- KeyError: 딕셔너리에서 접근하려는 키 값이 없을 때 발생
- OverFlowError: 오버플로우가 발생하는 경우
# 실행할 코드
try:
...
# 에러가 발생하였을 때 실행할 코드
# 발생 오류 종류: FileNotFoundError, ZeroDivisionError, IndexError, ...
except [발생 오류[as 오류 메시지 변수]]:
...
# 에러가 발생하지 않았을 때 실행할 코드
else:
...
- finally 절은 try문 수행 도중에 예외 발생 여부에 상관없이 항상 수행된다.
- 보통 finally 절은 사용한 리소스를 close해야 할 때에 많이 사용
f = open('test.txt', 'w')
try:
...
finally:
f.close()
# try문을 수행한 후 예외 발생 여부와 상관없이 f.close()로 열린 파일을 닫는다.
try:
...
except 발생 오류 1:
...
except 발생 오류 2:
...
- 프로그램이 작동하다가 의도하지 않게 돌아가는 것을 방지하기 위해 사용
try:
a = int(input("1~5 까지 숫자 입력 : "))
if a < 1 or a > 5:
raise
print("a")
except:
print("에러 발생")
raise 발생 오류
raise Exception("에러 메시지")
파일 열기 모드: 'r', 'w', 'x'
f = open("파일 이름", '파일 열기 모드', [encoding = '인코딩 방식'])
# 파일을 더이상 사용하지 않으면 닫아주어야함
f.close()
with: 파일을 열고 닫는 것을 자동으로 처리해준다
with open("파일 이름", '파일 열기 모드') as 파일의 별칭:
수행할 작업
f = open("test.txt", 'r', encoding = 'UTF-8')
# read(): 파일의 전체 내용을 리턴
print(f.read())
# readline(): 개행 문자 전까지만 파일의 내용을 리턴
print(f.readline())
# readlines(): 파일의 모든 줄을 읽어서 각각의 줄을 요소로 갖는 리스트를 리턴
print(f.readlines())
f.close()
# 'w'는 기존에 파일에 있던 내용을 전부 삭제하고 새로 씀
f = open("test.txt", 'w', encoding = 'UTF-8')
f.write("Hello")
f.close()
# 'a'는 기존에 파일에 있던 내용에 이어서 작성(append)
f = open("test.txt", 'a', encoding = 'UTF-8')
f.write("Hello")
f.close()
- 서버는 사용자의 요청을 처리하면서 브라우저에 응답을 한다.
- 소프트웨어 개발을 위한 기능, 구조의 틀을 제공
- 시스템 흐름을 프레임워크가 제어함
- ex) Django, Spring, Android
- 특정 기능을 모아둔 코드, 함수들의 집합이며 코드 작성 시 활용 가능한 도구
- 시스템 흐름을 개발자가 제어함
- ex) C++ → STL, Python → Tensorflow, Pandas
- 앱(App)이란 장고 프로젝트 구성하는 모듈을 의미함
- 하나의 프로젝트 안에 여러 개의 앱
- 장고 프로젝트 관점에서 관련된 기능을 모아둔 파이썬 파일
- 앱 이름은 영문 복수형으로 생성
- 목적 기능에 따라 분리: 사용자 앱, 블로그 앱, 인증 앱
- ORM(Object-Relational Mapping)
- 객체지향 언어와 관계형 데이터베이스를 연결해주는 기술
- ex) Models, QuerySet API
- Templates
- 자체 템플릿 시스템으로 디자인과 로직을 분리하여 독립적 개발 가능
- 파이썬 코드를 HTML 코드로 바꿔줌
- HTML 파일을 분리하여 재사용, 체계적으로 관리할 수 있음
- HTML 파일에 include, if, for 등 템플릿 언어를 사용 가능
- Forms
- 입력받은 데이터의 유효성 검사
- 구성하고자 하는 형태 렌더링(HTML 태그 생성)
- 제출하는 폼 데이터의 변경 확인
- Authentication
- 시스템 인증과 권한부여 기본 제공
- 구성 요소: 사용자, 권한, 그룹
- Admin
- 관리자 인터페이스 제공
- 등록된 모델의 기본적인 조회, 추가, 수정, 삭제 기능 제공
- 사용자 관리, 사용자 그룹 관리, 사용자 별 권한 기능 제공
- Internationalization
- 동일한 소스코드로 텍스트의 번역, 날짜/시간/숫자의 포맷, 타임존의 지정 등 같은 다국어 환경 제공
- 개발자와 템플릿 작성자는 언어 및 문화에 맞게 번역하거나 형식 지정 가능
- 특정 사용자의 기본 설정에 따라 웹 앱을 현지화화
- Security
- 보안사항 기능 제공
- CSRF(교차 사이트 요청 위조) 보호
- SQL 주입 보호
- SSL/HTTPS
- 세션 보안
- 보안사항 기능 제공
- Model
- 데이터 관리
- 데이터베이스와 연결 및 실행
- Template
- 데이터 출력 역할
- 사용자에게 표현 방식 정의
- View
- 컨트롤러 역할
- 비즈니스 로직을 처리
- GET
- 데이터를 URL의 쿼리스트링에 포함하여 보낸다.
- 주로 데이터를 요청하는 용도로 사용되며, 요청 URL에 데이터가 노출되므로 보안에 취약할 수 있다.
- 캐시를 이용하여 요청을 빠르게 처리할 수 있어서, 빈번하게 요청되는 데이터에 적합하다.
- ex) www.naver.com?id=abcdef&pass=1234
- POST
- 데이터를 요청 본문에 담아 보내며, 데이터의 양이 많거나 민감한 정보를 전송할 때 사용된다.
- URL에 데이터가 노출되지 않으므로, 보안성이 높다.
- 요청마다 새로운 데이터를 서버로 전송하므로, 요청에 따라 더 많은 자원을 소비한다.
- 프로젝트안에 여러 앱으로 구성 됨(앱은 프로젝트를 구성하는 모듈을 의미)
- mtv 패턴: 자바의 mvc패턴과 유사하나 이름만 조금 변경된 느낌 model- view -controller(java)==model-template-view(python)
- Model - 데이터 관리 Template - 데이터 출력 역할 View- 컨트롤러 역할
-
생성: django-admin startproject mytestsite ( django-admin startproject 프로젝트명) config.이 default
-
가상환경에 설정하는 이유: global dependancy는 좋지 않은 방식이므로 이를 막기 위해서
-
실행:
python manage.py runserver **서버를 실행하려면 생성한 프로젝트(mytestsite)로 이동한 후 실행
ex) cd mytestsite - python manage.py runserver
- django-admin startapp (이름)
setting.py에 항상 새롭게 추가된 앱을 추가 해줘야됨
- 새로 만든 앱에 'templates' 폴더 생성
- GET- read
서버에게 Resource를 보내도록 요청하는데 사용 (서버의 Resource를 읽음)
- PUT- create
서버에 문서를 쓸때 사용 (GET과 반대)
- POST- update
Server에 Input Data를 보내기 위함 (HTML form에 많이 사용)
- DELETE- delete
요청 Resource를 삭제하도록 요청
- config - settings.py 분리
- https://docs.djangoproject.com/ko/4.2/howto/deployment/
DEBUG = False
SERCRET_KEY
: 키 값을 공개하면 안됨init.py
: 파이썬 패키지로 인식하기 위한 파일base.py
: 운영환경과 상관없이 바뀌지 않는 부분- BASE_DIR = Path(file).resolve().parent.parent.parent
development.py
: 개발환경. 서버- DEBUG. ALLOWED_HOSTS. DATABASES. STATIC_ROOT
local.py
: 작업하는 환경- DEBUG. ALLOWED_HOSTS. INSTALLED_APPS. DATABASES. STATICFILES_DIRS
production.py
: 운영 환경- DEBUG. ALLOWED_HOSTS. DATABASES. STATICFILES_DIRS
INSTALLED_APPS
: django 앱과 사용자 앱 분리- 설치해야하는 패키지들을
requirements
에 저장- pip freeze > requirements.txt
- pip install -r requirements.txt
- CentOS 웹 서버 생성: https://itadventure.tistory.com/372
- ubuntu 웹 서버 생성: https://king-ja.tistory.com/99
- pyenv 설치: https://jinmay.github.io/2019/03/16/linux/ubuntu-install-pyenv-1/
- AWS에 gunicorn 연결: https://velog.io/@han0707/AWS를-이용해-배포하기