달력

122024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

EC2 프리티어를 사용하는데 AWS가 내 돈을 가져가 버렸다.

 

왜?     내 돈을 가져간 이유다.

https://saengjja.tistory.com/374

 

AWS EC2 프리티어에 요금이 발생했다!!!!!

AWS EC2 프리티어 서버를 하나 만들었다. 잘 쓰고 있었다. 어느날 갑자기 아마존에서 $3을 가져가겠다고 문자가 왔다. 헉~~~~ EC2는 프리티어 아닌가? 왜 돈을 달라고 하지????? AWS 에 로그인하여 '서비스 찾기'..

saengjja.tistory.com

 

AWS에서 기본적인 알림은 보내주지만 이 번 기회에 '결제 알림' 을 설정하기로 했다.

'내 결제 대쉬보드' 로 이동하자

 

 

결제 대시보드로 이동 후 번호에 따라 '결제 기본설정' 클릭 -> '결제 알림받기' 체크 -> '기본 설정 저장' 클릭을 한다. 기본 설정 저장을 한 후 이제 '결제 알림 관리' 클릭하여  알림을 설정창으로 이동한다.

Posted by 생짜
|

AWS EC2 프리티어 서버를 하나 만들었다.

잘 쓰고 있었다. 어느날 갑자기 아마존에서 $3을 가져가겠다고 문자가 왔다. 헉~~~~ EC2는 프리티어 아닌가? 왜 돈을 달라고 하지?????

 

AWS 에 로그인하여 '서비스 찾기' 에서 빌링 시스템을 검색하여 확인해 봤다.

 

'Billing' 페이지에 들어간 후 '서비스별 이번 달 현재까지 소비' 부분의 '청구서 세부 정보'를 클릭한 후 요금이 청구된 달을 선택하면 요금이 적용된 세부 정보를 볼 수가 있다. 

 

나한테 발생한 요금은 아래와 같다.

 

실행되고 있지 않은 EC2에 연결되어 있는 Elastic IP Addresses 에서 요금이 발생 한 것이다. 시간당 0.005 $로...

 

 

나는 EC2에 Elastic IP Address를 연결만 해 놓으면 요금이 발생하지 않는 줄 알았다. 그게 아니였다.

 

Elastic IP Address에 연결된 EC2를 stop 시키면 이 역시 요금이 발생하는 것이었다.

 

Elastic IP Address는 요금이 발생하는 서비스이다. Elastic IP Address는 동적으로 IP가 할당되는 인스턴스를 위한 정적 IPv4 주소 서비스로 AWS 계정과 연결된다. 이 자원은 유니크한 자원이기 때문에 생성 후 인스턴스와 연결을 하지 않으면 요금이 발생한다. Elastic IP Address를 사용하면 EC2를 정적 IP로 사용할 수 있고 EC2에 연결해 놓았기 때문에 EC2를 무료로 사용하는 기간동안은 요금이 발생하지 않는다. 하지만 EC2를 사용하지 않고 stop 시키는 동안에도 Elastic IP Address 자원을 사용하고 있는 것이기 때문에 요금이 발생한다. 이 번에 아마존이 나한테 돈을 가져간 사유가 바로 이 것이다. EC2와 Elastic IP Address를 연결한 후 EC2를 stop 시켜 놓았던 것이다. 그래서 앞으로 일년 동안 EC2를 멈추지 않기로 했다. ㅋㅋㅋ

 

정리해보면...

  • Elastic IP Address는 요금이 발생하는 서비스이다.
  • 요금이 발생하는 사유는 생성하고 인스턴스에 연결해 놓지 않을 때 요금이 발생한다.
  • 인스턴스에 연결해 놓았지만 인스턴스가 실행중이지 않을 때 요금이 발생한다.

 

참고로 AWS의 프리 티어들을 정리한 사이트주소이다.

https://aws.amazon.com/ko/free/?all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc

 

AWS 프리 티어

프리 티어를 이용해 60가지가 넘는 제품을 체험하고 AWS에 구축할 수 있습니다. 사용하는 제품에 따라 세 가지 유형의 프리 티어 오퍼가 제공됩니다. 각 제품에 대한 자세한 내용은 아래를 참조하십시오.

aws.amazon.com

 

EC2는 월 750시간이 무료이고 EC2를 한달내내 사용해도 월 744시간 밖에 안된다. 결국 12개월 동안은 EC2가 공짜라는 소리이다.

 

참고로 AWS 프리티어를 사용시 요금이 발생할 수 있는 사항들은 다음에 정리해야 겠다.

 

Posted by 생짜
|

REST API가 기능 또는 기술인줄 알았다.

 

REST API는 규약이자 형식이며 지침이다. 프로토콜 조차도 되지 않는다. 프로토콜은 지키지 않으면 동작을 안하지만 REST API는 지키지 않는다고 동작을 안하는 것은 아니다. 그럼에도 불구하고 우리는 REST API를 지켜야 한다.

 

함수명과 인자값, 리턴값으로 무슨일을 하는 함수인지 알 수 있는 함수명 명명 규칙과 비슷하다. 안지킨다고 제재를 가하진 않지만 일하기에 불편을 감수해야 한다. 물론 혼자하는 일이라면 불편을 감수해도 괜찮다. 하지만 SW는 이제 혼자할 수 있는 규모를 벗어난 큰일이 되어 버렸기 때문에 우리는 항상 팀작업을 한다. 팀작업 아래에서는 규약과 형식을 지키는 것이 중요하다. 안지키면 지금도 욕먹지만 미래의 누군가에게도 오지게 욕을 먹는다. 

 

https://saengjja.tistory.com/370

 

REST? RESTful?(去去去中知 行行行裏覺)

'갑분싸'로 웹을 하게 되었는데 REST, RESTful이 뭔지 개념이 없다. ㅋ~~ 사실 웹자체에 개념이 없다. ㅎㅎ 거거거중지 행행행리각 - 가고 가고 가는 가운데 알게 되고 행하고 행하고 행하다보면 깨닫게 된다 - 란..

saengjja.tistory.com

 

 

Flask의 Blueprint는 쉽게 말해 모듈을 나누는 역할을 한다. 한 모듈에 거대하게 집중되어 있는 REST API method를 상상해보자 한 파일만 천 라인이 넘어간다면 보기 힘들 것이다. Blueprint를 이용해서 REST API의 URI에 맞게 모듈을 나누어 관리를 쉽게 하는 것도 좋은 방법일 것이다. 필요할 때 분리된 모듈을 버전별로 관리할 수도 있다.

 

Flask Blueprint를 사용하여 모듈을 기능별로 분리

 

Blueprint를 사용하기 전의 폴더 구조와 사용후의 폴더 구조를 설명했으니 이젠 바뀐 코드를 보자

webapp 폴더 아래의 __init__.py 파일

Blueprint를 적용하기 전의 __init__.py

Flask 객체인 app만 선언했다.

 

 

Blueprint 적용 후의 __init__.py

api_v1 패키지와 패키지 안에 선언한 api 모듈을 추가한다.

app에 resgister_blueprint 메소드를 사용하여 api 모듈을 등록한다. 이제 app으로 전달되어 오는 requests를 api 모듈로도 보낼 수 있는 준비를 했다. url_brefix는 Blueprint로 등록한 모듈에 requests URL이 전달 될 때 URI에 자동으로 붙는 URI이다. 잘 동작을 안한다. 내가 실수한 것인지 버전 차이인지는 찾아보고 있는 중이다. url_brefix가 잘 동작한다면 api의 버전관리가 무지 편해질 것 같다. 필요 없거나 버그가 있는 api는 폐기하고 Blueprint 등록하는 곳에서 url_brefix 만 변경해주면 될 것이기 때문이다.  

 

app_start.py 파일

Blueprint 적용 후

app_start.py 모듈에 있던 login, register, registerinfo 등등의 requests 함수들이 모두 사라졌다. Blueprint로 해당 모듈을 생성하고 해당 모듈로 모두 분리했다.

 

api_v1 폴더의 __init__.py 파일

Blueprint 로 api를 생성했다.

 

api_v1 폴더의 기능별로 분리한 모듈 파일

 

실제 모듈 소스이다. 래퍼가 @app에서 @api로 바뀌었다. 

이렇게 사용하여 app_start.py에서 사용하는 기능들을 모두 분리했다.

 

정확한 기술에 대해 알고 싶으면...

영문사이트 ---> https://flask.palletsprojects.com/en/1.0.x/blueprints/

 

Modular Applications with Blueprints — Flask Documentation (1.0.x)

Modular Applications with Blueprints Changelog Flask uses a concept of blueprints for making application components and supporting common patterns within an application or across applications. Blueprints can greatly simplify how large applications work and

flask.palletsprojects.com

한글 번역 사이트 ---> https://flask-docs-kr.readthedocs.io/ko/latest/blueprints.html#id3

 

블루프린트를 가진 모듈화된 어플리케이션 — Flask 0.11-dev documentation

블루프린트는 리소스 또한 제공할 수 있다. 때때로 여러분은 단지 리소스만을 제공하기 위해 블루프린트를 사용하고 싶을 수도 있다. 블루프린트 리소스 폴더 보통 어플리케이션처럼, 블루프린트는 폴더안에 포함되도록 고려된다. 다수의 블루프린트이 같은 폴더에서 제공될 수 있지만, 그런 경우가 될 필요도 없고 보통 권고하지 않는다. 폴더는 보통 __name__ 인 Blueprint 에 두번째 인자로 생각된다. 이 인자는 어떤 논리적인 파이썬 모듈이나 패키지가 블루프

flask-docs-kr.readthedocs.io

 

Posted by 생짜
|

'갑분싸'로 웹을 하게 되었는데 REST, RESTful이 뭔지 개념이 없다. ㅋ~~ 사실 웹자체에 개념이 없다. ㅎㅎ

 

거거거중지 행행행리각 - 가고 가고 가는 가운데 알게 되고 행하고 행하고 행하다보면 깨닫게 된다 - 란 뜻이다. 익히고 익히다 보면 알게되고 알게된 상태에서 익히고 익히다 보면 숙달하게 되고 또 익히고 익히면 통달하게 된다.

 

 

그러니 일단 뭔지 한번 읽고읽어보자

 

 

https://docs.microsoft.com/ko-kr/azure/architecture/best-practices/api-design

 

API 디자인 지침 - Best practices for cloud applications

잘 디자인된 Web API를 만드는 방법에 관한 지침입니다.

docs.microsoft.com

https://docs.microsoft.com/ko-kr/azure/architecture/best-practices/api-implementation

 

API 구현 지침 - Best practices for cloud applications

