REST API ?
HTTP
METHODS
https://api.example.com/speakers https://api.example.com/speakers/1
GET 1
POST -
PUT
request body
request body field null
1 request body
request body field null
PATCH
request body
request body field
1 request body
request body field
DELETE 1
OpenAPI Specification Python Web Apps & OAS Django FlaskREST API
Representational State Transfer
( API )
REST API
OpenAPI Specification Python Web Apps & OAS Django FlaskREST API
●API ,
●Host, port
●
●URI
●URI HTTP method
● request header, body
● response status code, body
REST API
OpenAPI Specification Python Web Apps & OAS Django FlaskREST API
RESTful API
JSON, YAML
API , /
Swagger OpenAPI Initiative
OpenAPI Specification
https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md
REST API Python Web Apps & OAS Django FlaskOpenAPI Specification
API
toolset
●Swagger Codegen
●Swagger Editor
●Swagger UI
Swagger UI
●OpenAPI JSON/YAML
API
Swagger?
https://petstore.swagger.io/
REST API Python Web Apps & OAS Django FlaskOpenAPI Specification
API
toolset
●Swagger Codegen
●Swagger Editor
●Swagger UI
Swagger UI
●OpenAPI JSON/YAML
API
Swagger?
https://petstore.swagger.io/
REST API Python Web Apps & OAS Django FlaskOpenAPI Specification
API
toolset
●Swagger Codegen
●Swagger Editor
●Swagger UI
Swagger UI
●OpenAPI JSON/YAML
API
Swagger?
https://petstore.swagger.io/
REST API Python Web Apps & OAS Django FlaskOpenAPI Specification
API
toolset
●Swagger Codegen
●Swagger Editor
●Swagger UI
Swagger UI
●OpenAPI JSON/YAML
API
Swagger?
https://petstore.swagger.io/
REST API Python Web Apps & OAS Django FlaskOpenAPI Specification
API
toolset
●Swagger Codegen
●Swagger Editor
●Swagger UI
Swagger UI
●OpenAPI JSON/YAML
API
Swagger?
REST API Python Web Apps & OAS Django FlaskOpenAPI Specification
https://petstore.swagger.io/
title: Sample PyCON speaker API
description: This is a sample server for a PyCON speaker management.
termsOfService: http://example.com/terms/
contact:
name: API Support
url: http://www.example.com/support
email: support@example.com
license:
name: MIT
version: 1.0.1
OpenAPI Specification YAML
https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md
REST API Python Web Apps & OAS Django FlaskOpenAPI Specification
servers:
- url: https://pycon-speaker.com:{port}/{basePath}
description: The production API server
variables:
port:
enum:
- '443'
- '8443'
default: '8443'
description: 8443 is for demo.
basePath:
default: v2
OpenAPI Specification YAML
https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md
REST API Python Web Apps & OAS Django FlaskOpenAPI Specification
paths:
/speakers:
get:
description: Returns all speakers from the system that the user has access to
responses:
'200':
description: A list of speakers.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Speaker'
OpenAPI Specification YAML
https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md
REST API Python Web Apps & OAS Django FlaskOpenAPI Specification
OpenAPI Specification YAML
https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md
REST API Python Web Apps & OAS Django FlaskOpenAPI Specification
OpenAPI Specification
JSON / YAML
APISwagger UI
paths:
/speakers:
get:
description: Returns all speakers from the system
that the user has access to
responses:
'200':
description: A list of speakers.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Speaker'
Generating OpenAPI YAML
Web Application Server
●Server information
○Base URL, port, ...
●Routing information
○ path
●Request params
●Response schema
REST API OpenAPI Specification Django FlaskPython Web Apps & OAS
Generating OpenAPI YAML
servers:
- url: https://pycon-speaker.com:{port}/{basePath}
description: The production API server
variables:
port:
enum:
- '443'
- '8443'
default: '8443'
description: 8443 is for demo.
basePath:
default: v2
Web Application Server
●Server information
○Routing information
■ Request params
■ Response schema
REST API OpenAPI Specification Django FlaskPython Web Apps & OAS
Generating OpenAPI YAML
paths:
/speakers:
get:
description: Returns all speakers
responses:
'200':
description: A list of speakers.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Speaker'
Web Application Server
●Server information
○Routing information
■ Request params
■ Response schema
REST API OpenAPI Specification Django FlaskPython Web Apps & OAS
Generating OpenAPI YAML
paths:
/speakers:
get:
description: Returns all speakers
responses:
'200':
description: A list of speakers.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Speaker'
Web Application Server
●Server information
○Routing information
■ Request params
■ Response schema
REST API OpenAPI Specification Django FlaskPython Web Apps & OAS
Generating OpenAPI YAML
paths:
/speakers:
get:
description: Returns all speakers
responses:
'200':
description: A list of speakers.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Speaker'
Web Application Server
●Server information
○Routing information
■ Request params
■ Response schema
REST API OpenAPI Specification Django FlaskPython Web Apps & OAS
Django & OAS
Django Server
●Server information →
○Routing information → urls.urlpatterns
■ Request params → View, Model
■ Response schema → View, Model
REST API OpenAPI Specification Django FlaskPython Web Apps & OAS
Django & OAS
Server Information
● ,
Routing Information
●urlpatterns
# urls.py
openapi_schema_view = get_schema_view(
openapi.Info(
title='Demo API',
default_version='v1',
),
url='https://demo.example.com:3000',
public=True,
)
urlpatterns = [
path('admin/', admin.site.urls),
path('docs/', openapi_schema_view.with_ui(...),
path('', include(router.urls)),
]
REST API OpenAPI Specification Django FlaskPython Web Apps & OAS
Flask & OAS
Request Params, Response Schema
●Function View (Django )
○ view request, response
■ docstring ? → API
●Pluggable View(Class Based View)
○Function View Extension
REST API OpenAPI Specification Django FlaskPython Web Apps & OAS
●Server information
○
●Routing information
○ framework routing
●Request params
○(Django) View class form
●Response schema
○(Django) View class model
REST API OpenAPI Specification Django FlaskPython Web Apps & OAS
●Resource View get, post
●arg parser View
●field model marshal
Flask-RESTful
REST API OpenAPI Specification Python Web Apps & OAS Django Flask
●Flask-RESTful
○ Flask-RESTful API
● API
●Flask-RESTful
Flask-RESTPlus
REST API OpenAPI Specification Python Web Apps & OAS Django Flask
●Flask RESTful Swagger 2.0
○ OpenAPI Spec 1.2
○ 2.0
●SQLAlchemy Flask RESTful Swagger (SAFRS)
○ DB model class
○ Model method docstring
API
REST API OpenAPI Specification Python Web Apps & OAS Django Flask
Flask-RESTPlus
REST API OpenAPI Specification Python Web Apps & OAS Django Flask
●Flask RESTful Swagger 2.0
○ OpenAPI Spec 1.2
○ 2.0
●SQLAlchemy Flask RESTful Swagger (SAFRS)
○ DB model class
○ Model method docstring
Flask-RESTPlus
REST API OpenAPI Specification Python Web Apps & OAS Django Flask
●Flask RESTful Swagger 2.0
○ OpenAPI Spec 1.2
○ 2.0
●SQLAlchemy Flask RESTful Swagger (SAFRS)
○ DB model class
○ Model method docstring
●Flask-RESTPlus
Flask-RESTPlus
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_restplus import Api
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.sqlite3'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
api = Api(app)
REST API OpenAPI Specification Python Web Apps & OAS Django Flask
Flask-RESTPlus
class OrganizationModel(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(100), nullable=False)
class SpeakerModel(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(10), nullable=True)
email = db.Column(db.String(120), unique=True, nullable=False)
organization_id = db.Column(db.Integer, db.ForeignKey('organization_model.id'))
organization = relationship('OrganizationModel')
REST API OpenAPI Specification Python Web Apps & OAS Django Flask