Home  >  Article  >  Backend Development  >  Examples to explain using Python & Flask to implement RESTful Web API

Examples to explain using Python & Flask to implement RESTful Web API

巴扎黑
巴扎黑Original
2017-09-20 09:56:502664browse

The following editor will bring you an example of using Python & Flask to implement RESTful Web API. The editor thinks it’s pretty good, so I’ll share it with you now and give it as a reference. Let’s follow the editor and take a look.

Environment installation:

sudo pip install flask

Flask is a Python A microservices framework based on Werkzeug, a WSGI class library.

Flask Advantages:

Written in Python (that can be an advantage);
Simple to use;
Flexible;
Multiple good deployment options;
RESTful request dispatching

RESOURCES

An API service that responds to /articles and /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()

Request:

curl http://127.0.0.1:5000/

Response:

GET /
Welcome

GET /articles
List of /articles

GET /articles/123
You are reading 123

REQUESTS

GET Parameters


##

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;

Request:

GET /hello

Hello John Doe

GET /hello?name=Luis

Hello Luis

Request Methods (HTTP Verbs)


@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 specify request type:

curl -X PATCH http://127.0.0.1:5000/echo

GET /echo
ECHO: GET

POST /ECHO

ECHO: POST

Request Data & Headers


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 ;)"

Request specified content 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

View response HTTP headers:

curl -i http://127.0.0.1:5000/hello

Optimize code:

from flask import jsonify

Use

resp = jsonify(data)
resp.status_code = 200

Replace

resp = Response(js, status=200, mimetype=&#39;application/json&#39;)


Status Codes & Errors

@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()

Request:

GET /users/2

HTTP/1.0 200 OK

{

"2": "steve"
}

GET /users/4
HTTP/1.0 404 NOT FOUND

{

"status": 404,
"message": "Not Found: 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

replacing the check_auth function and using the requires_auth decorator:


@app.route('/secrets')

@requires_auth

def api_hello():

return "Shhh this is top secret spy stuff!"

HTTP basic authentication:

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

##SIMPLE DEBUG & LOGGING

Debug:app.run(debug=True)Logging:

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"

The above is the detailed content of Examples to explain using Python & Flask to implement RESTful Web API. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn