Python 및 Flask를 사용하여 RESTful Web API를 구현하는 방법을 설명하는 예

巴扎黑
풀어 주다: 2017-09-20 09:56:50
원래의
2683명이 탐색했습니다.

아래 편집기는 Python 및 Flask를 사용하여 RESTful Web API를 구현하는 예를 제공합니다. 편집자님이 꽤 좋다고 생각하셔서 지금 공유하고 모두에게 참고용으로 드리도록 하겠습니다. 편집기를 따라가서 살펴보겠습니다.

환경 설치:

sudo pip install 플라스크

Flask는 WSGI 클래스 라이브러리인 Werkzeug를 기반으로 하는 Python 마이크로서비스 프레임워크입니다.

Flask 장점:

Python으로 작성(장점이 될 수 있음),
사용이 간편함,
유연함,
/articles/:id를 사용한 여러 가지 유용한 배포 옵션:

from flask import Flask, url_for
app = Flask(__name__)

@app.route('/')
def api_root():
 return 'Welcome'

@app.route('/articles')
def api_articles():
 return 'List of ' + url_for('api_articles')

@app.route(&#39;/articles/<articleid>&#39;)
def api_article(articleid):
 return &#39;You are reading &#39; + articleid

if __name__ == &#39;__main__&#39;:
 app.run()
로그인 후 복사
요청: curl http://127.0.0.1:5000/

응답:

GET /

Welcome

GET /articles

/기사 목록

GET /articles/123

지금 읽고 있는 내용 123


REQUE STS




GET 매개변수

from flask import request

@app.route(&#39;/hello&#39;)
def api_hello():
 if &#39;name&#39; in request.args:
  return &#39;Hello &#39; + request.args[&#39;name&#39;]
 else:
  return &#39;Hello John Doe&#39;
로그인 후 복사

요청:

GET /helloHello John DoeGET / hello?name=Luis

Hello Luis


요청 메소드(HTTP 동사)



@app.route(&#39;/echo&#39;, methods = [&#39;GET&#39;, &#39;POST&#39;, &#39;PATCH&#39;, &#39;PUT&#39;, &#39;DELETE&#39;])
def api_echo():
 if request.method == &#39;GET&#39;:
  return "ECHO: GET\n"

 elif request.method == &#39;POST&#39;:
  return "ECHO: POST\n"

 elif request.method == &#39;PATCH&#39;:
  return "ECHO: PACTH\n"

 elif request.method == &#39;PUT&#39;:
  return "ECHO: PUT\n"

 elif request.method == &#39;DELETE&#39;:
  return "ECHO: DELETE"
로그인 후 복사

Request 지정 요청 유형:

curl -X PATCH http://127.0.0.1:5000/echoGET /echoECHO: GET

POST /ECHO

ECHO: POST

데이터 및 헤더 요청




from flask import json

@app.route(&#39;/messages&#39;, methods = [&#39;POST&#39;])
def api_message():

 if request.headers[&#39;Content-Type&#39;] == &#39;text/plain&#39;:
  return "Text Message: " + request.data

 elif request.headers[&#39;Content-Type&#39;] == &#39;application/json&#39;:
  return "JSON Message: " + json.dumps(request.json)

 elif request.headers[&#39;Content-Type&#39;] == &#39;application/octet-stream&#39;:
  f = open(&#39;./binary&#39;, &#39;wb&#39;)
  f.write(request.data)
    f.close()
  return "Binary message written!"

 else:
  return "415 Unsupported Media Type ;)"
로그인 후 복사

지정된 콘텐츠 유형 요청:

curl -H "Content-type: application/json" -X POST http://127.0.0.1:5000/messages -d '{ "message":"Hello Data"}'curl -H "Content-type: application/octet-stream"

-X POST http://127.0.0.1:5000/messages --data-binary @message.bin


RESPONSES



from flask import Response

@app.route(&#39;/hello&#39;, methods = [&#39;GET&#39;])
def api_hello():
 data = {
  &#39;hello&#39; : &#39;world&#39;,
  &#39;number&#39; : 3
 }
 js = json.dumps(data)

 resp = Response(js, status=200, mimetype=&#39;application/json&#39;)
 resp.headers[&#39;Link&#39;] = &#39;http://luisrei.com&#39;

 return resp
로그인 후 복사

응답 보기 HTTP 헤더:

curl -i http://127.0.0.1: 5000/hello최적화 코드:

from 플라스크 가져오기 jsonify


사용

resp = jsonify(data)
resp.status_code = 200
로그인 후 복사

바꾸기

resp = Response(js, status=200, mimetype=&#39;application/json&#39;)
로그인 후 복사

상태 코드 및 오류


@app.errorhandler(404)
def not_found(error=None):
 message = {
   &#39;status&#39;: 404,
   &#39;message&#39;: &#39;Not Found: &#39; + request.url,
 }
 resp = jsonify(message)
 resp.status_code = 404

 return resp

@app.route(&#39;/users/<userid>&#39;, methods = [&#39;GET&#39;])
def api_users(userid):
 users = {&#39;1&#39;:&#39;john&#39;, &#39;2&#39;:&#39;steve&#39;, &#39;3&#39;:&#39;bill&#39;}
 
 if userid in users:
  return jsonify({userid:users[userid]})
 else:
  return not_found()
로그인 후 복사

요청:

GET / users/2HTTP/1.0 200 확인 {"2": "스티브"

}


GET /users/4

HTTP/1.0 404 찾을 수 없음

{

"status": 404,

"message": " 찾을 수 없음: http://127.0.0.1:5000/users/4"
}


AUTHORIZATION






from functools import wraps

def check_auth(username, password):
 return username == &#39;admin&#39; and password == &#39;secret&#39;

def authenticate():
 message = {&#39;message&#39;: "Authenticate."}
 resp = jsonify(message)

 resp.status_code = 401
 resp.headers[&#39;WWW-Authenticate&#39;] = &#39;Basic realm="Example"&#39;

 return resp

def requires_auth(f):
 @wraps(f)
 def decorated(*args, **kwargs):
  auth = request.authorization
  if not auth: 
   return authenticate()

  elif not check_auth(auth.username, auth.password):
   return authenticate()
  return f(*args, **kwargs)

 return decorated
로그인 후 복사

check_auth 기능 교체 및 require_auth 데코레이터 사용:

@app.route(' /secrets')@requires_authdef api_hello():return "쉿 이건 일급 비밀 스파이!"

HTTP 기본 인증:


curl -v -u "admin:secret" http://127.0.0.1: 5000/secrets

간단한 디버그 및 로깅



디버그:

app.run(debug=True)

로깅:

import logging
file_handler = logging.FileHandler(&#39;app.log&#39;)
app.logger.addHandler(file_handler)
app.logger.setLevel(logging.INFO)

@app.route(&#39;/hello&#39;, methods = [&#39;GET&#39;])
def api_hello():
 app.logger.info(&#39;informing&#39;)
 app.logger.warning(&#39;warning&#39;)
 app.logger.error(&#39;screaming bloody murder!&#39;)
 
 return "check your logs\n"
로그인 후 복사

위 내용은 Python 및 Flask를 사용하여 RESTful Web API를 구현하는 방법을 설명하는 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