Week2 - Day3(REST API & Querystring)
지난 시간에 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의 정의 자체가 궁금하다면 아래 링크들이 더 도움이 될 것이다.
- https://pythonise.com/series/learning-flask/flask-query-strings
- https://2dowon.netlify.app/python/flask-query-string/
- https://velog.io/@haileeyu21/Session-RESTful-API-%EB%9E%80-Path-parameters-Query-string
요약하자면, 주소창에서 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를 보지 않으리'라는 마음으로 하다보니 나 자신을 너무 많이 억눌렀던 것같다. 남의 코드를 많이 보는 것이 나쁜것도 아닌데 스스로 베낄까봐 죄책감?무서움?두려움?에 사로잡혔던 것같다.
담에는 조금 더 마음 편하게 먹고 과제에 임해야겠다고 생각했다. 생각보다 정답은 한끗차이인 것같당.
Author And Source
이 문제에 관하여(Week2 - Day3(REST API & Querystring)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jaee5/Week2-Day3-TIL저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)