본문 바로가기
앨리스 AI

엘리스 AI 4주차 flask 기초

by kjwkjw 2021. 7. 12.

 

flask는 파이썬을 이용해서 서버를 만드는 프레임워크다.

 

# path param을 이용해서 값을 받고 사칙연산 api들을 만드세요

from flask import Flask,request

app = Flask(__name__)


 # 적당한 url 을 정의하세요.
@app.route("/sum/<int:a>/<int:b>")
def sum(a,b):
    result = a+b
    
    return str(result)
    
@app.route("/mul/<int:a>/<int:b>")
def mul(a,b):
    result = a*b
    
    return str(result)
@app.route("/div")
def div():
    a =int(request.args['a'])
    b =int(request.args['b'])
    result = a/b
    
    return str(result)

 # 뺄셈, 곱셈, 나눗셈 api 들도 만드세요.


if __name__ == '__main__':
    app.run(debug=True)

: sum과 mul은 매개변수를 url 경로로 받는 방법이다.

sum/2/3 으로 접근하면 화면에 5가 출력이 되고 mul/2/3으로 접근하면 화면에 6이 출력된다.

반면 div는 쿼리 스트링으로 매개변수를 받는 방법이다. div?a=10&b=5으로 접근한다면 화면에 2가 출력이 된다.

쿼리스트링으로 인자를 받을 때는 인자의 개수를 가변적으로 접근할 수 있다.

쿼리스트링으로 인자를 전달한다면 request.args에 key-value 값으로 사전에 저장된다.

 

 

from flask import Flask,request,jsonify

app = Flask(__name__)


# 직원 데이터를 추가하세요.
people = [
    {
        "employee_number": 1,
        "name": "john",
        "age": 21,
        "job": "programmer",
        "height": 180,
        "salary": 40000000,
    },
    {
        "employee_number": 2,
        "name": "james",
        "age": 12,
        "job": "model",
        "height": 154,
        "salary": 30000000,
    },
    {
        "employee_number": 3,
        "name": "mike",
        "age": 26,
        "job": "programmer",
        "height": 168,
        "salary": 1000000000,
    },
    {
        "employee_number": 4,
        "name": "nick",
        "age": 26,
        "job": "firefighter",
        "height": 181,
        "salary": 4000000000,
    }
    
]


# query string 을 통해 해당하는 사람의 정보만 뽑아 응답하세요.
@app.route("/employee",methods=["GET"])
def find_employee():
    print("find_employee")
    ans = []
    age = request.args.get("age")
    name = request.args.get("name")
    job = request.args.get("job")
    
    print(age,name,job)
    # 쿼리와 일치하는 people이 있을 때  list에 추가한다.
    for p in people:
        print(p["age"],age)
        if (age is None or p["age"]==int(age)) and (name is None or p["name"]==name) and (job is None or p["job"]==job):
            ans.append(p)
    
    return jsonify(ans)

# 직원을 추가하는 api를 만드세요.
@app.route("/employee",methods=["POST"])
def add_employee():
    print(request.form)
    print("add_employee")
    people.append(    {
        "employee_number": int(request.form.get("employee_number")),
        "name": request.form.get("name"),
        "age": int(request.form.get("age")),
        "job": request.form.get("job"),
        "height": int(request.form.get("height")),
        "salary": int(request.form.get("salary")),
    })
    return jsonify(people)

# 직원을 삭제하는 api를 만드세요.
@app.route("/employee/<int:employee_number>",methods=["DELETE"])
def fire_employee(employee_number):
    print("fire_employee")
    for p in people:
        if p["employee_number"] == employee_number:
            people.remove(p)
    return jsonify(people)

if __name__ == '__main__':
    app.run(debug=True)

 

people 리스트에 각 사람의 정보를 담은 dict가 추가되어있다.

이번 실습을 통해 GET, POST, DELETE의 요청을 받았을 때 서버단에서 처리하는 API를 만들었다.

 

1. GET

@app.route("/employee",methods=["GET"])
def find_employee():
    print("find_employee")
    ans = []
    age = request.args.get("age")
    name = request.args.get("name")
    job = request.args.get("job")
    
    print(age,name,job)
    # 쿼리와 일치하는 people이 있을 때  list에 추가한다.
    for p in people:
        print(p["age"],age)
        if (age is None or p["age"]==int(age)) and (name is None or p["name"]==name) and (job is None or p["job"]==job):
            ans.append(p)
    
    return jsonify(ans)

GET은 클라이언트에서 서버에 정보를 요청할 때 사용되는 메소드다.

GET을 통해 전달되는 parameter들은 쿼리스트링을 통해 전달되며 하나도 전달이 안될 수도 있고 모두 전달 될 수도 있다. 개수는 가변적이다. 쿼리스트링을 통해 전달된 parameter를 서버단에서 받을 때 request.args.get("name")과 같이 받을 수 있다.

예를 들어 /employee?age=26&job=programmer의 URL을 GET메소드로 요청했을 때 

request.args.get("age") == 26, request.args.get("job") == "programmer, request.args.get("name")==None 과 같이 값이 저장된다. list를 JSON형태로 바꿔 전달하기 위해 jsonify 함수를 사용해야 한다.

클라이언트가 GET요청을 서버에 보낼 때 어떠한 파라미터도 전달되지 않는다면 다음과 같이 모든 객체가 JSON형태로 전달된다.

 

클라이언트가 GET요청을 서버에 보낼 때 parameter로 name값에 mike를 담아 전달하면 다음과 같이 name이 mike인 객체가 JSON형태로 전달된다.

 

2. POST

def add_employee():
    print(request.form)
    print("add_employee")
    people.append(    {
        "employee_number": int(request.form.get("employee_number")),
        "name": request.form.get("name"),
        "age": int(request.form.get("age")),
        "job": request.form.get("job"),
        "height": int(request.form.get("height")),
        "salary": int(request.form.get("salary")),
    })
    return jsonify(people)

POST는 클라이언트가 정보의 추가를 요청할 때 사용되는 메소드다.

POST메소드를 이용할 때는 body에 객체의 정보를 담아 전달할 수 있다. postman 앱을 사용하면 다음과 같이 form-data에 정보를 담아 전달할 수 있다. form-data로 받은 parameter는 request.form.get("name")을 사용하여 접근할 수 있다.

POST 메소드로 요청을 하면 다음과 같이 정상적으로 객체가 추가됨을 확인할 수 있다.

 

3. DELETE

@app.route("/employee/<int:employee_number>",methods=["DELETE"])
def fire_employee(employee_number):
    print("fire_employee")
    for p in people:
        if p["employee_number"] == employee_number:
            people.remove(p)
    return jsonify(people)

DELETE는 클라이언트가 서버에 정보 삭제를 요청할 때 사용하는 메소드다.

URL에 파라미터를 직접 매핑해서 전달했을 때는 def fire_employee(employee_number) 처럼 메소드의 매개변수로 받아 사용해야된다.

DELETE 메소드로 요청하면 다음과 같이 employee_number가 5인 객체가 삭제됐음을 알 수 있다.

'앨리스 AI' 카테고리의 다른 글

엘리스 AI 3주차 HTML/CSS  (0) 2021.07.05
앨리스 AI 트랙 1주차 리눅스 기초  (0) 2021.06.23
앨리스 AI 트랙 1주차 GIT  (0) 2021.06.22

댓글