API를 구현 하는 방법에 대 한 지침입니다.

docs.microsoft.com

 

 

REST는 정보들을 주고 받는데 있어서 사용되는 형식이자 규약이다. 처음에는 REST를 기능 또는 기술로 인식을 하고 있었다. 기술이나 제품이 아니라 형식이기 때문에 어떤 프레임워크를 쓰든 형식에 맞춰서 사용만 하면 오만가지에서 다 사용할 수 있다. 

 

REST의 가장 중요한 특성은 각 동작이 어떤 동작이나 정보를 위한 것인지를 요청하는 모습 자체로 추론이 가능하다는 것이다. 요청을 보낸 주소만으로도 이 요청이 어떤 요청인지 파악이 가능하도록 만들어야 한다.

 

REST API는 리소스를 중심으로 디자인 한다.(무슨 말인지?) REST는 말 그대로 규약으로 지키지 않는다고 웹이 동작하지 않는 것은 아니다. 단지 RESTful하지 않은 API라는 소리를 들을 뿐...

 

http 기반이기 때문에 주소가 나오고 주소의 '/' 뒤에 식별자들이 나오는데 식별자로 리소스를 명을 사용한다. 세부항목으로는 해당 리소스의 ID를 사용하면 된다.

 

리소스를 중심으로 디자인한다는 말은 URI는 리소스 중심으로 만들고(URI에 리소스 동작에 대한 설명은 없어야 한다) 리소스에 대한 동작은 HTTP의 method로 지원해야 한다. 각 CRUD method는 각각의 의미가 있기 때문에 각 의미에 맞추어 코드를 개발하면 된다.

 

그렇기 때문에 리소스 URI는 동사(리소스에 대한 작업)가 아닌 명사(리소스)를 기반으로 기술되어야 한다.

이제 '감'이 오기 시작한다.

Posted by 생짜
|

부트스트랩?

karma( 업 )/Web 2019. 10. 21. 14:01

'웹알못'으로 웹은 생각보다 배울게 많다는 것을 알았다. 하긴 용어부터 낯서니 할말 다했지....

Front-end / back-end 는 물론이고 리액트, 디장고, 부트스트랩 등등 모르는 용어가 너무 많다.

새로운 분야로 들어갈 때 용어정리만 해도 반은 먹고 들어가고 어디가서 전문가인척 대화도 할 수 있다고 생각한다. ㅋ~

 

back-end는 python의 Flask와 DJango로 퉁치고 있는데 front-end가 뭔지 살펴보다 부트스크랩을 사용해 봤다.

front-end는 결국 HTML / CSS / Java Script 등으로 이루어 져 있다고 생각했는데 부트스트랩이 뭐지? 프레임워크인가?

 

부트스트랩는 한마디로 '웹사이트 개발시의 프레임워크' 로 정의할 수 있다. 그렇다 순수하게 front-end단의 웹사이트/웹페이지 개발에 필요한 프레임워크가 부트스트랩이다. 즉 부트스트랩은 HTML/CSS/Java Sctrip의 개발을 편하고 쉽게 할 수 있도록 라이브러리를 모아놓은 프레임워크이다. 

 

그럼 어떻게 사용하나? 부트스트랩은 웹사이트 개발시에 가장 많이 사용하는 HTML/CSS/JS를 미리 만들어 놓았고 사용자는 다운로드 또는 CDN 방식으로 링크해서 그냥 사용하면 된다.

 

예를 들어 버튼을 하나 만들고 CSS를 적용한다고 생각해보자. 일일이 개발자가 HTML의 모든 태그, class, id에 CSS를 만들어 주면 상당한 코딩을 해야 할 것이다. ( 물론 나같은 사람은 코딩양보다는 디자인이 쾅이라 부트스트랩을 사용할 것이다. )

 

부트스트랩을 사용한다면 아래와 같이 링크만 걸어주면 된다.

 

코드에서 보듯이 부트스트랩 CSS를 링크로 걸어주고 CSS를 적용할 클스만 추가하면 된다. 버튼의 class 에 부트스트랩을 적용해 주었다. 이제 버튼은 부트스트랩의 디자인이 적용되어 이쁘게 표현될 것이다.

 

사용자는  어떤 클래스인지 확인 후 해당 태그에 클래스만 추가하면 되는 것이다. 

 

아~~~ 부트스트랩까지 공부할 줄이야 ㅋ~~~~

 

 

 

Posted by 생짜
|

AWS에 face_recognition을 설치하려고 하니 dlib에서 오류가 나서 멈췄다.

face_recognition설치하기 전에 먼저 pip로 dlib를 설치해야 할 것 같다.

 


pip install dlib

 

원래 pip install face_recognition을 하면 face_recognition 설치할 때 dlib도 설치하는 것 같은데 설치가 동작을 안하는 것 같아 따로 dlib 설치 시도를 했다. pip가 설치를 시작하더니 끝낼 생각을 안한다...하~~~ 돌겠다.

결국 포기하고  https://pip.aws.lolatravel.com/pip/dev/+simple/dlib/ 사이트에 들어가 dlib-19.0.0.tar.gz 을 다운받는다. dlib를 다운 받았다면 컴파일을 하기 위해 CMAKE를 설치한다.

 

 

sudo apt-get install build-essential cmake 

sudo apt-get install libgtk-3-dev 

sudo apt-get install libboost-all-dev 

 

 

CMAKE 설치가 끝나면 dlib-19.0.0.tar.gz 압축을 푼다.


tar xvf dlib-19.0.0.tar.gz

cd dlib-19.0.0

python3 setup.py install

mkdir shared_build
cd shared_build
cmake -DBUILD_SHARED_LIBS=1 -DUSE_AVX_INSTRUCTIONS=ON ..
cmake –build . –config Release
make install

 

고생했다.  이제 다시


pip intall face_recognition

 

하면 설치 끝이다.

 

만약 Windows에서 face_recognition 을 설치하려고 하는데 dlib이 말썽이라면...이 곳에 가면 해결 될 것이다.

http://blog.naver.com/PostView.nhn?blogId=kkyy3402&logNo=221679282282&categoryNo=0&parentCategoryNo=0&viewDate=¤tPage=1&postListTopCurrentPage=1&from=postView&userTopListOpen=true&userTopListCount=5&userTopListManageOpen=false&userTopListCurrentPage=1

Posted by 생짜
|

Working with Models, SQLAlchemy, and Hyperlinked APIs in Flask

In this chapter, we will expand the capabilities of the RESTful API that we started in the previous chapter. We will use SQLAlchemy as our ORM to work with a PostgreSQL database, and we will take advantage of advanced features included in Flask and Flask-RESTful that will allow us to easily organize code for complex APIs, such as models and blueprints.

We will go through the following topics in this chapter:

  • Design a RESTful API to interact with a PostgreSQL 10.5 database
  • Understand the tasks performed by each HTTP method
  • Install packages with the requirements.txt file to simplify our common tasks
  • Create the database
  • Configure the database
  • Write code for the models with their relationships
  • Use schemas to validate, serialize, and deserialize models
  • Combine blueprints with resourceful routing
  • Understand and configure resourceful routing
  • Register the blueprint and run migrations
  • Verify the contents of the PostgreSQL database
  • Create and retrieve related resources

 

Designing a RESTful API to interact with a PostgreSQL 10.5 database

So far, our RESTful API has performed CRUD operations on a simple in-memory dictionary that acted as a data repository. The dictionary is never persisted and, therefore, the data is lost whenever we restart our Flask development server.

Now, we want to create a more complex RESTful API with Flask RESTful to interact with a database model that allows us to work with notifications that are grouped into notification categories. In our previous RESTful API, we used a string attribute to specify the notification category for a notification. In this case, we want to be able to easily retrieve all the notifications that belong to a specific notification category and, therefore, we will have a relationship between a notification and a notification category.

We must be able to perform CRUD operations on different related resources and resource collections. The following table enumerates the resources and the class name that we will create to represent the model:

 

 

The notification category (NotificationCategory) just requires the following data:

  • An integer identifier
  • A string name

We need the following data for a notification (Notification):

  • An integer identifier
  • A foreign key to a notification category (NotificationCategory)
  • A string message
  • A TTL (short for Time to Live), that is, a duration in seconds that will indicate the amount of time the notification message has to be displayed on the OLED display
  • A creation date and time. The timestamp will be added automatically when adding a new notification to the collection
  • An integer counter that indicates the times when the notification message has been displayed on the OLED display
  • A bool value indicating whether the notification message was displayed at least once on the OLED display

We will take advantage of many packages related to Flask RESTful and SQLAlchemy that make it easier to serialize and deserialize data, perform validations, and integrate SQLAlchemy with Flask and Flask RESTful. This way, we will reduce the boilerplate code.

Posted by 생짜
|

sample Source:

Hands-On-RESTful-Python-Web-Services-Second-Edition-master.zip
1.19MB

 

Developing RESTful APIs and Microservices with Flask 1.0.2

(Flask 1.0.2를 사용하여 RESTful API 및 마이크로 서비스 개발)

  • Flask와 같은 경량 프레임 워크는 RESTful API를 제공하는 마이크로 서비스를 작성하기위한 이상적
  • Flask 1.0.2 및 Flask-RESTful 확장을 사용하여 작업
  • CRUD ( Create, Read, Update 및 Delete의 축약 ) 작업 을 수행하는 RESTful 웹 API  작성 
  • Flask와 함께 RESTful API를 제공하는 마이크로 서비스를 개발하기위한 기준을 설정
  • Flask-RESTful 확장으로 Flask에서 CRUD 작업을 수행하는 RESTful API 설계
  • 각 HTTP 메소드가 수행하는 작업 이해
  • 마이크로 서비스 이해
  • 가벼운 가상 환경으로 작업, Flask 및 Flask-RESTful 확장을 사용하여 가상 환경 설정
  • 열거 가능한 응답을위한 상태 코드 선언모델 만들기
  • dictionary 를 저장소로 사용
  • 출력 필드 구성
  • 플라스크 플러그 가능 뷰 위에서 resourceful routing work
  • 리소스 라우팅 및 엔드 포인트 구성
  • Flask API에 대한 HTTP 요청
  • Command line Tool 에서 Flask API와 상호 작용하는 작업
  • GUI 도구를 사용하여 Flask API와 상호 작용
  • 다른 프로그래밍 언어와 API를 사용

 

 

Designing a RESTful API to interact with a simple data source

(심플 데이터 소스와 상호 작용하는 RESTful API 디자인)

