2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Sisällysluettelo
Luo yksinkertainen API-dokumentaatio
2. Määritä API-reitit ja näkymät
1. Asenna Flask ja Flask-Apispec
1. Asenna Django ja Django-Rest-Framework
2. Luo Django-projekteja ja -sovelluksia
3. Luo automaattisesti käyttöliittymäasiakirjoja
4. Integroi kolmannen osapuolen työkaluihin
5. Määrittele näkymät ja sarjoittaminen
7. Suorita sovellus ja tarkastele dokumentaatiota
Vieraile osoitteessa http://localhost:5000/swagger/ nähdäksesi luotu API-dokumentaatio.
Johdatus API-määrityksiin
Apispec on Python-kirjasto OpenAPI (Swagger) -määritysten luomiseen. Se voi auttaa kehittäjiä luomaan ja ylläpitämään API-asiakirjoja automaattisesti ja tarjoamaan intuitiivisia ja yksityiskohtaisia käyttöliittymäkuvauksia. Apispecin avulla voimme helposti muuntaa Python-funktion tai -luokan dokumentaatiomerkkijonon OpenAPI-spesifikaatioiden mukaiseksi dokumentiksi, mikä vähentää manuaalisen dokumentaation vaivaa.
Yksinkertainen ja helppokäyttöinen: Apispec tarjoaa yksinkertaisen ja helppokäyttöisen sovellusliittymän, joten voit aloittaa nopeasti.
Joustava ja tehokas: Tukee useita kehyksiä (kuten Flask, Django) ja laajennuksia, joiden avulla voit mukauttaa asiakirjojen luomista tarpeen mukaan.
automaatio: Vähennä manuaalisia toimintoja ja ylläpitokustannuksia luomalla ja päivittämällä asiakirjoja automaattisesti.
Ennen kuin aloitamme Apispecin käytön, meidän on ensin asennettava se. Voit asentaa sen pip:llä:
pip install apispec
Github-projektin osoite:
https://github.com/marshmallow-code/apispec
Katsotaanpa Apispecin peruskäyttöä muutaman yksinkertaisen esimerkin kautta.
- from apispec import APISpec
-
- spec = APISpec(
- title="My API",
- version="1.0.0",
- openapi_version="3.0.0",
- info=dict(description="This is a sample API"),
- )
- def get_user(user_id):
- """
- ---
- get:
- description: Get a user by ID
- parameters:
- - name: user_id
- in: path
- required: true
- schema:
- type: integer
- responses:
- 200:
- description: A user object
- content:
- application/json:
- schema:
- type: object
- properties:
- id:
- type: integer
- name:
- type: string
- """
- return {"id": user_id, "name": "John Doe"}
- spec.path(
- path="/users/{user_id}",
- operations=dict(
- get=dict(
- description="Get a user by ID",
- parameters=[
- {
- "name": "user_id",
- "in": "path",
- "required": True,
- "schema": {"type": "integer"},
- }
- ],
- responses={
- "200": {
- "description": "A user object",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "id": {"type": "integer"},
- "name": {"type": "string"},
- },
- }
- }
- },
- }
- },
- )
- ),
- )
pip install Flask Flask-Apispec
- from flask import Flask, jsonify
- from flask_apispec import FlaskApiSpec, doc, marshal_with
- from flask_apispec.views import MethodResource
- from marshmallow import Schema, fields
-
- app = Flask(__name__)
-
- class UserSchema(Schema):
- id = fields.Int()
- name = fields.Str()
-
- class UserResource(MethodResource):
- @doc(description='Get a user by ID', tags=['User'])
- @marshal_with(UserSchema)
- def get(self, user_id):
- return {"id": user_id, "name": "John Doe"}
-
- app.add_url_rule('/users/<int:user_id>', view_func=UserResource.as_view('user_resource'))
- docs = FlaskApiSpec(app)
- docs.register(UserResource)
-
- @app.route('/swagger/')
- def swagger_ui():
- return jsonify(docs.spec.to_dict())
-
- if __name__ == '__main__':
- app.run()
pip install django djangorestframework
- django-admin startproject myproject
- cd myproject
- django-admin startapp myapp
Lisää rest_framework ja apispec osoitteeseen settings.py:
- INSTALLED_APPS = [
- ...
- 'rest_framework',
- 'myapp',
- 'apispec',
- ]
Osoitteessa myapp/views.py:
- from rest_framework.views import APIView
- from rest_framework.response import Response
- from rest_framework.schemas import AutoSchema
-
- class UserView(APIView):
- schema = AutoSchema(
- manual_fields=[
- coreapi.Field('user_id', required=True, location='path', schema={'type': 'integer'})
- ]
- )
-
- def get(self, request, user_id):
- """
- Get a user by ID.
- ---
- responses:
- 200:
- description: A user object
- content:
- application/json:
- schema:
- type: object
- properties:
- id:
- type: integer
- name:
- type: string
- """
- return Response({"id": user_id, "name": "John Doe"})
Osoitteessa myapp/urls.py:
- from django.urls import path
- from .views import UserView
-
- urlpatterns = [
- path('users/<int:user_id>/', UserView.as_view(), name='user-view'),
- ]
Manager.py:ssä:
- from apispec import APISpec
- from rest_framework.schemas import get_schema_view
-
- spec = APISpec(
- title="My API",
- version="1.0.0",
- openapi_version="3.0.0",
- )
-
- schema_view = get_schema_view(title="My API")
- schema = schema_view.get_schema(request=None, public=True)
- spec.components.schema('User', schema)
- spec.path(path='/users/{user_id}/', operations=schema['paths']['/users/{user_id}/'])
-
- print(spec.to_yaml())
APIspec tarjoaa joustavan laajennusmekanismin, jonka avulla voit mukauttaa generaattoreita. Voit toteuttaa oman sukupolvilogiikkasi perimällä ja laajentamalla Apispecin tarjoamaa perusluokkaa.
- from apispec import BasePlugin
-
- class MyPlugin(BasePlugin):
- def path_helper(self, operations, *, resource, **kwargs):
- operations.update({
- 'get': {
- 'description': 'Get a user by ID',
- 'parameters': [
- {'name': 'user_id', 'in': 'path', 'required': True, 'schema': {'type': 'integer'}}
- ],
- 'responses': {
- '200': {
- 'description': 'A user object',
- 'content': {
- 'application/json': {
- 'schema': {
- 'type': 'object',
- 'properties': {
- 'id': {'type': 'integer'},
- 'name': {'type': 'string'}
- }
- }
- }
- }
- }
- }
- }
- })
-
- spec = APISpec(
- title="My API",
- version="1.0.0",
- openapi_version="3.0.0",
- plugins=[MyPlugin()],
- )
Apispec tukee useita suosittuja Python-kehyksiä, kuten Flask, Django, Falcon jne. Voit valita sopivat puitteet ja laajennukset tarpeidesi mukaan ja luoda nopeasti API-asiakirjoja.
Apispec voi luoda automaattisesti käyttöliittymädokumentteja funktion tai luokan dokumentaatiomerkkijonon perusteella, mikä vähentää asiakirjojen manuaalisen kirjoittamisen työmäärää.
- def get_user(user_id):
- """
- ---
- get:
- description: Get a user by ID
- parameters:
- - name: user_id
- in: path
- required: true
- schema:
- type: integer
- responses:
- 200:
- description: A user object
- content:
- application/json:
- schema:
- type: object
- properties:
- id:
- type: integer
- name:
- type: string
- """
- return {"id": user_id, "name": "John Doe"}
Apispec voidaan integroida moniin kolmansien osapuolien työkaluihin, kuten Swagger UI, ReDoc jne., intuitiivisen käyttöliittymän asiakirjojen näyttö- ja testaustoimintojen tarjoamiseksi.
- from flask import Flask, jsonify
- from flask_apispec import FlaskApiSpec
-
- app = Flask(__name__)
-
- @app.route('/users/<int:user_id>', methods=['GET'])
- def get_user(user_id):
- """
- ---
- get:
- description: Get a user by ID
- parameters:
- - name: user_id
- in: path
- required: true
- schema:
- type: integer
- responses:
- 200:
- description: A user object
- content:
- application/json:
- schema:
- type: object
- properties:
- id:
- type: integer
- name:
- type: string
- """
- return jsonify({"id": user_id, "name": "John Doe"})
-
- docs = FlaskApiSpec(app)
- docs.register(get_user)
-
- if __name__ == '__main__':
- app.run()
Rakenna täydellinen API-dokumentaatiojärjestelmä
Oletetaan, että meillä on yksinkertainen käyttäjien hallintajärjestelmä ja meidän on dokumentoitava sen API. Sovellusliittymämme sisältää käyttäjien lisäys-, poisto-, muokkaus- ja kyselytoiminnot sekä joitain perustunnistustoimintoja.
- user_management/
- ├── app.py
- ├── models.py
- ├── views.py
- ├── serializers.py
- └── requirements.txt
Lisää riippuvuudetvaatimukset.txt-tiedostoon:
- Flask
- Flask-RESTful
- Flask-SQLAlchemy
- Flask-Migrate
- apispec
- flask-apispec
Suorita seuraava komento asentaaksesi riippuvuudet:
pip install -r requirements.txt
Määritä käyttäjämalli mallissa.py:
- from flask_sqlalchemy import SQLAlchemy
-
- db = SQLAlchemy()
-
- class User(db.Model):
- id = db.Column(db.Integer, primary_key=True)
- name = db.Column(db.String(80), nullable=False)
- email = db.Column(db.String(120), unique=True, nullable=False)
Määritä käyttäjien serialisoijat serializers.py:ssä:
- from marshmallow import Schema, fields
-
- class UserSchema(Schema):
- id = fields.Int(dump_only=True)
- name = fields.Str(required=True)
- email = fields.Email(required=True)
-
Määritä näkymät view.py:ssä:
- from flask import request
- from flask_restful import Resource
- from models import User, db
- from serializers import UserSchema
-
- class UserResource(Resource):
- def get(self, user_id):
- user = User.query.get_or_404(user_id)
- schema = UserSchema()
- return schema.dump(user)
-
- def post(self):
- schema = UserSchema()
- user = schema.load(request.json)
- db.session.add(user)
- db.session.commit()
- return schema.dump(user), 201
-
- def put(self, user_id):
- user = User.query.get_or_404(user_id)
- schema = UserSchema(partial=True)
- updated_user = schema.load(request.json, instance=user)
- db.session.commit()
- return schema.dump(updated_user)
-
- def delete(self, user_id):
- user = User.query.get_or_404(user_id)
- db.session.delete(user)
- db.session.commit()
- return '', 204
App.py:ssä:
- from flask import Flask
- from flask_restful import Api
- from flask_migrate import Migrate
- from models import db
- from views import UserResource
- from flask_apispec import FlaskApiSpec
- from flask_apispec.extension import FlaskApiSpec
-
- app = Flask(__name__)
- app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
- db.init_app(app)
- migrate = Migrate(app, db)
- api = Api(app)
-
- api.add_resource(UserResource, '/users/<int:user_id>')
-
- docs = FlaskApiSpec(app)
- docs.register(UserResource)
-
- if __name__ == '__main__':
- app.run()
Käynnistä sovellus suorittamalla seuraava komento:
python app.py
1. Pidä asiakirjat ja koodi synkronoituna
Varmista, että dokumentaatio on aina synkronoitu koodin kanssa välttääksesi epäjohdonmukaisuudet dokumentaation ja todellisen API:n välillä. Voit käyttää CI/CD-työkaluja dokumenttien automaattiseen luomiseen ja käyttöönottoon.
2. Käytä huomautuksia ja koristeita
Kommentteja ja sisustajia käyttämällä dokumentaatiosta voidaan tehdä tiiviimpää ja luettavampaa. Käytä esimerkiksi Flask-Apispecin @doc-decoratoria dokumentaatiotietojen lisäämiseen näkymätoimintoon.
3. Määritä globaalit parametrit ja vastaukset
Yleisesti käytetyille parametreille ja vastauksille voidaan määrittää yleiset parametrit ja vastausmallit Apispecissä toistuvan koodin vähentämiseksi.
- spec.components.parameter("user_id", "path", schema={"type": "integer"}, required=True)
- spec.components.response("User", {
- "description": "A user object",
- "content": {
- "application/json": {
- "schema": {
- "type": "object",
- "properties": {
- "id": {"type": "integer"},
- "name": {"type": "string"}
- }
- }
- }
- }
- })
4. Tarkista ja päivitä dokumentaatio säännöllisesti
Tarkista ja päivitä asiakirjat säännöllisesti tarkkuuden ja täydellisyyden varmistamiseksi. Tämä voidaan saavuttaa perustamalla asiakirjojen tarkistussykli tai ottamalla käyttöön asiakirjojen tarkistusprosessi.
Lisätietoja toiminnoista ja yksityiskohtaisesta käytöstä on virallisessa dokumentaatiossa:
https://apispec.readthedocs.io/en/latest
Tämän artikkelin kautta uskon, että sinulla on perusymmärrys ja hallinta Apispecistä. Peruskäytöstä edistyneisiin toimintoihin, käytännön tapauksiin ja parhaisiin käytäntöihin, esittelemme kattavasti, kuinka Apispeciä käytetään API-asiakirjojen luomiseen ja ylläpitoon.
Toivon, että voit soveltaa tätä tietoa todellisiin projekteihin ja lisätä sovellusliittymääsi kirkkautta.