Use Python & amp; Flask to implement RESTful Web APIs. Use python

Source: Internet
Author: User

Use Python & Flask to implement RESTful Web APIs, and use python

Environment installation:

sudo pip install flask

Flask is a Python microservice framework, based on Werkzeug, a wsgi class library.

Advantages of Flask:

  • 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_forapp = Flask(__name__)@app.route('/')def api_root():    return 'Welcome'@app.route('/articles')def api_articles():    return 'List of ' + url_for('api_articles')@app.route('/articles/<articleid>')def api_article(articleid):    return 'You are reading ' + articleidif __name__ == '__main__':    app.run()

Request:

curl http://127.0.0.1:5000/

Response:

GET /WelcomeGET /articlesList of /articlesGET /articles/123You are reading 123
REQUESTSGET Parameters
from flask import request@app.route('/hello')def api_hello():    if 'name' in request.args:        return 'Hello ' + request.args['name']    else:        return 'Hello John Doe'

Request:

GET /helloHello John DoeGET /hello?name=LuisHello Luis
Request Methods (HTTP Verbs)
@app.route('/echo', methods = ['GET', 'POST', 'PATCH', 'PUT', 'DELETE'])def api_echo():    if request.method == 'GET':        return "ECHO: GET\n"    elif request.method == 'POST':        return "ECHO: POST\n"    elif request.method == 'PATCH':        return "ECHO: PACTH\n"    elif request.method == 'PUT':        return "ECHO: PUT\n"    elif request.method == 'DELETE':        return "ECHO: DELETE"

Request type specified by the request:

curl -X PATCH http://127.0.0.1:5000/echo
GET /echoECHO: GETPOST /ECHOECHO: POST
Request Data & Headers
from flask import json@app.route('/messages', methods = ['POST'])def api_message():    if request.headers['Content-Type'] == 'text/plain':        return "Text Message: " + request.data    elif request.headers['Content-Type'] == 'application/json':        return "JSON Message: " + json.dumps(request.json)    elif request.headers['Content-Type'] == 'application/octet-stream':        f = open('./binary', 'wb')        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('/hello', methods = ['GET'])def api_hello():    data = {        'hello'  : 'world',        'number' : 3    }    js = json.dumps(data)    resp = Response(js, status=200, mimetype='application/json')    resp.headers['Link'] = 'http://luisrei.com'    return resp

View response HTTP headers:

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

Optimization code:

from flask import jsonify

Use

resp = jsonify(data)resp.status_code = 200

Replace

resp = Response(js, status=200, mimetype='application/json')
Status Codes & Errors
@app.errorhandler(404)def not_found(error=None):    message = {            'status': 404,            'message': 'Not Found: ' + request.url,    }    resp = jsonify(message)    resp.status_code = 404    return resp@app.route('/users/<userid>', methods = ['GET'])def api_users(userid):    users = {'1':'john', '2':'steve', '3':'bill'}        if userid in users:        return jsonify({userid:users[userid]})    else:        return not_found()

Request:

GET /users/2HTTP/1.0 200 OK{    "2": "steve"}GET /users/4HTTP/1.0 404 NOT FOUND{"status": 404, "message": "Not Found: http://127.0.0.1:5000/users/4"}
AUTHORIZATION
from functools import wrapsdef check_auth(username, password):    return username == 'admin' and password == 'secret'def authenticate():    message = {'message': "Authenticate."}    resp = jsonify(message)    resp.status_code = 401    resp.headers['WWW-Authenticate'] = 'Basic realm="Example"'    return respdef 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

Replacingcheck_authFunction and usingrequires_authDecorator:

@app.route('/secrets')@requires_authdef 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 loggingfile_handler = logging.FileHandler('app.log')app.logger.addHandler(file_handler)app.logger.setLevel(logging.INFO)@app.route('/hello', methods = ['GET'])def api_hello():    app.logger.info('informing')    app.logger.warning('warning')    app.logger.error('screaming bloody murder!')        return "check your logs\n"

 

Refer:

Flask documentation

Flask snippets

Werkzeug documentation

Curl manual

 

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.