Flask 마이크로 프레임 워크를 사용하여 특정 작업을보다 쉽게 ​​수행 할 수있는 Flask 용 확장 기능이 많이 있습니다. Flask-RESTful을 활용하여 RESTful API를 구축할 것이며 Python dictionary를 데이터 소스로 사용합니다. 앞에서 설명한대로 다음 예제에서보다 복잡한 데이터 소스를 사용하여 작업합니다.

먼저, 우리는 우리의 주요 자원, 통지에 대한 요구 사항을 지정해야합니다. 알림에는 다음과 같은 속성 또는 필드가 필요합니다.

  • An integer identier
  • A string message
  • A TTL (short for Time to Live), that is, a duration in seconds that will indicate the time the notification message has to be displayed on the OLED display.
  • A creation date and time. The timestamp will be added automatically when adding a new notification to the collection.
  • A notification category description, such as Warning or Information.
  • An integer counter that indicates the times when the notification message has been displayed on the OLED display.
  • A Boolean value that indicates whether the notification message was displayed at least once on the OLED display.

 

API의 첫 번째 버전에서 지원해야하는 메소드에 대한 HTTP verv, 범위 및 의미

각 메소드는 HTTP verb와 범위로 구성되며 모든 메소드는 모든 알림 및 콜렉션에 대해 잘 정의 된 의미를 갖는다. API에서 각 알림에는 고유 한 URL이 있다.

 

 

Understanding the tasks performed by each HTTP method

(각 HTTP 메소드가 수행하는 태스크 이해)

'http://localhost:5000/service/notifications/' 알림 모음의 URL 이라고 가정 시 이전 URL에 숫자를 추가하면 ID가 지정된 숫자 값과 같은 특정 알림을 식별한다. 예를 들어, 'http://localhost:5000/service/notifications/5' ID가 5인 알림을 식별합니다.

API가 컬렉션을 URL의 컬렉션의 단일 리소스와 차별화하기를 원다. 컬렉션을 참조 할 때 'http://localhost:5000/service/notifications/' 와 같이 슬래시 (/)를 URL의 마지막 문자로 사용한다 . 컬렉션의 단일 리소스를 참조 할 때 'http://localhost:5000/service/notifications/5'와 같이 슬래시 (/)를 URL의 마지막 문자로 사용하지 않는다.

