이 연습은 상호 작용 방식으로 기본 백엔드/서버 측 프로그래밍에 익숙해지고 현대적인 파이썬/플라스크 환경에서 편안하게 발전 할 수 있도록하기위한 것입니다.
다음을 읽는 것은 API/쓰기 서버 사이드 코드를 개발할 때 큰 그림을 얻는 데 도움이 될 것입니다.
이 프로젝트는 여러 부분으로 분류됩니다. 이 프로젝트를 완료 한 후에는 아래 지침에 따라 제출해야합니다.
이 연습은 9 월 17 일 월요일 오후 11시 59 분 이전에 마감됩니다. React-Exercise와의 작업을 포함하여 총 10 시간 이상을 소비 한 경우 귀하가 가진 것을 제출하십시오!
질문이 있으시면 [email protected]에게 이메일을 보내 주시기 바랍니다.
Mac 및 Windows의 설치 지침.
설치를 포함하여 Python의 모든 것에 대한 또 다른 훌륭한 리소스는 Python에 대한 Hitchhiker의 안내서입니다.
터미널에서 다음 명령을 실행하여 올바른 버전이 있는지 확인하십시오.
python3 -V
pip3 -V
pipenv --version
먼저이 저장소를 포크하십시오. 오른쪽 상단의 포크 버튼. 이것이하는 일은이 저장소를 귀하의 계정으로 복사하는 것입니다. 이제 <yourusername>/flask-exercise 이름의 저장소가 있어야합니다.
이와 같아야합니다 (내 사용자 이름은 tko22입니다) : 
그런 다음이 저장소를 복제합니다 ( "클론 또는 다운로드"라는 녹색 버튼을 클릭하고 HTTP를 선택하고 <url> 위치에 복사하여 붙여 넣습니다.
$ git clone <url>
$ cd flask-exercise
그런 다음 가상 환경을 설정 하고이 앱을 실행하는 데 필요한 파이썬 종속성을 설치하십시오. Pipfile과 Pipfile.lock이 주어지면 모든 것을 자동으로 설정하는 Pipenv를 사용합니다. PipFile은 다른 Python 프로젝트에서 분리 된 가상 파이썬 환경 인 VirtualEnV를 사용하여 동일한 컴퓨터의 다른 Python 프로그램을 방해하거나 영향을받을 수 없습니다. 따라서 동일한 패키지 또는 다른 파이썬 버전의 다른 버전을 실행할 수 있습니다.
pipenv install --skip-lock
이 서버를 시작하려면이 가상 환경에 있어야합니다. 그렇게하려면 :
pipenv shell
그런 다음 서버 실행을 시작하려면 :
(backend-exercise-o4dc6oDL)$ python app.py
참고 : 이것은 터미널에서 실행되는 프로세스로 유지되므로 다른 명령을 실행하려면 새 탭 또는 창을 열어야합니다.
서버를 중지하려면 Control-C 누릅니다.
backend-exercise-[something here] 라는 가상 환경을 종료하려면 실행하십시오.
(backend-exercise-o4dc6oDL)$ deactivate
pipenv shell 실행하지 않고 명령하기 전에 pipenv run 추가 할 수도 있습니다. 예를 들어 pipenv run python app.py
코드를 변경하기 전에 새 지점을 작성하십시오. 일반적으로 지점은 주소 지정된 기능 또는 버그 픽스를 기준으로 명명되지만이 프로젝트의 경우 리뷰어가 쉽게 따라갈 수 있도록 자신의 이름으로 지점을 지정하십시오.
git checkout -b <YOUR_NAME>
분기 이름은 모두 소문자 여야하며 공백을 포함 할 수 없습니다. 공간 대신 하이픈을 사용하십시오. 예를 들어:
git checkout -b varun-munjeti
서버를 시작하면 localhost:5000 에서 지속적으로 실행되는 프로세스가됩니다. 서버에 요청하기 위해 Postman을 사용하십시오.
먼저 / 엔드 포인트에 대한 GET 을하십시오. 서버가 localhost:5000 에서 실행 중이므로 전체 엔드 포인트 URL은 localhost:5000/ 입니다.

/mirror 엔드 포인트를 호출하십시오. 먼저 엔드 포인트의 코드를보고 URL 매개 변수를 지정하는 방법을 확인하십시오. 그런 다음 Postman에게 localhost:5000/mirror/<name> 에 요청하십시오.

이 연습은 플라스크를 사용하여 편안한 API를 만드는 것을 안내합니다! 데이터베이스 인스턴스를 설정하는 모든 번거 로움을 거치기를 원하지 않으므로 더미 데이터와 모의 데이터베이스 인터페이스를 만들어 상호 작용합니다. 쉽게하기 위해, 전체 앱 로직을 뺀 app.py 에서 구현 된 MockDB 로직을 뺀 것입니다. 대규모 프로젝트의 경우 API 엔드 포인트는 일반적으로 views 라는 다른 파일로 분리됩니다.
시작하기 전에 create_response 기능과 작동 방식을 잘 살펴보십시오. 이 기능을 사용하는 방법에 대한 지침을 따르십시오. 그렇지 않으면 API가 적절한 규칙을 따르지 않습니다!
또한 모의 데이터베이스를 살펴보십시오. 초기 더미 데이터는 mockdb/dummy_data.py 에 정의됩니다. 서버를 시작할 때 "데이터베이스"에 "존재"하는 것입니다.
mockdb/mockdb_interface.py 에 정의 된 함수는 mockdb를 쿼리하는 방법입니다. API를 작성할 app.py 에서는 db 라는 이름으로 가져 왔습니다. 따라서 엔드 포인트에 대한 코드를 작성하면 db.get('users') 와 같은 DB 인터페이스 기능을 호출 할 수 있습니다.
코드를 수정하면 코드가 컴파일되지 않으면 서버가 자동으로 업데이트됩니다.이 경우 서버가 실행을 중지하고 코드를 수정 한 후 수동으로 다시 시작해야합니다.
종말점 정의 :
GET /users
이렇게하면 MockDB의 모든 user 목록이 포함 된 올바르게 형식화 된 JSON 응답을 반환해야합니다. 서버를 시작한 직후이 엔드 포인트를 호출하면 Postman 에서이 응답을 가져와야합니다.
{
"code": 200,
"message": "",
"result": {
"users": [
{
"age": 19,
"id": 1,
"name": "Aria",
"team": "LWB"
},
{
"age": 20,
"id": 2,
"name": "Tim",
"team": "LWB"
},
{
"age": 23,
"id": 3,
"name": "Varun",
"team": "NNB"
},
{
"age": 24,
"id": 4,
"name": "Alex",
"team": "C2TC"
}
]
},
"success": true
}
종말점 정의 :
GET /users/<id>
요청에서 제공된 id 있는 단일 사용자를 검색해야합니다.
제공된 id 있는 사용자가 존재하지 않으면 설명 message 와 함께 404 반환하십시오.
현재 팀을 기반으로 사용자를 쿼리하는 기능을 추가하여 첫 번째 /users 확장합니다. 2 부에서와 같이 URL 매개 변수를 사용해서는 안됩니다 . 대신 쿼리 문자열을 사용하십시오.
team 쿼리 문자열 매개 변수로 제공되는 경우 해당 팀에있는 사용자 만 반환하십시오. 제공된 team 에 사용자가없는 경우 빈 목록을 반환하십시오.
이 연습의 경우 team 이외의 쿼리 문자열 매개 변수를 무시할 수 있습니다.
Postman에서는 쿼리 문자열 매개 변수를 요청 URL에 쿼리 문자열을 작성하거나 Send 옆에있는 Params 버튼을 누르면 제공 할 수 있습니다. 그렇게하면 요청 URL을 자동으로 작성합니다.
다음이 발생해야합니다
GET /users?team=LWB
{
"code": 200,
"message": "",
"result": {
"users": [{
"age": 19,
"id": 1,
"name": "Aria",
"team": "LWB"
}, {
"age": 20,
"id": 2,
"name": "Tim",
"team": "LWB"
}]
},
"success": true
}

종말점 정의 :
POST /users
이 엔드 포인트는 새 사용자를 생성해야합니다. 각 요청은 또한 요청 body 에 name , age 및 team 매개 변수를 보내야합니다. id 속성은 mockdb에서 자동으로 생성됩니다.
성공적인 요청은 201 의 상태 코드를 반환하고 새로 생성 된 사용자를 반환해야합니다.
필요한 세 가지 매개 변수 중 하나가 제공되지 않으면 DB에서 새 사용자를 생성하지 말고 유용한 message 로 422 반환하지 마십시오. 일반적으로 메시지는 사용자/개발자가 잘못한 것과 수정 방법에 대한 유용한 피드백을 제공해야합니다.
이것이 우체국에서 body 매개 변수를 보낼 수있는 방법입니다. 쿼리 매개 변수로 이것을 착각하지 마십시오! 
종말점 정의 :
PUT /users/<id>
여기에서 업데이트 할 사용자를 지정해야하므로 사용자의 id 제공해야합니다. 이 요청에 대한 body 파트 4의 POST 요청과 동일한 속성이 포함되어야합니다.
그러나이 PUT 요청과의 차이점은 제공된 키 ( name , age , team )가있는 값 만 업데이트되며 제공되지 않은 매개 변수는 업데이트중인 사용자의 해당 속성을 변경하지 않는다는 것입니다.
name , age 또는 team 아닌 body 매개 변수를 설명 할 필요가 없습니다.
제공된 id 가진 사용자를 찾을 수없는 경우 404 와 유용한 message 반환하십시오.
종말점 정의 :
DELETE /users/<id>
이렇게하면 관련 id 로 사용자를 삭제합니다. 응답 result 에 지정할 필요가 없지만 유용한 message 반환하십시오.
제공된 id 가진 사용자를 찾을 수없는 경우 404 와 유용한 message 반환하십시오.
단위 테스트를 쓰자! 단위 테스트는 소프트웨어 개발에 매우 중요합니다. 모든 것을 수동으로 테스트하는 것이 매우 느리고 오류가 발생하기 쉬운 기능이 작동하는지 자동으로 확인할 수 있습니다. Test Driven Development는 사양을 정의하고 해당 사양에 테스트를 작성한 다음 기능을 구현 한 다음 테스트를 사용하여 작동 여부를 검증하는 소프트웨어 개발 프로세스입니다. 파트 1-3에 대한 테스트가 작성되었으므로 우리는 당신을 위해 약간의 작업을 수행했습니다. 테스트하려면 :
pipenv install --dev
pipenv run pytest
변경 사항이 작동하면 5 passed 녹색 선이 표시됩니다. 그렇지 않은 경우 스택 추적을 따르고 구현을 수정하십시오. 일단 작동하면 파트 3-6에 대한 테스트를 작성합시다 .
우리는 test_get_index 와 같이 test 로 시작하는 Python 메소드를 자동으로 찾아서 실행하는 유용한 Python 테스트 프레임 워크 인 Pytest를 사용합니다. 우리의 경우, 우리는 test_app.py 라는 테스트 파일이 있습니다.
각 메소드는 또한 client 객체를 수락하며, 이는 Pytest에 의해 자동으로 주입됩니다. client 는 여러 테스트에서 사용할 수있는 테스트 고정물로 테스트를위한 고정 된 기준을 제공합니다. 초기화 할 때 Pytest는 conftest.py 를보고 모든 비품을 수집합니다. 우리의 경우, 우리는 플라스크 테스트 클라이언트를 제공하는 client 픽스처가있어 API를 쉽게 테스트하는 데 사용할 수 있습니다. 플라스크 테스트 클라이언트를 사용하여 다른 유형의 요청을 만들 수있는 방법과 요청 페이로드를 사용하는 방법을 살펴보십시오.
모든 단계가 완료되면 변경 사항을 GitHub 리포로 푸시하십시오!
제출하기 전에 파이썬 포맷터 인 Black을 실행합시다. 이것은 우리가 파이썬 코드를 스타일링하는 방법에 대한 모든 인수를 제거하고 검토 자에게 검토 할 수있는 표준화 된 스타일을 제공합니다. pipenv install --dev 와 함께 설치해야합니다
pipenv run black .
PR을 제출하기 전에 지점을 원격 지점 (로컬이 아닌 Github에있는 지점)으로 밀어야합니다.
당신이 당신의 지점에 있는지 확인하십시오 :
git branch
모든 커밋이 있는지 확인하려면 다음과 같습니다.
git log
Q 눌러 git log 화면을 종료하십시오.
커밋을 원격 지점으로 밀어 넣으십시오.
git push
처음 으로이 작업을 수행하면 원격 브랜치가 아직 존재하지 않으므로 오류가 발생할 수 있습니다. 일반적으로 사용하기위한 올바른 명령을 알려줍니다.
git push --set-upstream origin <YOUR_BRANCH_NAME>
참고 : 새 지점을 처음 밀어 넣을 때만 완료하면됩니다. 나중에 git push 만 사용할 수 있습니다.
이 작업이 완료되면 Forked Repository 및 Branch Name에 대한 링크와 함께 [email protected]로 이메일을 보내주십시오. 제출물을보기 위해서는이 두 가지가 필요합니다.