기술이 발전함에 따라 Python, Java 등 프로그래밍 언어가 발달했다. 그 중 Python을 배우는 이유에 대해 말하려한다. (우리가 앞으로 Python을 이용하여 웹 개발을 할 예정이기 때문에!)
조건문 if, elif, else
if 조건문:
실행할 코드 ( if 조건문이 참일 때)
elif 조건문:
실행할 코드 ( elif 조건문이 참일 때)
else: # 있어도 되고 없어도 된다.
실행할 코드 (모든 if, elif 조건문이 거짓일 때)
반복문 for, while
# 1
for i in range(1000):
print(i) # 0~999까지
# 2
cities = ["seoul", "daejeon", "daegu", "busan"] # 대괄호 []
for city in cities:
print(city) # seoul, daejeon ...
if city == "seoul":
print("")
# 3
for data in datas:
# 1
while 조건문:
실행할 문장
# 2
i=0
while i < 10:
i += 1
# 조건문이 참인 경우에 문장이 반복되서 실행
# continue : 반복되는 문장에서 건너 뛰고 싶을 때
# break : 반복을 멈추고 싶을 때
def 함수명(매개변수):
실행할 문장
함수명(인수)
def Name(name):
return name
Name()
class FishBread:
name = "팥붕어빵"
def redbean_bread(self):
print("이 붕어빵은 " + self.name + " 입니다.")
def black_bread(self):
print("이 붕어빵은 " + self.name + " 입니다.")
FishBread.redbean_bread()
FishBread.black_bread()
a = FishBread() # 클래스 호출
type(a) # 클래스
a.redbean_bread() # 클래스 내 함수(메소드)에 접근
a.black_bread("블랙")
a.name # 클래스 내 변수(속성)에 접근
# (1) random
random.random() # 0~1.0 사이의 실수 중에서 난수(무작위로 추출된 숫자)값 리턴
random.randint(1, 10) # 1~10 사이의 정수 중에서 난수값 리턴
a = [1,2,3,4,5]
random.choice(a) # list 값 중 무작위로 하나를 선택하여 리턴
random.shuffle(a) # list를 무작위로 섞는다.
# (2) sys: 파이썬 인터프리터가 제공하는 변수와 함수를 직접 제어할 수 있게 도와주는 라이브러리
sys.argv # 파이썬 실행시 파일 뒤에 붙여준 어떠한 값들이 리스트의 값으로 추가됨.
sys.exit() # 프로그램을 종료시키고 싶은 곳에서 사용
sys.path # 파이썬 라이브러리들이 설치되어 있는 위치
sys.version # 파이썬 버전
# (3) os: 시스템(OS)의 환경변수, 파일경로 등의 값을 제어할 떄 사용
os.environ
os.getcwd() # cwd => current working directory
os.chdir("경로") # 현재 디렉토리 위치 변경
os.mkdir("new_folder") # 폴더생성
os.rename("new_folder", "old_folder")
os.rmdir("new_folder")
클래스 (Class)
: 파이썬은 객체지향 프로그래밍 (OOP, Object Oriented Programming)을 지원한다. 그리고 객체지향 프로그래밍의 가장 기본 단위가 클래스다. 하나의 틀과 같은 역할을 하며, 데이터 저장도 가능하다.
ex) 붕어빵을 만들어 내는 틀 - 팥을 넣으면 팥붕어빵, 슈크림 넣으면 슈크림 붕어빵, 피자 재료를 넣으면 피자 붕어빵
*함수가 특정 기능을 수행하는 일련의 코드블록을 나타내는데, 클래스는 함수보다는 더 큰 개념. 함수가 여러개 모아놓은 것.
class 정의
class FishBread:
def redbean_bread(self):
print("이 붕어빵은 " + self.name + " 입니다.")
def sucream_bread(self):
print("이 붕어빵은 " + self.name + " 입니다.")
class 호출
a = FishBread() # 클래스 호출
type(a) # 클래스
a.redbean_bread() # 클래스 내 함수(메소드)에 접근
a.name # 클래스 내 변수(속성)에 접근
class 만들기 예제
class FishBread:
# 생성자 => 클래스가 호출될 때 가장 먼저 실행되는 메소드
def __init__(self, name, ingredient, price):
self.name = name
self.ingredient = ingredient
self.price = price
# self는 데이터를 저장할 수 있게 도와주는 공간.
def bread(self):
print("이 붕어빵의 이름은 {}이고, {}이 들어가있습니다. 가격은 {} 입니다.".format(self.name, self.ingredient, self.price))
redbean_bread = FishBread("팥붕어빵", "팥", 500)
redbean_bread.bread()
print(redbean_bread.name)
print(redbean_bread.ingredient)
print(str(redbean_bread.price))
cream_bread = FishBread("슈크림 붕어빵", "크림", 700)
cream_bread.bread()
pizza_bread = FishBread("피자 붕어빵", "피자", 1000)
pizza_bread.bread()
module (모듈)
: 변수, 함수, 클래스 등을 모아 놓은 파일
```py
# (1) info.py 파이썬 파일 생성하고 함수를 정의
def name(name):
print("my name is " + name)
def age(age):
print("I'm {} years old".format(age))
# (2) chapter8.py 파일로 다시 돌아와서 위 파일을 import
import info
info.name("inseop")
info.age(30)
```
- 변수 정의
```py
# (1) info.py에 변수 정의
person = {
"name": "inseop",
"age": 30,
"city": "seoul"
}
# (2) chapter8.py에서 변수 정의
import info
name = info.person["name"]
print(name)
age = info.person["age"]
print(age)
city = info.person["city"]
print(city)
# (3) 모듈 이름을 붙이지 않고 모듈 함수 바로 호출
from 모듈이름 import 함수이름 (또는 *)
from info import name, age
from info import *
```
Package (패키지 = 라이브러리)
: 모듈들의 집합 → 여러 모듈들이 하나의 상위 폴더에 모여 있는 것
변수 → 함수 → 클래스 → 모듈 → 라이브러리
Python 사용을 좀 더 편리하게 도와줄 툴 2가지를 사용한다.
두 가지 프로그램을 설치하고 난 뒤 Flask 프로젝트를 위한 세팅을 진행한다.
터미널에서 아래 코드를 작성하여 프로젝트용 폴더를 생성한 뒤 해당 폴더로 이동한다.
> mkdir (원하는 폴더 이름) # 폴더 생성 (Make Directory)
> cd (생성한 폴더 이름) #폴더 이동 (Change Directory)
우리는 프로젝트를 하는 동안 가상 환경을 이용할 거기 때문에 가상 환경에 대한 세팅을 해야한다.
# 1. jango - poetry
> poetry init
> poetry add flask
# 2. conda
> conda create -n test_env python=3.10
# 3. venv (기본)
python3.10 -m venv .venv
source .venv/bin/activate
cd .\venv\Scripts\activate
가상 환경에 대한 모듈은 몇 가지 있는데 우리는 파이썬 기본 내장 모듈인 venv 모듈을 사용할 것이다. 기본적으로 .venv로 폴더명을 만들어 사용하게 된다.
그리고 Window의 경우 Ctrl+Shift+p / MAC의 경우 Command+Shift+p를 누른 후 Python interptreter를 검색하여 Python 3.12.1('.venv\Scripts\python.exe)를 선택한다. (MAC의 경우 .venv/bin/python)
그리고 가상 환경을 만든 후에는 가상 환경을 활성화 시켜줘야 하는데⭐ 그 이유는 해당 프로젝트에서 사용할 모듈을 가상 환경에 설치해야되기 때문이다.
# MAC
> source .venv/bin/activate
# Window
> cd .\.venv\Scripts\activate
가상 환경을 활성화 한 뒤 Flask 모듈을 설치해 줄 것이다.
> pip install flask
설치가 완료되면 Lib 폴더에 flask 관련 폴더들이 생성된 것을 확인 할 수 있다.
생성한 부모 폴더에서 app.py 파일을 생성해준다.
from flask import Flask
app = Flask(__name__)
여기서, __name__
이란 건 파이썬에서 내장된 특별한 변수로, 현재 모듈의 이름을 나타낸다. 이 변수는 파이썬 스크립트가 직접 실행되는 경우와 모듈로 임포트되는 경우에 서로 다른 값을 가진다.
if __name__ == "__main__":
# 이 부분은 스크립트가 직접 실행될 때만 실행됨
# 주로 스크립트의 진입점(main)으로 사용
이렇게 사용하는 이유는 다른 모듈에서 이 스크립트를 임포트할 때 해당 블록이 실행되지 않도록 하기 위함이다. 즉, 다른 모듈에서 이 스크립트를 임포트하면 __name__
은 모듈의 이름이 되어 위 조건이 거짓이 되어 해당 블록이 실행되지 않는다.
# 다른 모듈에서 임포트되면 __name__은 모듈의 이름이 됨
test.py
print(f"test.py __name__ : {__name__}")
# test.py __name__ : __main__
app.py
import test
print(f"app.py __name__ : {__name__}")
# test.py __name__ : test
# app.py __name__ : __main__
__name__
변수를 이용하여 모듈이 어떻게 사용되고 있는지에 따라 특정 코드 블록이 실행되도록 할 수 있다. 이는 모듈의 테스트 코드를 작성하거나 모듈을 스크립트로 실행할 때 특정 동작을 수행할 때 유용하다.
> python -m flask
or
> flask run
or
> flask --app app.py --debug run
flask를 통해 나의 컴퓨터를 서버로 만들었다.
127.0.0.1: localhost라고도 부르며, 내 컴퓨터를 가리킨다.
만약에 flask의 host와 port를 지정해주고 싶다면 아래 코드를 app.py에 작성하여 실행한다. (기본적으로 5000port를 사용하고, 해당 5000 port를 이미 사용중일 때 사용.)
from flask import Flask
app = Flask(__name__)
host='127.0.0.1'
port='8000'
if __name__ == "__main__":
app.run(host=host, port=port)
python your_app.py
이 명령어를 사용하면 your_app.py 파일에 있는 Flask 애플리케이션이 직접 실행된다. 이 경우, Flask는 내장 웹 서버를 사용하여 애플리케이션을 가동한다.flask run
명령어 사용flask run
이 명령어를 사용하면 Flask 내장 서버가 아닌 Werkzeug 서버를 사용하여 애플리케이션을 가동한다. 이 방법은 개발 서버를 띄우는 데 유용하며, 개발 중에 코드 변경을 감지하고 자동으로 서버를 다시 시작하는 기능을 제공한다. 또한, 디버그 모드와 다양한 설정 옵션을 사용할 수 있다.python your_app.py
로 직접 실행하는 것은 간단한 경우에 사용하고, flask run
명령어는 개발 서버를 띄울 때 사용하는 것이 편리하다. 개발 환경에서는 주로 flask run
명령어를 사용하며, 배포 환경에서는 보통 외부 웹 서버 (예: Gunicorn, uWSGI, Nginx) 와 함께 사용된다.Flask는 Django처럼 정해진 틀이 아니라 필요한 모듈들을 불러와 자유롭게 개발 가능한 자유도가 높은 웹 서비스 개발을 위한 파이썬 웹 마이크로 프레임워크이다. (확장성이 좋다고도 할 수 있다.) 그래서 가볍고 간결하여 python 파일 하나로 서버 생성이 가능하다. 그리고 python처럼 쉬워 처음 python으로 백엔드 서비스를 구축하는 경우 객체 지향에 대한 이해, Django의 구조적 염격함 등으로 진입장벽이 있는 것에 비해 사용하기 쉽다.
풀스텍 프레임워크는 전체적인 애플리케이션의 개발에 필요한 모든 것을 포괄적으로 제공하는 프레임워크이다.
주로 백엔드 및 프론트엔드 개발에 필요한 도구, 라이브러리, 패턴 등을 포함한다.
특징
대표적인 풀스텍 프레임워크
: Java Spring, Python Django, Ruby on Rails 등
마이크로 프레임워크는 작고 경량화된 프레임워크로 필요한 부분만을 담당하고 있다.
주로 특정 기능에 중점을 두고, 개발자가 필요한 도구 및 라이브러리를 선택적으로 추가하여 사용한다.
특징:
특정 기능에 초점을 맞추고 필요한 부분만을 다룬다.
작은 규모와 유연성을 유지하기 위해 상대적으로 자유로운 코드 구조를 가진다.
선택적으로 필요한 부분을 확장하여 사용하기 때문에 더 유연하게 확장할 수 있다.
대표적인 마이크로 프레임워크
: Flask (Python), Express.js (JavaScript - Node.js)
라우팅은 URL과 특정 함수 간의 매핑을 정의하는 것이다. app.route()
데코레이터를 사용하여 특정 URL 경로에 대한 요청이 발생했을 때 실행될 함수를 지정한다.
app.py
from flask import Flask
app = Flask(__name__)
라우트 방법
# 1. 기본 경로에 대한 라우트
@app.route('/')
def home():
return 'Hello, this is the home page!'
# 2. 다른 경로에 대한 라우트
# 127.0.0.1:5000/about
@app.route('/about')
def about():
return 'This is the about page.'
# 3. 127.0.0.1:5000/project
@app.route('/project')
def project():
return 'The project page'
URL에 따른 라우트 방법
# 1. 동적인 URL 파라미터 사용
@app.route('/user/<username>')
def show_user_profile(username):
return f'User: {username}'
# URL에 변수 및 타입 지정
@app.route('/post/<int:post_id>') # 숫자로만 받기 위해선 int type 지정 필요.
def show_post(post_id):
return f'Post ID: {post_id}'
API END POINT 생성
# CRUD: Create(POST), Read(GET), Update(UPDATE), Delete(DELETE) -> REST API
# GET: 데이터를 요청할 때
# POST: CREATE. 데이터를 생성할 때
from flask import jsonify
@app.route("/api/v1/feeds", methods=['GET'])
def get_all_feeds():
# DB에서 불러온다.
data = {
'status': 'success',
'feed': {
"feed1": "data",
"feed2": "data2"
}
}
# python -> dict -> json
return jsonify(data)
다양한 HTTP 메소드 지원
@app.route('/submit', methods=['POST', 'GET'])
def submit():
if request.method == 'POST':
return 'POST method.'
else:
return 'GET method.'
요청 보내기
request.json
사용하기
: JSON 형태의 데이터를 보낼 경우 (content-type
이 application/json
인 경우), request.json
또는 request.get_json()
을 사용한다. 이는 파이썬 딕셔너리 형태로 JSON 데이터를 자동으로 파싱해준다.
요청을 보내는 곳
@app.route('/test')
def user_profile():
url = 'http://localhost:5000/submit'
data = {'key1': 'value1', 'key2': 'value2'}
response = requests.post(url, data=data)
return response
요청을 받는 곳
@app.route('/submit', methods=['POST'])
def submit():
data = request.json
key1 = data.get('key1')
key2 = data.get('key2')
return f'Received: key1={key1}, key2={key2}'
Jinja는 Python 기반의 템플릿 엔진으로, 주로 웹 개발 프레임워크인 Django, Flask에서 사용한다. 동적으로 데이터를 렌더링하여 HTML, XML, 또는 기타 마크업 언어로 출력하는데 사용한다.
{{ ... }}
<p>{{ variable_name }}</p>
{%...%}
{% if user %}
<p>Hello, {{ user.name }}!</p>
{% else %}
<p>Hello, Guest!</p>
{% endif %}
<ul>
{% for item in item_list %}
<li>{{ item }}</li>
{% endfor %}
</ul>
app.py 파일을 아래 코드로 작성하면 된다.
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
# 템플릿에 전달할 데이터
data = {
'title': 'Flask Jinja Template',
'user': '본인 이름',
'is_admin': True,
'item_list': ['Item 1', 'Item 2', 'Item 3']
}
# render_template을 사용하여 템플릿 파일을 렌더링
return render_template('index.html', data=data)
if __name__ == '__main__':
app.run(debug=True)
이전에 사용하던 app.py 파일은 다른 폴더에 넣어놓고 현재 app.py파일을 넣는다. 아래 만들 index.html파일은 같은 폴더 내에 templates
라는 폴더에 넣어야한다.⭐(매우중요)
<!DOCTYPE html>
<html land='en'>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{{ data.title }}</title>
</head>
<body>
<h1>Hello, {{ data.user }}!</h1>
{% if data.is_admin %}
<p>You have admin privileges.</p>
{% else %}
<p>You do not have admin privileges.</p>
{% endif %}
<ul>
{% for item in data.item_list %}
<li>{{ item }}</li>
{% endfor %}
</ul>
</body>
</html>
위에서 배운 내용을 바탕으로 Flask와 render_template를 사용하여 app.py 파일과 index.html 파일을 각자 만들고 Jinja 템플릿을 사용하여 사용자 목록을 HTML로 렌더링하려한다.
index.html에서 각 사용자의 이름과 사용자 직업 이름을 목록 형태로 표시하고 Flask를 실행한다 다음 브라우저에서 해당 서버 주소로 접속하여 결과를 확인한다.
(1) app.py 파일
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
users = [
{'username': 'traveler', 'name': 'Alex'},
{'username': 'photographer', 'name': 'Sam'},
{'username': 'gourmet', 'name': 'Chris'}
]
return render_template('index.html', users=users)
if __name__ == '__main__':
app.run(debug=True)
(2) templates\index.html 파일
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>User List</title>
</head>
<body>
<h1>User List</h1>
<ul>
{% for user in users %}
<li>{{ user.name }} ({{ user.username }})</li>
{% endfor %}
</ul>
</body>
</html>
서버를 다룬다는 것은 참 재밌당 히힛