새로운 notifications은 HTTP verb( POST) 및 request URL ( http://localhost:5000/service/notifications/ )을 사용 하여 HTTP 요청을 작성하고 보내야한다 . 또한 새로운 notification을 만들려면 필드 이름과 값을 JSON 키-값 쌍으로 제공해야한다. 요청 결과, 서비스는 필드에 제공된 값의 유효성을 검사하여 유효한 알림인지 확인하고 메모리 내 notification dictionary 에 유지한다. 서비스는 201 Created 상태 코드와 최근에 추가 된 notification이 JSON에 직렬화되어있는 JSON 본문 (서비스에 의해 notification 객체에 자동으로 생성 된 할당 된 ID 포함)을 반환한다.

 

HTTP verv( GET) 및 request URL ( http://localhost:5000/service/notifications/{id} )을 사용 하여 HTTP 요청을 작성하여 보내면 URL 장소의 지정된 숫자 값{id}과 일치하는 ID를 가진 notification을 검색한다. 예를 들어 'http://localhost:5000/service/notifications/23' request URL 을 사용하는 경우 서비스는 dictionary에서 ID 23과 일치하는 알림을 검색하고 알림이 발견되면 서비스는 알림 객체를 JSON으로 직렬화하고 직렬화 된 알림 객체와 함께 200 OK 상태 코드와 JSON 본문을 반환 한다. 지정된 ID 또는 기본 키와 일치하는 알림이 없으면 서비스는 404 Not Found상태 만 반환 한다.

 

HTTP 동사 ( PATCH ) 및 request URL ( http://localhost:5000/service/notifications/{id} )을 사용 하여 HTTP request를 작성하고 보내야 URL 장소의 지정된 숫자 값{id}과 일치하는 알림에 대한 하나 이상의 필드를 업데이트 할 수 있다 . 또한 JSON 키-값 쌍을 업데이트 할 필드 이름과 새 값을 제공해야한다. 요청 결과, 서비스는 필드에 제공된  값의 유효성을 검사 하고 지정된 ID와 일치하는 notification에서 필드를 업데이트하며 유효한 notification 인 경우 dictionary에서 알림을 업데이트한다. 서비스는 200 OK 상태 코드와 최근 업데이트 된 알림이 JSON으로 직렬화 된 JSON 본문을 반환한다. 업데이트 할 필드에 유효하지 않은 데이터를 제공하면 서비스는 400 잘못된 요청 상태 코드를 반환한다. 서비스가 지정된 ID를 가진 알림을 찾지 못하면 404 Not Found 상태 만 반환한다.

PATCH 메서드를 사용하면 알림의 두 필드 (알림 메시지가 인쇄 된 시간을 나타내는 정수 카운터)와 알림 메시지가 한 번 이상 인쇄되었는지 여부를 지정하는 부울 값을 쉽게 업데이트 할 수 있다.

 

HTTP verb( DELETE) 및 request URL ( http://localhost:5000/service/notifications/{id} )을 사용 하여 HTTP 요청을 작성하고 보내한다. URL 장소의 지정된 숫자 값{id}과 일치하는 ID를 가진 notification을 제거한다 . 예를 들어 http://localhost:5000/service/notifications/27 요청 URL 을 사용하는 경우 서비스는 ID27과 일치하는 notification을 삭제한다. 요청의 결과로 서비스는 dictinary에서 지정된 ID의 notificantion을 검색한다. notification이 발견되면 서비스는 dictionary에 notification 개체와 관련된 항목을 삭제하도록 요청하고 서비스는 204 No Content상태 코드를 반환한다 . 지정된 ID와 일치하는 알림이 없으면 서비스는 404 Not Found상태 만 반환 합니다.

 

 

Understanding microservices

(마이크로 서비스 이해)

마이크로 서비스 아키텍처는 크고 복잡한 웹 서비스로 작업하는 대신, 작고 느슨하게 결합 된 서비스 모음을 개발하여 복잡한 응용 프로그램에 필요한 모든 기능을 지속적으로 제공하고 단순화하는 방식으로 구현할 것을 제안한다.

RESTful API는 마이크로 서비스 아키텍처의 필수 요소이며이 아키텍처로 전환 할 때 Python이 매우 인기가 있다. 마이크로 서비스는 구체적이고 제한된 목적을 수행하는 RESTful API를 캡슐화 할 수 있다. 마이크로 서비스는 독립적이며 유지 보수가 쉽고 지속적인 제공을 지원한다.

마이크로 서비스 아키텍처를 구현하는 방법에는 여러 가지가 있다. Flask와 Python으로 개발 된 RESTful API를 마이크로 서비스로 캡슐화하는 방법을 배운다. 이러한 방식으로 RESTful API를 개발하고이를 독립적이고 유지 관리하기 쉬운 마이크로 서비스를 구축하는 데 필수적인 요소로 사용함으로써 기술을 활용할 수 있다.

 

 

Working with lightweight virtual environments

(가벼운 가상환경 작업)

다양한 프레임 워크, 패키지 및 라이브러리를 사용하여 RESTful 웹 API 및 마이크로 서비스를 작성하므로 Python 가상 환경과 함께 작업하여 각 개발 환경을 분리하는 것이 편리하다. Python 3.3은 경량 가상 환경을 도입했으며 후속 Python 버전에서 개선되었다. 이러한 가상 환경에서 작업하므로 Python 3.7.1 이상이 필요하다

anaconda / virtualenv 는 외부 가상환경으로 가상환경을 빌딩하고 활성화해야 한다. venv는 Python3에 빌트인되어 있기 때문에 설치하지 않아도 된다. 

 

 

pip(package installer for Python)?

아주 예전에는 vc++6.0 하나만 설치하면 끝이었던 시절도 있었다. 물론 Setting... 등에서 따로 환경을 설정해 주기는 했다. 그 외 Embedded를 한다면 따로 설치해야할 개발환경이 존재하긴했다. 그러나 지금처럼..

saengjja.tistory.com

 

 

Python, Virtualenv, OpenCV, PyCharm 설치( 2 )

Python을 다운 받아 설치한다.( Download Site ) 링크를 클릭하여 설치할 Python을 다운 받는다. 나는 3.7.3 windwos 버전을 받아 설치했다. 설치시 꼭 환경 설정 체크박스에 체크하자. 안그러면 설치 후 따로 환..

saengjja.tistory.com

 

 

Python, Virtualenv, OpenCV, PyCharm 설치( 3 )

Python, Virtualenv, OpenCV, PyCharm을 설치하고 사용하는 것이, 이게 이렇게 길게 설명해야 할 것인지 몰랐다. 이제 마지막이다. 파이참 설치 후 새로운 virtualenv 환경을 만들어서 파이참에 연결해보자 파이참..

saengjja.tistory.com

 

  • Python3 빌트인 venv 가상환경 생성

 

  • Python3 빌트인 venv 가상환경 활성환

 

 

Setting up a virtual environment with Flask and Flask-RESTful

(Flask 및 Flask-RESTfull을 사용하여 가상환경 설정)

만들어진 가상환경에 필요한 lib를 설치하자. 설치해야하는 패키지 세트를 지정하기 위해 'requirements.txt' 파일을 작성한다. 

자주 사용하는 편집기를 사용하여 생성한 가상 환경의 루트 폴더 내에 새 텍스트 파일(requirements.txt)을 만든다. 다음 행은 패키지를 선언하는 파일의 내용과 API에 필요한 버전을 정의한다.

각 라인은 설치해야 할 패키지와 버전을 나타낸다. 지정된 버전이 설치되어 있는지 확인하기 위해 '==' 연산자를 사용하여 설치하고자 하는 특정 버전을 명시한다. 설치하고자 하는 특정버전을 명시하지 않으면 최신 버전으로 설치된다. 다음 표에는 요구 사항으로 지정한 패키지 및 버전 번호가 요약되어 있습니다.

이제 pip 명령을 이용하여 requirements.txt파일에 명시한 패키지를 설치한다. 

성공적으로 설치된다면 아래와 같은 화면을 볼 수 있다.

 

텍스트 파일을 이용하여 패키지를 전부 설치하지 않고 pip 명령어를 사용하여 개별로 설치할 수도 있다.

pip install Flask

 

 

Declaring status codes for the responses with an enumerable

(상태 응답 코드 ENUM으로 정의하기)

Flask 나 Flask-RESTful은 다른 HTTP 상태 코드에 대한 변수 선언을 포함하지 않기 때문에 숫자를 상태 코드로 반환하지 않는다.  코드를 읽고 이해하기 쉽도록하기 위해 Python 3.4 부터 추가된 enum 을 이용하여 HTTP 상태 코드를 사용할 것이다. 상태코드를 정의하기 위해선 enum을 이용한 HTTP 상태 코드를 나타내는 고유한 이름 및 code를 정의하는 클래스를 선언한다. 

먼저 생성한 가상 환경의 루트 폴더 내에 'service' 폴더를 만든다. 'service' 폴더 내에 HTTP 상태 코드 값을 정의한  http_status.py 파일을 만든다. 아래 이미지는 enum.Enum 클래스를 상속하여 정의한  HttpStatus 클래스를 선언하는 코드를 보여준다.

정의한 파일은 '가상환경 root/service/http_status.py' 에 포함하면 된다.

HttpStatus 클래스는 다른 HTTP 상태 코드를 나타내는 고유 한 이름 및 값 세트를 정의한다. 변수명은 설명을 접두사로 사용하고 HTTP 상태 코드 번호를 접미사로 사용한다. 예를 들어, HTTP 200 OK 상태 코드의 200 값은 HttpStatus.ok_200 이름에 정의되고 HTTP 404 Not Found 상태 코드는 HttpStatus.not_found_404 이름에 정의한다.

코드에 필요할 때마다 열거 형에 정의 된 이름을 사용하여 특정 상태 코드를 반환한다. 

예를 들어 HTTP 404 Not Found 상태 코드를 반환해야하는 경우 404 대신 HttpStatus.not_found_404.value를 반환한다. 각 코드의 의미를 기억할 필요가 없으므로 코드를 이해하는 것이 더 쉬울 것이다. 

또 HttpStatus클래스는 열거 형에 정의 된 HTTP 상태 코드를 인수로받는 5 개의 정적 메서드를 선언하고 상태, 코드, 정보, 성공, 리디렉션, 클라이언트 오류 또는 서버 오류 중 어느 범주에 속하는지를 결정한다.

 

 

Creating the model

(모델 만들기)

notification을 나타낸는데 사용할 간단한 'NotificatiionModel 클래스'를 만든다. 데이터베이스 나 파일에서 모델을 유지하지 않으므로이 경우 클래스는 필요한 속성 만 제공하고 매핑 정보는 제공하지 않는다. 'service' 폴더에 models.py 파일을 만든다. 'service/models.py' 파일에서 NotificationModel 클래스를 작성하는 코드다. 

 

'NotificationModel 클래스'는 생성자, 즉 __init__ 메서드를 선언한다. 이 메소드는 많은 인수를 수신하여 message, ttl, creation_date 및 notification_category와 같은 이름으로 속성을 초기화하는 데 사용한다. id 속성은 0으로, displayed_times는 0으로, shown_once는 False로 설정된다. API 호출로 생성 된 새로운 알림마다 식별자를 자동으로 증가시킨다.

 

 

Using a dictionary as a repository

(저장소로 사전 사용하기)

이제 메모리 내 dictionary에 NotificationModel 인스턴스를 유지하는 데 사용할 NotificationManager 클래스를 만든다. API 메소드는 NotificationManager 클래스의 메소드를 호출하여 NotificationModel 인스턴스를 검색, 삽입, 업데이트 및 삭제한다. 'service' 폴더에 service.py 파일을 작성한다.

 

 

NotificationManager 클래스는 last_id 클래스 속성을 선언하고이를 0으로 초기화한다. 이 클래스 속성은 생성되어 dictionary에 저장된 NotificationModel 인스턴스에 할당 된 마지막 ID를 저장한다. 생성자, 즉 __init__ 메소드는 notification 속성을 빈 사전으로 작성하고 초기화한다.

이 코드는 클래스에 대해 다음 세 가지 메소드를 선언한다.

 

 

  • insert_notification :이 메소드는 notification 인수에서 최근에 작성된 NotificationModel 인스턴스를받는다. 이 코드는 last_id 클래스 속성의 값을 증가시킨 다음 결과 값을 수신 된 알림의 ID에 할당한다. 이 코드는 self .__ class__를 사용하여 현재 인스턴스의 유형을 참조한다. 마지막으로, 코드는 self.notifications 사전에서 생성 된 ID last_id로 식별 된 키에 값으로 notification을 추가한다.
  • get_notification :이 메소드는 self.notifications dictionary에서 검색해야하는 notification ID를받는다. 이 코드는 데이터 소스로 사용중인 self.notifications dictionary에서 수신 된 ID와 일치하는 키와 관련된 값을 리턴한다.
  • delete_notification :이 메소드는 self.notifications dictionary에서 제거되어야하는 notification ID를받는다. 이 코드는 키가 데이터 소스로 사용중인 self.notifications dictionary에 수신 된 ID와 일치하는 키-값 쌍을 삭제한다.

 

self.notifications dictionary에 이미 저장된 NotificationModel 인스턴스의 속성을 변경하기 때문에 알림을 업데이트하는 메소드가 필요하지 않다. 사전dictionary에 저장된 값은 업데이트중인 NotificationModel 인스턴스에 대한 참조이므로 사전에서 인스턴스를 업데이트하기 위해 특정 메소드를 호출 할 필요는 없다. 그러나 데이터베이스를 사용하는 경우 데이터 저장소 또는 데이터베이스 서비스에 대한 업데이트 메소드를 호출해야합니다.

 

 

Configuring output fields

(출력 필드 구성)

이제 NotificationModel 인스턴스를 반환 할 때 Flask-RESTful이 응답에 렌더링 할 데이터를 제어하는 데 사용할 notification_fields dictionary을 만든다. 이전에 작성한 'service/service.py' 파일을 열고 다음 코드를 기존 코드에 추가한다.

 

 

flask_restful.fields 모듈에 선언 된 문자열과 클래스의 키-값 쌍으로 notification_fields dictionary를 선언했다. 키는 NotificationModel 클래스에서 렌더링하려는 속성의 이름이며 값은 필드의 값을 형식화하고 반환하는 클래스이다. 이전 코드에서는 키에서 지정된 필드의 값을 형식화하고 반환하는 다음 클래스로 작업했다.

 

  • integer. 정수 : 정수 값을 출력한다.
  • fields.Url : URL의 문자열 표현을 생성한다. 기본적으로이 클래스는 요청중인 자원에 대한 상대 URI를 생성한다. 코드는 엔드 포인트 인수에 'notification_endpoint'를 지정한다. 이런 식으로 클래스는 지정된 엔드 포인트 이름을 사용한다. 이 엔드 포인트는 나중에 service.py 파일에서 선언한다. 생성 된 URI에 호스트 이름을 포함하고 싶지 않으므로 절대 부울 속성의 기본값 인 False를 사용한다.
  • fields.DateTime : 형식화 된 날짜 및 시간 문자열을 기본 RFC 822 형식으로 UTC로 출력한다.
  • fields.Boolean : 부울 값의 문자열 표현을 생성한다.

 

'uri'필드는 fields.Url을 사용하며 NotificationModel 클래스의 속성과 연관되는 대신 지정된 엔드 포인트와 관련된다. 지정된 필드 이름이 NotificationModel 클래스에 속성이없는 유일한 경우이다. 키로 지정된 다른 문자열은 notification_fields dictionary을 사용하여 최종 직렬화 된 응답 출력을 구성 할 때 출력에 렌더링하려는 모든 속성을 나타낸다.

notification_fields dictionary룰 선언하면 다음 코드 행이 앞에서 만든 notification_manager라는 NotificationManager 클래스의 인스턴스를 만든다. 이 인스턴스를 사용하여 NotificationModel 인스턴스를 작성, 검색 및 삭제한다.

 

 

Working with resourceful routing on top of Flask pluggable views

(플라스크 플러그 기능 뷰 위에서 리소스가 풍부한 라우팅 작업)

Flask-RESTful은 Flask 플러그 가능 뷰 위에 구축 된 리소스를 RESTful API의 기본 빌딩 블록으로 사용한다. flask_restful.Resource 클래스의 하위 클래스를 만들고 지원되는 각 HTTP verb에 대한 메서드를 선언하면된다.

이제 알림 모음을 나타내는 데 사용할 NotificationList 클래스를 만든다. 이전에 작성된 service / service.py 파일을 열고 다음 행을 추가한다.

Notification 클래스는 flask_restful.Resource 수퍼 클래스의 하위 클래스이며, 동일한 이름의 HTTP 메소드가 표시된 자원에 대한 요청으로 도착할 때 호출 될 다음 세 가지 메소드를 선언한다.

 

  • get :이 메소드는 id 인수에서 검색해야하는 알림의 ID를받는다. 요청 된 ID를 가진 알림이없는 경우 코드는 self.abort_if_notification_not_found 메소드를 중단한다. notification이 존재하는 경우, 코드는 id가 notification_manager.get_notification 메소드에 의해 리턴 된 지정된 id와 일치하는 NotificationModel 인스턴스를 리턴한다. get 메소드는 notification_fields를 인수로 사용하여 @marshal_with 데코레이터를 사용한다. 데코레이터는 NotificationModel 인스턴스를 가져 와서 notification_fields dictionary에 지정된 필드 필터링 및 출력 형식을 적용한다.
  • delete :이 메소드는 id 인수에서 삭제해야하는 알림의 ID를 받는다. 요청 된 ID를 가진 알림이없는 경우 코드는 self.abort_if_notification_not_found 메소드를 중단한다. 알림이 존재하는 경우 코드는 수신 한 ID를 인수로 사용하여 notification_manager.delete_notification 메소드를 호출하여 데이터 저장소에서 NotificationModel 인스턴스를 제거한다. 그런 다음 코드는 빈 응답 본문과 204 콘텐츠 없음 상태 코드로 구성된 튜플을 반환한다. 튜플에 반환 된 상태 코드는 HttpStatus.no_content_204.value로 지정된다. 열거 형의 값인 204를 반환하기 때문이다. 튜플에 여러 개의 반환 값을 사용하여 응답 코드를 설정했다.
  • patch :이 메소드는 id 인수에서 업데이트 또는 패치해야하는 알림의 ID를 받는다. 요청 된 ID를 가진 알림이없는 경우 코드는 self.abort_if_notification_not_found 메소드를 중단한다. notification이 존재하는 경우, 코드는 id가 notification_manager.get_notification 메소드에 의해 리턴 된 지정된 id와 일치하는 NotificationModel 인스턴스를 notification 변수에 저장한다. 다음 줄은 parser라는 flask_restful.reqparse.RequestParser 인스턴스를 만든다. RequestParser 인스턴스를 사용하면 이름과 형식으로 인수를 추가 한 다음 요청으로받은 인수를 쉽게 구문 분석 할 수 있다. 이 코드는 parser.add_argument 메소드를 인수 이름과 구문 분석하려는 4 개의 인수 유형으로 4 번 호출한다. 그런 다음 코드는 parser.parse_args 메소드를 호출하여 요청의 모든 인수를 구문 분석하고 리턴 된 사전 (dict)을 args 변수에 저장합니다. 이 코드는 NotificationModel 인스턴스의 args dictionary에 새 값이있는 모든 속성 (알림)을 업데이트합니다. 요청에 특정 필드에 대한 값이 포함되지 않은 경우 코드는 None 값을 고려하지 않기 때문에 코드가 관련 속성을 변경하지 않는다. 요청에는 값으로 업데이트 할 수있는 4 개의 필드가 포함될 필요가 없다. 이 코드는 업데이트 된 알림을 반환한다. patch 메소드는 notification_fields를 인수로 사용하여 @marshal_with 데코레이터를 사용한다. 데코레이터는 NotificationModel 인스턴스, 알림을 가져 와서 notification_fields dictionary에 지정된 필드 필터링 및 출력 형식을 적용한다.

 

앞에서 설명한 것처럼 세 가지 메서드는 내부 abort_if_notification_not_found 메서드를 호출한다.이 메서드는 id 인수에서 기존 NotificationModel 인스턴스의 ID를 받는다. 수신 된 id가 notification_manager.notifications dictionary의 키에없는 경우, 메소드는 http_status_code 인수로 HttpStatus.not_found_404.value와 함께 flask_restful.abort 함수를 호출하고 지정된 ID의 알림이 존재하지 않음을 나타내는 메시지를 호출한다. 중단 기능은 수신 된 http_status_code에 대해 HTTPException 예외를 발생시키고 추후 처리를 위해 추가 키워드 인수를 예외에 첨부한다. 이 경우 HTTP 404 Not Found 상태 코드를 생성한다.

get 및 patch 메소드는 @marshal_with 데코레이터를 사용한다.이 데코레이터는 단일 데이터 오브젝트 또는 데이터 오브젝트 목록을 사용하고 인수로 지정된 필드 필터링 및 출력 형식을 적용한다. 마샬링은 사전 (dict) 과도 작동 할 수 있다. 두 방법 모두에서 notification_fields를 인수로 지정 했으므로 코드는 id, uri, message, ttl, creation_date, notification_category, displayed_times 및 displayed_once 필드를 렌더링한다.

@marshal_with 데코레이터를 사용할 때마다 HTTP 200 OK 상태 코드가 자동으로 반환된다.
@marshal_with (notification_fields) 데코레이터가있는 다음 return 문은 반환 된 객체 (알림) 뒤에 상태 코드를 지정하지 않았기 때문에 HTTP 200 OK 상태 코드를 반환한다.

다음 줄은 @marshal_with (notification_fields) 데코레이터로 실제로 실행되는 코드이며 데코레이터로 작업하는 대신 코드를 사용할 수 있다.

예를 들어, @marshal_with 데코레이터를 사용하는 대신 이전 줄에 표시된대로 marshal 함수를 호출하면 코드에서 동일한 결과가 생성된다.

이제 알림 모음을 나타내는 데 사용할 NotificationList 클래스를 만든다. 이전에 작성된 service / service.py 파일을 열고 다음 행을 추가한다.

NotificationList 클래스는 flask_restful.Resource 수퍼 클래스의 서브 클래스이며 동일한 이름의 HTTP 메소드가 표시된 자원에 대한 요청으로 도착할 때 호출 될 다음 두 가지 메소드를 선언한다.

 

  • get :이 메소드는 notification_manager.notifications 사전에 저장된 모든 NotificationModel 인스턴스가있는 목록을 리턴한다. get 메소드는 notification_fields를 인수로 사용하여 @marshal_with 데코레이터를 사용한다. 데코레이터는 반환 된 목록에서 각 NotificationModel 인스턴스를 가져 와서 notification_fields에 지정된 필드 필터링 및 출력 형식을 적용한다.
  • post :이 메소드는 parser라는 flask_restful.reqparse.RequestParser 인스턴스를 만든다. RequestParser 인스턴스를 사용하면 이름과 유형으로 인수를 추가 한 다음 POST 요청으로 수신 된 인수를 쉽게 구문 분석하여 새 NotificationModel 인스턴스를 작성할 수 있다. 이 코드는 parser.add_argument를 세 번 호출하며, 인수 이름과 구문 분석 할 세 인수의 유형을 사용한다. 그런 다음 코드는 parser.parse_args 메소드를 호출하여 요청의 모든 인수를 구문 분석하고 리턴 된 사전 (dict)을 args 변수에 저장한다. 이 코드는 사전의 구문 분석 된 인수를 사용하여 새 NotificationModel 인스턴스를 작성하고이를 알림 변수에 저장하기 위해 message, ttl 및 notification_category 속성의 값을 지정한다. creation_date 인수의 값은 시간대 정보가있는 현재 날짜 및 시간으로 설정되므로 요청에서 구문 분석되지 않는다. 그런 다음 코드는 새 NotificationModel 인스턴스 (알림)와 함께 notification_manager.insert_notification 메소드를 호출하여이 새 인스턴스를 dictionary에 추가합니다. post 메소드는 notification_fields와 함께 @marshal_with 데코레이터를 인수로 사용한다. 데코레이터는 최근에 생성되고 저장된 NotificationModel 인스턴스, 알림을 가져 와서 notification_fields에 지정된 필드 필터링 및 출력 형식을 적한다. 그런 다음 코드는 삽입 된 NotificationModel 인스턴스와 201 Created 상태 코드로 구성된 튜플을 반환한다. 튜플에 반환 된 상태 코드는 HttpStatus.created_201.value로 지정된다. 열거 형의 값인 201을 반환하기 때문이다. 튜플에 여러 개의 반환 값을 사용하여 응답 코드를 설정했다.

 

다음 표는 HTTP verb와 범위의 각 조합에 대해 실행되도록 이전에 작성된 클래스의 메소드를 보여준다.

요청으로 인해 지원되지 않는 HTTP 메소드로 자원이 호출되면 Flask-RESTful은 HTTP 405 Method Not Allowed 상태 코드로 응답을 리턴한다.

 

 

Configuring resource routing and endpoints

(지원 라이팅 및 엔드포인트 구성)

적절한 메소드를 호출하고 URL 규칙을 정의하여 필요한 모든 인수를 전달하기 위해 필요한 자원 라우팅 구성을 작성해야한다. 다음 줄은 응용 프로그램의 기본 진입 점을 만들고 Flask 응용 프로그램으로 초기화하고 서비스에 대한 리소스 라우팅을 구성한다. 이전에 작성된 service / service.py 파일을 열고 다음 행을 추가한다.

 

 

이 코드는 flask_restful.Api 클래스의 인스턴스를 만들어 서비스 변수에 저장한다. service.add_resource 메소드를 호출 할 때마다 URL을 자원, 특히 flask_restful.Resource 수퍼 클래스의 이전에 선언 된 서브 클래스 중 하나로 URL을 라우팅한다. 서비스에 대한 요청이 있고 URL이 service.add_resource 메소드에 지정된 URL 중 하나와 일치하면 Flask는 지정된 클래스에 대한 요청에서 HTTP 동사와 일치하는 메소드를 호출한다. 이 방법은 표준 플라스크 라우팅 규칙을 따른다.

예를 들어, 다음 행은 추가 매개 변수없이 / service / notifications /에 HTTP GET 요청을 작성하여 NotificationList.get 메소드를 호출한다.

 

 

플라스크는 URL 변수를 호출 된 메소드에 인수로 전달한다. 예를 들어, 다음 행은 '/ service / notifications / 26' 에 HTTP GET 요청을 작성하여 Notification.get 메소드를 호출하고 26은 id 인수의 값으로 전달된다.

 

또한 endpoint.Url 필드에서 지정된 경로를 쉽게 참조 할 수 있도록 끝점 인수에 문자열 값을 지정할 수 있다. 각 NotificationModel 인스턴스를 렌더링하는 데 사용하는 notification_fields dictionary에서 fields로 선언 된 uri 필드의 인수로 'notification_endpoint'와 동일한 엔드 포인트 이름 인 'notification_endpoint'를 전달한다. 이런 식으로 fields.Url은이 경로를 고려한 URI를 생성한다.

리소스 라우팅 및 엔드 포인트를 구성하기 위해 몇 줄의 코드 만 필요했다. 마지막 줄은 app.run 메소드를 호출하여 Flask 응용 프로그램을 시작하고 디버그 인수를 True로 설정하여 디버깅을 활성화한다. 이 경우 로컬 서버를 즉시 시작하기 위해 run 메소드를 호출하여 애플리케이션을 시작한다. 또한 flask 명령 줄 스크립트를 사용하여 동일한 목표를 달성 할 수 있다. 그러나 이 옵션을 사용하려면 환경 변수를 구성해야하며이 책에서 다루는 플랫폼 (macOS, Windows 및 Linux)에 대한 지침이 다르다.

다른 웹 프레임 워크와 마찬가지로 프로덕션 환경에서는 디버깅을 사용하지 않아야한다.

 

 

Making HTTP requests to the Flask API

(Flask API에 대한 HTTP 요청)

이제 Flask의 개발 서버를 시작하는 service / service.py 스크립트를 실행하여 보안되지 않은 간단한 웹 API에 HTTP 요청을 작성하고 보낼 수 있다 (나중에 보안을 추가 할 것임). 가상환경을 활성화한 후에 다음 명령을 실행 시킨다.

 

 

다음 줄은 이전 명령을 실행 한 후의 출력을 보여준다.다. 개발 서버가 포트 5000에서 listening 중입니다.

 

 

이전 명령으로 Flask 개발 서버를 시작하고 개발 컴퓨터에서만 액세스 할 수 있다. 이전 명령은 기본 IP 주소, 즉 127.0.0.1 (localhost)에서 개발 서버를 시작한다. LAN에 연결된 다른 컴퓨터 나 장치에서이 IP 주소에 액세스 할 수 없다. 따라서 LAN에 연결된 다른 컴퓨터 또는 장치에서 API로 HTTP 요청을하려면 개발 컴퓨터 IP 주소, 0.0.0.0 (IPv4 구성) 또는 : :( IPv6 구성)을 원하는대로 사용해야합니다. 

 

IPv4 구성에 원하는 IP 주소로 0.0.0.0을 지정하면 개발 서버는 포트 5000의 모든 인터페이스에서 수신 대기한다. 또한 방화벽 (소프트웨어 및 / 또는 하드웨어)에서 기본 포트 5000을 열어야하며 클라우드 서버에서 애플리케이션을 실행 할 때도 동일한 구성이 적용된다. 

 

app.run 메소드 호출, 특히 service / service.py 파일의 마지막 행에서 호스트 인수의 값으로 '0.0.0.0'을 지정하면된다. 다음 행은 app.run에 대한 새로운 호출을 보여준다.이 호출은 IPv4 구성에서 Flask의 개발 서버를 시작하고 LAN에 연결된 다른 컴퓨터 및 장치에서 요청할 수 있다. 회선은 외부에서 볼 수있는 서버를 생성한다. 

 

 

LAN에 연결된 다른 컴퓨터나 장치에서 HTTP 요청을 작성하고 보내려면 로컬 호스트 대신 개발 컴퓨터에 할당 된 IP 주소를 사용해야한다. 예를 들어 컴퓨터에 할당 된 IPv4 IP 주소가 192.168.1.127이면 localhost:5000 대신 192.168.1.127:5000 나 호스트이름을 사용해야 한다.  모바일 장치가 RESTful API 및 향후 마이크로 서비스의 소비자 일 수 있으므로 앞에서 설명한  구성 은 매우 중요하다. 우리는 항상 개발 환경에서 API를 사용하는 앱을 테스트하려고한다. 또한 이와 같은 유용한 도구 ngrok를 사용하여 localhost에 대한 보안 터널을 생성 할 수 있다. 이에 대한 자세한 내용 ngrok을 읽을 수 있다http://www.ngrok.com .

 

Flask 개발 서버가 localhost (127.0.0.1)에서 실행 중이고 포트 5000에서 수신 대기하며 HTTP 요청을 기다리고 있다. 이제 개발 컴퓨터 나 LAN에 연결된 다른 컴퓨터 나 장치에서 로컬로 HTTP 요청을 작성하고 보낸다.

이 책 전체에서 다음 도구를 사용하여 HTTP 요청을 작성하고 보낸다.

  • Command-line tools
  • GUI tools
  • Python code
  • The web browser

HTTP 요청을 작성하고 보낼 수있는 다른 응용 프로그램을 사용할 수 있다. 이 작업을 수행 할 수있는 태블릿 및 스마트 폰에서 실행되는 많은 앱이 있다. 그러나 RESTful 웹 API 및 마이크로 서비스를 빌드 할 때 가장 유용한 도구에 중점을 둘 것이다.

 

 

Working with the curl and httpie command-line tools

(명령툴인  curl 을 사용하여 작업하기)

명령 줄 도구의 주요 장점 중 하나는 처음으로 HTTP 요청을 작성한 후 쉽게 HTTP 요청을 다시 실행할 수 있으며 마우스를 사용하거나 화면을 탭하여 요청을 실행할 필요가 없다는 것이다. 또한 스크립트를 작성하여 일괄적으로 실행 시킬 수도 있다. 모든 명령 줄 도구와 마찬가지로 GUI 도구에 비해 첫 번째 요청을 수행하는 데 더 많은 시간이 소요될 수 있지만 많은 요청을 수행 한 후에는 더 쉬워지고 과거에 작성한 명령을 쉽게 재사용하여 작성할 수 있다. 

 

cURL이라고도하는 Curl은 데이터를 쉽게 전송할 수있는 매우 인기있는 오픈 소스 명령 줄 도구 및 라이브러리이다. curl 명령 줄 도구를 사용하여 HTTP 요청을 쉽게 작성하고 보내고 응답을 확인할 수 있다.

macOS 또는 Linux에서는 터미널을 열고 명령 줄에 서 curl을 사용할 수 있다.

Windows에서는 명령 프롬프트에서 curl을 사용하거나 Cygwin 패키지 설치 옵션의 일부로 curl을 설치하고 Cygwin 터미널에서 curl을 실행할 수 있다. 명령 프롬프트에서 curl 명령을 사용하기로 결정한 경우 http://curl.haxx.se/download.html 에서 최신 버전을 다운로드하여 압축을 풀고 . Windows PATH에 curl.exe 파일이 포함 된 폴더를 포함시켜야한다.

Cygwin 터미널 및 설치 절차에 대한 자세한 내용은 http://cygwin.com/install.html 을 참조하면 된다. Cygwin 터미널을 사용하기로 결정한 경우 명령 프롬프트를 사용하는 대신 curl 명령을 실행한다.

Windows PowerShell에는 Inovoke-WebRequest 명령을 호출하는 curl 별칭이 포함되어 있다. 따라서 Windows PowerShell을 사용하기로 결정한 경우이 책에서 사용하는 curl 유틸리티를 사용하려면 curl alias을 제거해야한다.

우리는 requirements.txt 파일을 사용하여 가상 환경을위한 패키지를 설치했다. 이 파일에서는 httpie를 필수 패키지 중 하나로 지정했다. 이런 식으로, 우리는 HTTP 요청을 쉽게 보내고 curl보다 쉬운 구문을 사용하는 Python으로 작성된 명령 행 HTTP 클라이언트 인 HTTPie를 설치했다. HTTPie의 가장 큰 장점 중 하나는 컬러 출력을 표시하고 여러 줄을 사용하여 응답 세부 정보를 표시한다는 것다. 따라서 HTTPie를 사용하면 curl 유틸리티보다 응답을 쉽게 이해할 수 있다. 그러나 HTTPie가 curl보다 느리다.는 것을 언급하는 것이 매우 중요합니다.

명령 행으로 HTTP 요청을 작성할 때마다 동일한 명령의 두 가지 버전 (첫 번째는 HTTPie, 다른 하나는 curl)을 사용한다. 이렇게하면 가장 편리한 것을 사용할 수 있다.

Flask 개발 서버를 실행 시킨 후 서버를 실행하는 터미널 또는 명령 프롬프트를 닫지 말고 macOS 또는 Linux에서 새 터미널을 열거 나 Windows에서 명령 프롬프트를 열고 다음 명령을 실행해라. / service / notifications는 구성된 URL 경로와 일치하지 않으므로 끝날 때 슬래시 (/)를 입력해야한다. 따라서 끝 슬래시 (/)를 포함하여 / service / notifications /를 입력해야한다. 새로운 알림을 작성하기 위해 HTTP 요청을 작성하고 보낸다. 

 

http POST ":5000/service/notifications/" message='eSports competition starts in 2 minutes' ttl=20 notification_category='Information'

 

다음은 동등한 curl 명령이다. curl에 기본 application / x-www-form-urlencoded 옵션 대신 -d 옵션 뒤에 지정된 데이터를 application / json으로 보내도록 지시하려면 -H "Content-Type : application / json"옵션을 사용하는 것이 매우 중요하다. 


curl -iX POST -H "Content-Type: application/json" -d '{"message":"eSports competition starts in 2 minutes", "ttl":20, "notification_category": "Information"}' "localhost:5000/service/notifications/"

 

이전 명령은 다음 JSON 키-값 쌍을 사용하여 POST http : // localhost : 5000 / service / notifications / HTTP 요청을 작성하고 보낸다.

 

 

요청은 / service / notifications /를 지정하므로 '/ service / notifications /'와 일치하고 NotificationList.post 메소드를 실행한다. URL 경로에 매개 변수가 포함되어 있지 않으므로 메소드가 인수를 수신하지 않는다. 요청에 대한 HTTP 동사가 POST이므로 Flask는 post 메소드를 호출한다. 새 NotificationModel이 dictionary에 성공적으로 유지 된 경우, 함수는 HTTP 201 Created 상태 코드 및 최근 지속 된 NotificationModel을 응답 본문에서 JSON으로 직렬화한다. 다음 행은 JSON 응답에 새로운 NotificationModel 오브젝트가있는 HTTP 요청에 대한 응답 예를 보여준다.

 

 

다른 알림을 작성하기 위해 HTTP 요청을 작성하고 보낸다. Windows의 명령 프롬프트 또는 macOS 또는 Linux의 터미널로 돌아가서 다음 명령을 실행한다. 

 

http POST ":5000/service/notifications/" message='Ambient temperature is above the valid range' ttl=15 notification_category='Warning'

 

다음은 동등한 curl 명령이다.

 

curl -iX POST -H "Content-Type: application/json" -d '{"message":"Ambient temperature is above the valid range", "ttl":15, "notification_category": "Warning"}' "localhost:5000/service/notifications/"

 

이전 명령은 다음 JSON 키-값 쌍을 사용하여 POST http : // localhost : 5000 / service / notifications / HTTP 요청을 작성하고 보낸다.

 

 

다음 행은 JSON 응답에 새로운 NotificationModel 오브젝트가있는 HTTP 요청에 대한 응답 예를 보여준다.

 

 

모든 알림을 검색하기 위해 HTTP 요청을 작성하고 보낸다. Windows의 명령 프롬프트 또는 macOS 또는 Linux의 터미널로 돌아가서 다음 명령을 실행한다. 

 

 

다음은 동등한 curl 명령이다.

 

 

이전 명령은 GET http : // localhost : 5000 / service / notifications / HTTP 요청을 작성하고 보낸다. 요청은 / service / notifications /를 지정하므로 '/ service / notifications /'와 일치하고 NotificationList.get 메소드를 실행한다. URL 경로에 매개 변수가 포함되어 있지 않으므로 메소드가 인수를 수신하지 않는다. 요청에 대한 HTTP 동사가 GET이므로 Flask는 get 메소드를 호출한다. 이 메소드는 모든 NotificationModel 오브젝트를 검색하고 이러한 NotificationModel 오브젝트를 모두 직렬화하여 JSON 응답을 생성한다.

 

다음 행은 HTTP 요청에 대한 응답 예를 보여준다. 첫 번째 라인은 상태 (200 OK) 및 컨텐츠 유형 (application / json)을 포함한 HTTP 응답 헤더를 보여준다. HTTP 응답 헤더 다음에 JSON 응답에서 두 개의 NotificationModel 객체에 대한 세부 정보를 볼 수 있다.

 

 

세 가지 요청을 실행하면 Flask 개발 서버를 실행중인 창에 다음 줄이 표시된다. 출력은 서비스가 세 개의 HTTP 요청, 특히 두 개의 POST 요청과 하나의 GET 요청을 URI로 / service / notifications /로 수신했음을 나타낸다. 서비스는 세 개의 HTTP 요청을 처리하고 처음 두 요청에 대한 201 상태 코드와 마지막 요청에 대해 200을 리턴한다.

 

 

다음 스크린 샷은 macOS에서 두 개의 터미널 윈도우를 나란히 보여준다. 왼쪽의 터미널 창이 Flask 개발 서버를 실행 중이며 수신 및 처리 된 HTTP 요청을 표시한다. 오른쪽의 터미널 창은 HTTP 요청을 생성하기 위해 http 명령을 실행하고 있다. HTTP 요청을 작성하고 보내는 동안 유사한 구성을 사용하여 출력을 확인하는 것이 좋다.

 

 

 

이제 존재하지 않는 알림을 검색하기 위해 HTTP 요청을 작성하고 보낸다. 예를 들어, 이전 목록에는 id 값이 78 인 알림이 없다. 다음 명령을 실행하여이 알림을 검색한다. 존재하지 않는 id 값을 사용해야한다. 반환 된 상태 코드를 보려면 유틸리티가 응답의 일부로 헤더를 표시해야한다. 

 

다음은 동등한 curl 명령이다.

 

 

이전 명령은 GET http : // localhost : 5000 / service / notifications / 78  HTTP 요청을 작성하여 보낸다. 요청은 이전에 분석 한 것과 동일하지만 id 매개 변수에 다른 숫자가 있다. 서비스는 78. id 인수의 값으로 Notification.get 메소드를 실행한다. 이 메소드는 ID가 인수로 수신 된 id 값과 일치하는 NotificationModel 객체를 검색하는 코드를 실행한다. 그러나 NotificationList.get 메소드의 첫 번째 행은 사전 키에서 ID를 찾을 수없는 abort_if_notification_not_found 메소드를 호출하며 지정된 id 값을 가진 notification이 없으므로 flask_restful.abort 함수를 호출한다. 따라서 코드는 HTTP 404 Not Found 상태 코드를 반환한다. 다음 행은 HTTP 요청 및 본문에 포함 된 메시지에 대한 예제 헤더 응답을 보여준다. 이 경우 기본 메시지를 그대로 둔다. 물론 특정 요구에 따라 사용자 정의 할 수 있다.

 

 

API가 기존 리소스에 대한 단일 필드를 업데이트 할 수 있도록 PATCH 메서드에 대한 구현을 제공한다. 예를 들어, PATCH 메소드를 사용하여 기존 알림에 대해 두 개의 필드를 업데이트하고 displayed_once 필드의 값을 true 및 displayed_times를 1로 설정할 수 있다.

 

PATCH 메소드는 기존 알림에 델타를 적용하기위한 것이므로 shown_once 및 displayed_times 필드의 값을 변경하는 것이 적절한 방법이다.

 

이제 기존 알림을 업데이트하기 위해, 특히 두 필드의 값을 업데이트하기 위해 HTTP 요청을 작성하고 보낸다. 구성에서 기존 알림의 ID로 2를 바꿔야한다. 

 

 

다음은 동등한 curl 명령이다.

 

curl -iX PATCH -H "Content-Type: application/json" -d '{"displayed_once":"true", "displayed_times":1}' "localhost:5000/service/notifications/2"

 

이전 명령은 지정된 JSON 키-값 쌍을 사용하여 PATCH HTTP 요청을 작성하고 보낸다. 요청은 / service / notifications / 뒤에 번호가 있으므로 '/ service / notifications / '와 일치하고 Notification.patch 메소드, 즉 Notification 클래스의 패치 메소드를 실행한다. 지정된 ID를 가진 NotificationModel 인스턴스가 존재하고 성공적으로 업데이트 된 경우 메소드를 호출하면 HTTP 200 OK 상태 코드와 최근 업데이트 된 NotificationModel 인스턴스가 응답 본문에서 JSON으로 직렬화됩니다. 다음 라인은 샘플 응답을 보여준다.

 

 

IoT 장치는 알림을 처음 표시 할 때 앞에서 설명한 HTTP 요청을 실행한다. 그런 다음 shown_times 필드의 값을 업데이트하기 위해 추가 PATCH 요청한다.

 

이제 기존 알림, 특히 마지막으로 추가 한 알림을 삭제하기 위해 HTTP 요청을 작성하고 보낸다. 마지막 HTTP 요청에서 발생한 것처럼 이전 응답에서 id에 할당 된 값을 확인하고 명령에서 2를 반환 된 값으로 바꿔야한다. 

 

 

다음은 동등한 curl 명령이다.

 

 

이전 명령은 DELETE http : // localhost : 5000 / service / notifications / 2 HTTP 요청을 작성하고 보낸다. 요청은 / service / notifications / 다음에 숫자가 있으므로 '/ service / notifications / '와 일치하고 Notification.delete 메소드, 즉 Notification 클래스의 delete 메소드를 실행한다. 지정된 ID를 가진 NotificationModel 인스턴스가 존재하고 성공적으로 삭제 된 경우 메소드를 호출하면 HTTP 204 컨텐츠 없음 상태 코드가 리턴된다. 다음 라인은 샘플 응답을 보여준다.

 

 

 

Working with GUI tools – Postman and others

(GUI 툴인 Postman 사용하여 작업하기)

Flask 개발 서버에 cURL과 HTTPie로 HTTP 요청을 작성하고 보내는 두 개의 터미널 기반 또는 명령 행 도구를 사용하여 작업 해 왔다. 이제 GUI ( Graphical User Interface의 약자 ) 도구로 작업하겠다 .

Postman은 널리 사용되는 API GUI 테스트 도구로 HTTP 요청을 쉽게 작성하고 보낼 수 있다. Postman은 Chrome 앱 및 Macintosh 앱으로 제공된다. Windows, Linux 및 macOS에서 기본 앱으로 실행할 수 있다. 

https://www.getpostman.com/apps 에서 Postman 앱 버전을 다운로드 할 수 있다 .

Postman을 무료로 다운로드하여 설치후 Postman에 가입하면 RESTful API에 HTTP 요청을 작성하고 보낼 수 있다. 테스트 예제는 Postman 6.4.2 이상의 무료 기능을 사용할 것이다. 

이제 localhost : 5000에 HTTP 요청을 작성하고 전송하고이 GUI 도구를 사용하여 RESTful API를 테스트할 것이다. Postman은 localhost에 대한 속기를 지원하지 않으므로 HTTPie로 요청을 작성할 때 사용한 것과 같은 속기를 사용할 수 없다.

 

Postman을 시작하면 일반적인 작업에 대한 바로 가기를 제공하는 모달을 닫는다.  Postman기본 창의 왼쪽 상단 에있는 + 새 드롭 다운 메뉴에서 GET 요청을 선택한다. 


요청 URL 입력 텍스트 상자의 왼쪽에있는 드롭 다운 메뉴에서 GET을 선택한 다음 드롭 다운의 오른쪽에있는이 텍스트 상자에 localhost : 5000 / service / notifications /를 입력한다.

그런 다음 보내기를 클릭  하면 Postman이 다음 정보를 표시한다.

  • 상태 : 200 OK .
  • 시간 : 요청을 처리하는 데 걸린 시간입니다.
  • 크기 : 본문 크기를 헤더 크기에 추가하여 계산 한 응답 크기입니다.
  • 본문 : 구문 강조가있는 JSON으로 형식화 된 모든 알림이 있는 응답 본문입니다. 응답 본문의 기본보기는 Pretty 보기이며 JSON 코드를 쉽게 읽을 수 있도록 구문 강조를 활성화합니다.

다음 스크린 샷은 HTTP GET요청에 대한 Postman의 JSON 응답 본문을 보여준다 

localhost:5000/service/notifications/

 

본문 및 쿠키 탭의 오른쪽에있는 헤더 탭을 클릭하여 응답 헤더를 읽는다. 다음 스크린 샷은 Postman이 이전 응답에 표시 한 응답 헤더의 레이아웃을 보여준다. curl 및 http 명령 줄 유틸리티를 모두 사용할 때와 같이 Postman은 응답의 오른쪽에 상태를 표시하고 헤더의 첫 번째 행으로 포함하지 않는다.

이제 HTTP 요청을 작성하여 보내 새로운 알림, 특히 POST 요청을 작성한다. 아래 단계를 따른다. 

 

  1. 이전 요청을 표시 한 탭의 오른쪽에있는 더하기 (+) 버튼을 클릭하십시오. 이것은 새 탭을 만드는 것입니다.
  2. 요청 URL 입력 텍스트 상자의 왼쪽에있는 드롭 다운 메뉴에서 POST를 선택하고 드롭 다운 오른쪽의 텍스트 상자에 localhost : 5000 / service / notifications /를 입력하십시오.
  3. 요청을 구성하는 패널에서 권한 및 헤더 탭의 오른쪽에있는 본문을 클릭하십시오.
  4. 원시 라디오 버튼을 활성화하고 바이너리 라디오 버튼의 오른쪽에있는 드롭 다운에서 JSON (application / json)을 선택하십시오. Postman은 Content-type = application / json 헤더를 자동으로 추가하므로 헤더 탭의 이름이 헤더 (1)로 바뀌어 요청 헤더에 대해 하나의 키-값 쌍이 지정되어 있음을 알 수 있습니다.
  5. 본문 탭의 라디오 버튼 아래 텍스트 상자에 다음 줄을 입력하십시오. 샘플 코드 파일은 restful_python_2_01_02 폴더의 Flask01 / cmd13.txt 파일에 포함되어 있습니다.

 

 

다음 스크린 샷은 Postman의 요청 본문을 보여준다.

 

필요한 알림 단계를 수행하여 새 알림을 작성하는 데 필요한 키-값 쌍을 지정하는 JSON 본문으로 HTTP POST 요청을 작성했다. 보내기를 클릭하면 우편 배달부에 다음 정보가 표시된다.

 

  • Status : 201 생성됨
  • Time : 요청을 처리하는 데 걸린 시간입니다.
  • Size : 본문 크기를 헤더 크기에 추가하여 계산 된 응답 크기입니다.
  • Body : 최근에 추가 된 알림이 구문 강조 표시 (예쁜보기)로 JSON으로 형식화 된 응답 본문입니다.


다음 스크린 샷은 Postman의 HTTP POST요청에 대한 JSON 응답 본문을 보여준다 .

Postman으로 API에 대한 HTTP PATCH 요청을 작성하고 보내려면 요청 본문 내에 JSON 데이터를 제공하기 위해 앞에서 설명한 단계를 따라야한다.

 

JSON 응답 본문에서 uri 필드의 값을 클릭하거나 탭한 (/ service / notifications / 3). 마우스를 가져 가면 값에 밑줄이 표시된다. Postman은 다음 스크린 샷과 같이 localhost : 5000 / service / notifications / 3에 대한 GET 요청을 자동으로 생성한다.

 

보내기를 클릭하여 실행하고 최근에 추가 한 알림을 검색한다. uri 필드는 Postman과 같은 도구로 API를 탐색하는 데 유용하다.

Postman에 포함 된 멋진 기능 중 하나는 Postman 창의 왼쪽에 표시된 저장된 기록을 찾아서 작성한 HTTP 요청을 쉽게 검토하고 다시 실행할 수 있다는 것이다. 작업 내역 패널에는 HTTP verb가 포함 된 목록과 그 뒤에 작성하여 보낸 각 HTTP 요청의 URL이 표시된다. 원하는 HTTP 요청을 클릭하고 보내기를 클릭하여 다시 실행하면된다. 다음 스크린 샷은 [작업 내역] 패널에있는 많은 HTTP 요청 중 첫 번째 요청이 다시 전송되도록 선택된 것이다.

JetBrains PyCharm은 macOS, Linux 및 Windows에서 사용할 수있는 매우 인기있는 다중 플랫폼 Python IDE (통합 개발 환경의 약자)이다. 유료 전문가 버전에는 RESTful 웹 서비스 및 마이크로 서비스를 쉽게 테스트 할 수있는 REST 클라이언트가 포함되어 있다. 이 버전의 IDE로 작업하는 경우 IDE를 떠나지 않고도 HTTP 요청을 작성하고 보낼 수 있다. 이 책에 포함 된 예제를 실행하기 위해 JetBrains PyCharm Professional 버전 라이센스가 필요하지 않다. 30 일 무료 평가판을 이용할 수 있다. 그러나이 IDE를 설치하지 않으려는 경우 단계를 건너 뛰고 제공된 http 또는 curl 명령을 사용하여 동일한 작업을 수행 할 수 있다. IDE는 매우 널리 사용되므로 더 이상 사용되지 않는 REST 클라이언트를 대체 한 편집기에 포함 된 HTTP 클라이언트를 사용하여 API에 대한 HTTP 요청을 작성하고 전송하는 데 필요한 단계를 학습한다.

 

이제 PyCharm Professional에 포함 된 HTTP 클라이언트를 사용하여 HTTP 요청을 작성하고 보내 새로운 게임, 특히 POST 요청을 작성한다.

아래 단계를 따른다:

 

  1. 파일 | 새로운 | 기본 메뉴의 HTTP 요청
  2. 이름 텍스트 상자에 notifications_post_pycharm을 입력하고 확인을 클릭. IDE는 http 확장명과 HTTP 요청을 작성하는 방법에 대한 지시 사항으로 새 파일을 작성.
  3. 코드를 다음 줄로 바꾼. 코드는 HTTP 메소드 이름 POST로 시작하고 그 뒤에 URL이온다. 다음 행은 Content-Type 값으로 헤더를 지정하고 다음 행은 중괄호 안에 JSON 본문을 제공한다. 

 

 

다음 스크린 샷은 PyCharm Professional 편집기에 통합 된 요청을 보여준다.

 

 

필요한 알림 단계를 수행하여 새 알림을 작성하는 데 필요한 키-값 쌍을 지정하는 JSON 본문으로 HTTP POST 요청을 작성했다.

HTTP 요청 실행 단추, 즉 편집기의 왼쪽 상단 모서리에있는 재생 아이콘이있는 첫 번째 단추 (탭 이름 (notifications_post_1.http))를 클릭한다. 표시되는 상황에 맞는 메뉴에서 localhost : 5000 실행을 선택한다.

PyCharm은 HTTP POST 요청을 작성하고 전송하여 실행 탭을 활성화하고 요청, 응답 헤더, 응답 본문, 응답 코드 201 (생성), 요청 처리 시간, 그리고 content의 길이를 하단에 출력한다.  기본적으로 PyCharm은 JSON 구문 강조를 응답에 자동으로 적용한다. 

 

다음 스크린 샷은 HTTP POST 요청에 대한 실행 탭의 출력을 보여준다.

 

PyCharm Professional을 사용하지 않으려면 다음 명령 중 하나를 실행하여 HTTP POST 요청을 작성하고 보내 새 알림을 작성한다. 

 

 

다음은 동등한 curl 명령입니다. 

 

curl -iX POST -H "Content-Type: application/json" -d '{"message":"Working with PyCharm Professional", "ttl":12, "notification_category": "Information"}' "localhost:5000/service/notifications/"

 

외부에서 볼 수있는 Flask 개발 서버를 생성하기 위해 필요한 변경을 수행 했으므로 모바일 장치에서 HTTP 요청을 작성하고 전송하여 RESTful API를 사용하는 앱을 사용할 수 있다.

 

예를 들어, iPad Pro, iPad 및 iPhone과 같은 iOS 장비 (https://itunes.apple.com/kr/app/icurlhttp/id611943891?mt=8)에서 iCurlHTTP 앱을 사용할 수 있습니다. Android 기기에서는 HTTP 요청 앱 (https://play.google.com/store/apps/details?id=air.http.request&hl=ko)을 사용할 수 있다.

 

다음 스크린 샷은 GET http://192.168.1.106:8000/service/notitications/ iCurlHTTP 앱으로 다음 HTTP 요청을 작성하고 전송 한 결과를 보여준다. LAN에 연결된 다른 장치에서 Flask 개발 서버에 액세스하려면 LAN 및 라우터에서 앞에서 설명한 구성을 수행해야한다. 이 경우 Flask 개발 서버를 실행하는 컴퓨터에 할당 된 IP는 192.168.1.106이므로이 IP를 개발 컴퓨터에 할당 된 IP로 바꿔야한다. 이 책이 출판 될 때 HTTP 요청을 작성하고 보낼 수있는 모바일 앱은 Postman 또는 명령 줄 유틸리티에서 찾을 수있는 모든 기능을 제공하지 않는다.

 

 

 

Consuming the API with other programming languages

(다른 프로그램 언어와 함께 API 사용)

Flask와 Python을 사용하여 마이크로 서비스로 실행할 수있는 첫 번째 RESTful 웹 서비스를 구축했다. API를 지원하는 리소스 및 동사에 HTTP 요청을 작성하고 보낼 수있는 최신 프로그래밍 언어를 사용하여 API를 사용할 수 있으며 JSON 컨텐츠로 쉽게 작업 할 수 있다.

curl 및 http 명령 줄 유틸리티를 사용할 때와 마찬가지로 HTTP 요청에 대한 컨텐츠 유형을 설정해야한다. 클라이언트로 사용해야하는 프로그래밍 언어에서 가장 편리한 방법을 확인하면된다.

새로운 요청이 처리 될 때마다 Flask 개발 서버를 쉽게 실행하고 콘솔 출력을 확인할 수 있기 때문에 어떤 요청이 서버에 도착했는지 쉽게 확인할 수 있다. 이 경우 보안되지 않은 기본 API로 작업하고 있다. 그러나 다음 장에서는 안전하고 고급 API로 작업 할 것이다.

 

 

Test your knowledge

(테스트)

다음 질문에 답을 하시요  

 

  1. HTTPie는 ?
    1. RESTful 웹 서버를 쉽게 만들 수있는 Python으로 작성된 명령 줄 HTTP 서버
    2. SQLite 데이터베이스에 대해 쿼리를 실행할 수있는 명령 줄 유틸리티
    3. HTTP 요청을 쉽게 작성하고 보낼 수있는 Python으로 작성된 명령 행 HTTP 클라이언트
  2. Flask-RESTful은 RESTful API의 기본 빌딩 블록으로 다음 중 하나를 사용합니다 .
    1. Flask 플러그 가능 뷰 위에 구축 된 리소스
    2. Flask 리소스 뷰 위에 구축 된 상태
    3. Flask 플러그 형 컨트롤러 위에 구축 된 리소스
  3. PATCH리소스에서 HTTP 요청 을 처리하려면 ? 의 하위 클래스에서 어떤 메서드를 선언해야 합니까?
    1. patch_restful
    2. patch_method
    3. patch
  4. PUT리소스에서 HTTP 요청 을 처리하려면 ? 의 하위 클래스에서 어떤 메서드를 선언해야 합니까?
    1. put_restful
    2. put_method
    3. put
  5. POST리소스에서 HTTP 요청 을 처리하려면 flask_restful.Resource? 의 하위 클래스에서 어떤 메서드를 선언해야 합니까?
    1. post_restful
    2. post_method
    3. post
  6. GET리소스에서 HTTP 요청 을 처리하려면 flask_restful.Resource? 의 하위 클래스에서 어떤 메서드를 선언해야 합니까?
    1. get_restful
    2. get_method
    3. get
  7. flask_restful.Resource의 하위 클래스는 다음을 나타냅니다.
    1. 컨트롤러 리소스
    2. RESTful 리소스
    3. 단일 RESTful HTTP 동사
  8. 우리가 사용하는 경우 @marshal_with와 장식을 notification_fields인수로, 데코레이터는 것입니다 :
    1. 지정된 필드 필터링 및 출력 형식 notification_fields 을 적절한 인스턴스에 적용
    2. 출력 형식을 고려하지 않고 적절한 인스턴스에 지정된 필드 필터링을 적용하십시오.notification_fields
    3. 필드 필터링을 고려하지 않고 적절한 인스턴스에 지정된 출력 형식을 적용하십시오.notification_fields

 

 

Summary

(정리)

  • 데이터 저장소 역할을하고 알림과 함께 CRUD 작업을 수행하여 마이크로 서비스의 기준으로 사용되는 간단한 사전과 상호 작용할 수있는 RESTful API를 설계 
  • API에 대한 요구 사항을 정의하고 각 HTTP 메소드가 수행하는 태스크를 이해
  • Flask 및 Flask-RESTful을 사용하여 가상 환경을 설정 & 재현 가능한 가상 환경을 생성
  • 알림을 나타내고 유지하기위한 모델을 제작
  • Flask-RESTful에 포함 된 기능을 사용하여 알림을 JSON 표현으로 직렬화하는 방법
  • 리소스를 나타내고 다른 HTTP 요청을 처리하는 클래스를 작성
  • URL을 클래스로 라우팅하도록 URL 패턴을 구성
  • Flask 개발 서버를 시작하고 명령 줄 도구를 사용하여 HTTP 요청을 작성하여 RESTful API로 보내고 각 HTTP 요청이 코드에서 처리 된 방식을 분석
  • 유용한 GUI 도구와 함께 HTTP 요청을 작성하고 전송

 

Flask와 Flask-RESTful 조합의 기본 사항을 이해하여 마이크로 서비스로 캡슐화 할 수있는 RESTful API를 작성합니다. 

다음 장에서는 다음에 포함 된 고급 기능을 활용하여 RESTful Web API의 기능을 확장 할 것입니다.

 

 

 

 

Posted by 생짜
|