minhas informações de contato
Correspondência[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Índice
Gere documentação simples de API
2. Defina rotas e visualizações de API
3. Adicione caminho ao Apispec
1. Instale o Flask e o Flask-Apispec
1. Instale Django e Django-Rest-Framework
2. Crie projetos e aplicativos Django
4. Defina visualizações do Django
6. Gerar especificação OpenAPI
Recursos avançados do 03Apispec
2. Suporta múltiplas estruturas
3. Gere documentos de interface automaticamente
4. Integre com ferramentas de terceiros
5. Defina visualizações e serialização
6. Defina a aplicação principal
7. Execute o aplicativo e veja a documentação
Visite http://localhost:5000/swagger/ para visualizar a documentação da API gerada.
Introdução às especificações de API
Apispec é uma biblioteca Python para gerar especificações OpenAPI (Swagger). Ele pode ajudar os desenvolvedores a gerar e manter automaticamente documentos de API e fornecer descrições de interface intuitivas e detalhadas. Por meio do Apispec, podemos converter facilmente a string de documentação de uma função ou classe Python em um documento que esteja em conformidade com a especificação OpenAPI, reduzindo o problema de escrever documentação manualmente.
Simples e fácil de usar: Apispec fornece uma API simples e fácil de usar, permitindo que você comece rapidamente.
Flexível e poderoso: Suporta vários frameworks (como Flask, Django) e extensões, permitindo personalizar a geração de documentos conforme necessário.
automação: Reduza operações manuais e custos de manutenção gerando e atualizando documentos automaticamente.
Antes de começarmos a usar o Apispec, precisamos primeiro instalá-lo. Você pode instalá-lo usando pip:
pip install apispec
Endereço do projeto Github:
https://github.com/marshmallow-code/apispec
Vejamos o uso básico do Apispec por meio de alguns exemplos simples.
- 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
Adicione rest_framework e apispec em settings.py:
- INSTALLED_APPS = [
- ...
- 'rest_framework',
- 'myapp',
- 'apispec',
- ]
Em 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"})
Em myapp/urls.py:
- from django.urls import path
- from .views import UserView
-
- urlpatterns = [
- path('users/<int:user_id>/', UserView.as_view(), name='user-view'),
- ]
Em gerenciar.py:
- 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 fornece um mecanismo de extensão flexível que permite personalizar geradores. Você pode implementar sua própria lógica de geração herdando e estendendo a classe base fornecida pelo Apispec.
- 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 oferece suporte a uma variedade de estruturas Python populares, como Flask, Django, Falcon, etc. Você pode escolher estruturas e plug-ins apropriados de acordo com suas necessidades para gerar rapidamente documentos de API.
Apispec pode gerar automaticamente documentos de interface com base na string de documentação de uma função ou classe, reduzindo a carga de trabalho de escrita manual de documentos.
- 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 pode ser integrado com muitas ferramentas de terceiros, como Swagger UI, ReDoc, etc., para fornecer interface intuitiva de exibição de documentos e funções de teste.
- 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()
Crie um sistema completo de documentação de API
Suponha que temos um sistema simples de gerenciamento de usuários e precisamos documentar sua API. Nossa API inclui operações de adição, exclusão, modificação e consulta de usuários, bem como algumas funções básicas de autenticação de identidade.
- user_management/
- ├── app.py
- ├── models.py
- ├── views.py
- ├── serializers.py
- └── requirements.txt
Adicione dependências em requisitos.txt:
- Flask
- Flask-RESTful
- Flask-SQLAlchemy
- Flask-Migrate
- apispec
- flask-apispec
Execute o seguinte comando para instalar dependências:
pip install -r requirements.txt
Defina o modelo do usuário em models.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)
Defina serializadores de usuário em serializers.py:
- from marshmallow import Schema, fields
-
- class UserSchema(Schema):
- id = fields.Int(dump_only=True)
- name = fields.Str(required=True)
- email = fields.Email(required=True)
-
Defina visualizações em views.py:
- 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
Em app.py:
- 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()
Inicie o aplicativo executando o seguinte comando:
python app.py
1. Mantenha a documentação e o código sincronizados
Certifique-se de que a documentação esteja sempre sincronizada com o código para evitar inconsistências entre a documentação e a API real. Você pode usar ferramentas de CI/CD para gerar e implantar documentação automaticamente.
2. Use anotações e decoradores
Ao usar comentários e decoradores, a documentação pode se tornar mais concisa e legível. Por exemplo, use o decorador @doc do Flask-Apispec para adicionar informações de documentação a uma função de visualização.
3. Defina parâmetros e respostas globais
Para parâmetros e respostas comumente usados, parâmetros globais e modelos de resposta podem ser definidos no Apispec para reduzir código repetido.
- 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. Revise e atualize regularmente a documentação
Revise e atualize regularmente a documentação para garantir precisão e integridade. Isto pode ser conseguido através da criação de um ciclo de revisão de documentos ou da introdução de um processo de revisão de documentos.
Para mais funções e uso detalhado, consulte a documentação oficial:
https://apispec.readthedocs.io/en/latest
Através deste artigo, acredito que você tenha um conhecimento básico e domínio do Apispec. Do uso básico às funções avançadas, passando por casos práticos e melhores práticas, apresentamos de forma abrangente como usar o Apispec para gerar e manter documentos API.
Espero que você possa aplicar esse conhecimento a projetos reais e adicionar um toque de brilho à sua API.