Week2 - Day3(REST API & Querystring)

jae oh·2021년 7월 27일
0

2021-summer-ai-bootcamp

목록 보기
8/8

지난 시간에 REST API를 사용하는 방법을 배웠다.
그리고 이번 Day3에선 과제만 있었는 데, 여기서 삽질을 꽤나 해서 기록으로 남겨놔야겠다 싶었다.

QueryString이 뭔데...
이번에 URL에서 querystring을 인자로 받아서 서버에서 처리해주는 게 과제로 나왔는 데, 진짜 오늘 하루종일 내내 이해가 안가서 삽질도 많이 했다.

1. python에서 string 처리

python에서 string 함수 쓸때 대개 str()을 많이 쓰기도 했고, 여러 언어를 접하다보면 헷갈릴때가 너무 많아서 ㅠㅠ 오늘 어이없는 실수를 했다.
지난번에 url에서 <int:num>을 넣으면 int형의 변수 num을 인자로 받을 수 있다 했다. string으로 받을 때는 str가 아니라 꼭 <string:temp>로, string이라는 풀 네임으로 다 적어줘야 적용된다.

@app.route('/menus/<int:num_id>', methods=["PUT"])
@app.route('/menus/<string:temp>', methods=["PUT"])

아니면 나처럼 이렇게 LookupError: the converter 'str' does not exist 에러가 난다.

2. Querystring가 뭔데 날 괴롭혀

Querystring이 이번 과제에서 아주 중요한 문제였다.
Querystring의 정의 자체가 궁금하다면 아래 링크들이 더 도움이 될 것이다.

요약하자면, 주소창에서 http://127.0.0.1:5000/echo?city=seoul&people=5라 할때, 바로 ?뒤에 오는 string을 쿼리스트링이라 부른다.
위 링크들을 보고 이해는 했는 데, 그래서 저 쿼리를 어떻게 인자로 받아야하는 거지?라면 약 3시간 삽질을 했다. 꾸준히 공부하자

http://127.0.0.1:5000/echo?city=seoul&people=3
위 URL을 중심으로 다시 집어보자.(method는 PUT/POST기준) GET은 그냥 땡겨오자

1. URI을 다 써! (실패)

@app.route('/echo?city=<string:city_name>&people=<int:count>', methods=["POST"]) 
# 새로운 정보를 추가
def save_info():
    new_place= {"city": city_name, "people": count}
    places.append(new_place)
    return jsonify(new_weapon)

처음에 내가 짰던 코드는 위와 같다.
아주 그냥 URI를 야무지게 다 썼다. 덕분에 404 에러가 났다.
근데 아무리 봐도 ?이 URI에 들어가지 않을 거같은 느낌이 났다. 뭔가 내가 놓치고 있는 기분... 그래서 개발자의 친구구글에 검색했더니 URI는 ?전까지의 주소만 적으면 된다고들 한다.

참고 : https://www.jungyin.com/131

2. 구글링을 바탕으로. (성공)

@app.route('/echo', methods=["POST"]) 
# 새로운 정보를 추가
def save_info():
    
    city_name = request.args.get("city")
    count = request.args.get("people")
    
    new_place= {"city": city_name, "people": count}
    places.append(new_place)
    return jsonify(new_weapon)

위처럼, ?전까지의 주소만 URI로 받고, 나머지 인자들은 진짜 그냥 변수로 받아오면 된다.
request.args.get() 이 친구만 있다면, URL에서 받아오면 Parameter를 손쉽게 당겨올 수 있다. 그러니, 이제 쫄지말자!

3. (추가) URI에서 원래 인자는 2개인데, 하나만 입력해도 가능해?

  • 가능은 하다.
  • PUT/POST는 모든 인자 값을 형식에 맞게 저장해야 된, 만약 querystring에서 value=만 쓰고 입력값을 주지 않으면 기본적으로 ""로 저장된다. 혹은 아예 value값까지 않으면 null로 저장된다.
  • URI에서 인자를 다 적었지만 함수 안에서 하나의 인자만 있어도 되는 상황이라면 아래처럼 하나의 변수만 받아도 에러나지 않는다.
def remove_places():
    city_name = request.args.get("city")
    # URL에서 하나의 parameter만 받아도 에러나지 않는다.

    for i in range(len(places)):
        if places[i]["city"] == city_name:
            del places[i] 
            break
    return f"deleted \"{city_name}\""

느낀 점:
querystring을 검색해도 한글로 된 정보들은 다 정의가 많고 실제로 코드에서 인자를 어떻게 받아야하는지 설명이 없거나, 내가 이해할 수가 없어서 긴 시간동안 고민을 많이 했던 것같다.
스스로에 대한 의심이 많은 건 도움이 되기도 하지만 때론 악영향을 끼치기도 하는 것같다. 다른 사람들의 코드를 보는 것이 정답지를 훔쳐보는 것과 같은 죄책감이 들때가 많았어서 이번에는 '꼭 다른 사람들의 pr를 보지 않으리'라는 마음으로 하다보니 나 자신을 너무 많이 억눌렀던 것같다. 남의 코드를 많이 보는 것이 나쁜것도 아닌데 스스로 베낄까봐 죄책감?무서움?두려움?에 사로잡혔던 것같다.
담에는 조금 더 마음 편하게 먹고 과제에 임해야겠다고 생각했다. 생각보다 정답은 한끗차이인 것같당.

profile
여기저기 돌아다니는중

0개의 댓글