-
Tutorial 0.4 APITutorial/0.Tutorial 2022. 9. 5. 13:44
개발 입문단계에 있어, 다른 이에게 보여줄 어떤 참고서를 작성하는 일은 나에게 마땅치 않은 것 같다.
기왕의 공부내용은 다른 체계(https://1drv.ms/u/s!Ah3ot1Iz99uHgQuYOr3XDyRMXjIZ)로 정리되어 있다.
이 블로그는 일종의 "루만의 메모상자"처럼 사용하려 한다.
0.1 Flask 프레임 워크(https://flask-docs-kr.readthedocs.io/ko/latest/quickstart.html)
from flask import Flask, render_template, request, jsonify app = Flask(__name__) @app.route('/') def home(): return render_template('index.html') @app.route("/mars", methods=["POST"]) def web_mars_post(): sample_receive = request.form['sample_give'] print(sample_receive) return jsonify({'msg': 'POST 연결 완료!'}) @app.route("/mars", methods=["GET"]) def web_mars_get(): return jsonify({'msg': 'GET 연결 완료!'}) if __name__ == '__main__': app.run('0.0.0.0', port=5000, debug=True)
1) Flask class 임포트. 이 클래스의 인스턴스가 WSGI 어플리케이션.
-첫번째 인자는 이 어플리케이션의 이름. 단일 모듈을 사용한다면, " __name__ "을 써야한다.
->어플리케이션으로 시작되는지, 모듈로 임포트되는지에 따라 이름이 달라지기 때문.
2)인스턴스 생성. 인자로 모듈이나 패키지의 이름. render_template, request, jsonify
-template 이나 정적파일을 찾을 때 필요.
-jsonify : 전달한 데이터를 JSON으로 직렬화
3)route() 데코레이터. URL과 프로토콜 방식을 알려준다.
4)작성된 함수의 이름은 그 함수에 대한 URL을 생성. (url_for 함수)
-함수는 클라이언트에 보여줄 메시지를 리턴.
5)최종적으로 run() 함수를 사용해 로컬서버 실행.
-소스파일을 모듈이 아닌 python 인터프리터를 이용해서 직접 실행한다면 if __name__ == '__main__': 이 문장은 우리가 실행한 서버가 현재 동작되는 유일한 서버라는 것을 보장한다.
0.2 Query Parameter 와 Path Variable
출처: https://ssungkang.tistory.com/entry/Web-Path-Variable-VS-Query-Parameter
출처: https://ryan-han.com/post/translated/pathvariable_queryparam/
1) Query Parameter
사용자 목록을 관리해야 하고, 모든 사용자는 사용자 페이지가 있어야 할 때.
그리고 각각의 사용자를 위한 페이지를 만들려면 페이지 마다 식별된 파라미터 경로가 필요한데,
다음과 같은 get 파라미터를 사용할 수 있을 것이다./users?id=123 # 아이디가 123인 사용자를 가져온다.
그럼 서버로 부터 id 변수를 얻을 수 있다. 이것이 Query String이 동작하는 방식이다.
Query Parameter 은 경로 뒤에 입력 데이터를 함께 제공.
/post?post_id=6
이 때 ? 이후의 부분을 Query String이라고 하며 뒤는 key, value의 쌍으로 이루어진다.
다음과 같이 &로 연결하여 여러 개의 데이터를 넘길 수도 있습니다.
/post?post_id=6&key1=value1
2)Path Variable
하지만 데이터를 넘기는 방법 중의 하나로 Path Variable도 사용할 수 있다.
Path Variable은 다음과 같이 사용한다./users/123 # 아이디가 123인 사용자를 가져온다.
이 경우에, 123 을 서버단에 전달한다. 경로를 변수로서 사용하는 것이다.
Path Variable 는 이름에서도 알 수 있듯이 경로를 변수로서 사용.
게시물이 존재하며 각각의 게시물을 볼 수 있는 경우, 각각의 게시물을 보기 위해서는 게시물의 id를 서버에 넘겨줘야 한다.
이를 Path Variable 를 사용하면 다음과 같다.
/post/6
3)그럼 Path Variable과 Query Parameter를 각각 언제 사용해야 하는가?
만약 어떤 resource를 식별하고 싶으면 Path Variable을 사용하고,
정렬이나 필터링을 한다면 Query Parameter를 사용하는 것이 Best Practice이다./users # 사용자 목록을 가져온다. /users?occupation=programer # 프로그래머인 사용자 목록을 가져온다. /users/123 # 아이디가 123인 사용자를 가져온다.
또한, 기본적인 CRUD 기능을 위해서 또 다른 URL이나 query parameter를 정의할 필요는 없다.
대신 원하는 기능에 맞게 HTTP 메소드를 바꾸어야 한다./users [GET] # 사용자 목록을 가져온다. /users [POST] # 새로운 사용자를 생성한다. /users/123 [PUT] # 사용자를 갱신한다. /users/123 [DELETE] # 사용자를 삭제한다.
거의 모든 CRUD 프로세스를 추가적인 endpoint(예를 들어 users/create) 또는
query parameter(예를 들어 users?action=create) 없이 수행할 수 있다.
게다가 단순하고 예측 가능하다.
3.1) resource를 식별해야하는 상황.
서버에서는 어느 방식으로 넘어오던지 간에 받아온 resource의 id로 쿼리를 날린다.
그런데 만약 존재하지 않은 resource의 id가 들어올 경우 각각 어떻게 동작할까?
-Path Variable 은 저 경로의 존재하는 페이지가 없으므로 404 에러.
-Query Parameter는 서버로 데이터가 넘어가고 쿼리를 날리며 해당하는 데이터가 없을 경우 따로 에러 핸들링을 해줘야.
즉 resource를 식별해야하는 상황에서는 Path Variable 가 더 적합하다.
3.2) 정렬이나 필터링을 해야할 상황.
post에 대해 django 관련 글만 필터링하는 아래와 같은 예시가 있습니다.
post/django post?category=django
django 관련 글이 없을 경우, Path Variable 는 404에러를 발생하고 Query Parameter 는 빈 리스트를 반환.
펄터링을 하다가 404에러가 발생하는 것은 부적절하므로 정렬이나 필터링을 해야하는 상황에서는 Query Parameter 가 더 적합합니다.
1.0 데코레이터
1.1 url_for 함수
2.0 삽질의 기억
*templates 폴더 안에 index.html을 넣지 않았을 때. 즉, 경로를 잘못 넣었을 때.
'Tutorial > 0.Tutorial' 카테고리의 다른 글
URI 와 URL (0) 2022.10.05 REST API : 그러니까 창문은 창문답게 투명하게, 보기 쉽게 만들라는 것 (1) 2022.10.01 Tutorial 0.3 Python (0) 2022.08.21 Tutorial 0.0 용어 정리 (0) 2022.08.18 Tutorial 1.1 SQL (0) 2022.08.15