τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Πίνακας περιεχομένων
Γιατί να επιλέξετε το Apispec;
Δημιουργήστε απλή τεκμηρίωση API
1. Δημιουργήστε μια παρουσία Apispec
2. Καθορίστε διαδρομές και προβολές API
3. Προσθέστε διαδρομή στο Apispec
Ενσωματώστε το Flask και το APIspec
1. Εγκαταστήστε το Flask και το Flask-Apispec
2. Δημιουργήστε μια εφαρμογή Flask
Ενσωματώστε το Django και το APIspec
1. Εγκαταστήστε το Django και το Django-Rest-Framework
2. Δημιουργήστε έργα και εφαρμογές Django
6. Δημιουργήστε προδιαγραφές OpenAPI
Προηγμένες δυνατότητες του 03Apispec
2. Υποστήριξη πολλαπλών πλαισίων
3. Αυτόματη δημιουργία εγγράφων διεπαφής
4. Ενσωματωθείτε με εργαλεία τρίτων
5. Ορίστε προβολές και σειριοποίηση
6. Καθορίστε την κύρια εφαρμογή
7. Εκτελέστε την εφαρμογή και προβάλετε την τεκμηρίωση
Εισαγωγή στις προδιαγραφές API
Το Apispec είναι μια βιβλιοθήκη Python για τη δημιουργία προδιαγραφών OpenAPI (Swagger). Μπορεί να βοηθήσει τους προγραμματιστές να δημιουργούν και να διατηρούν αυτόματα έγγραφα API και να παρέχουν εύχρηστες και λεπτομερείς περιγραφές διεπαφής. Μέσω του Apispec, μπορούμε εύκολα να μετατρέψουμε τη συμβολοσειρά τεκμηρίωσης μιας συνάρτησης ή κλάσης Python σε έγγραφο που συμμορφώνεται με την προδιαγραφή OpenAPI, μειώνοντας το πρόβλημα της μη αυτόματης εγγραφής τεκμηρίωσης.
Απλό και εύκολο στη χρήση: Το Apispec παρέχει ένα απλό και εύχρηστο API, ώστε να μπορείτε να ξεκινήσετε γρήγορα.
Ευέλικτο και δυνατό: Υποστηρίζει πολλαπλά πλαίσια (όπως Flask, Django) και επεκτάσεις, επιτρέποντάς σας να προσαρμόσετε τη δημιουργία εγγράφων όπως απαιτείται.
αυτοματοποίηση: Μειώστε τις χειροκίνητες λειτουργίες και το κόστος συντήρησης με την αυτόματη δημιουργία και ενημέρωση εγγράφων.
Πριν αρχίσουμε να χρησιμοποιούμε το Apispec, πρέπει πρώτα να το εγκαταστήσουμε. Μπορείτε να το εγκαταστήσετε χρησιμοποιώντας το pip:
pip install apispec
Διεύθυνση έργου Github:
https://github.com/marshmallow-code/apispec
Ας δούμε τη βασική χρήση του Apispec μέσα από μερικά απλά παραδείγματα.
- 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
Προσθέστε rest_framework και apispec στο settings.py:
- INSTALLED_APPS = [
- ...
- 'rest_framework',
- 'myapp',
- 'apispec',
- ]
Στο 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"})
Στο 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:
- 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 παρέχει έναν ευέλικτο μηχανισμό επέκτασης που σας επιτρέπει να προσαρμόσετε τις γεννήτριες. Μπορείτε να εφαρμόσετε τη δική σας λογική γενιάς κληρονομώντας και επεκτείνοντας τη βασική κλάση που παρέχεται από την 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 υποστηρίζει μια ποικιλία από δημοφιλή πλαίσια Python, όπως Flask, Django, Falcon κ.λπ. Μπορείτε να επιλέξετε κατάλληλα πλαίσια και πρόσθετα ανάλογα με τις ανάγκες σας και να δημιουργήσετε γρήγορα έγγραφα API.
Το Apispec μπορεί να δημιουργήσει αυτόματα έγγραφα διεπαφής με βάση τη συμβολοσειρά τεκμηρίωσης μιας συνάρτησης ή μιας κλάσης, μειώνοντας τον φόρτο εργασίας της μη αυτόματης εγγραφής εγγράφων.
- 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 μπορεί να ενσωματωθεί με πολλά εργαλεία τρίτων, όπως το Swagger UI, το ReDoc, κ.λπ., για να παρέχει εύχρηστες λειτουργίες προβολής εγγράφων διεπαφής και δοκιμών.
- 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()
Δημιουργήστε ένα πλήρες σύστημα τεκμηρίωσης API
Ας υποθέσουμε ότι έχουμε ένα απλό σύστημα διαχείρισης χρηστών και πρέπει να τεκμηριώσουμε το API του. Το API μας περιλαμβάνει λειτουργίες προσθήκης, διαγραφής, τροποποίησης και ερωτήματος χρήστη, καθώς και ορισμένες βασικές λειτουργίες ελέγχου ταυτότητας.
- user_management/
- ├── app.py
- ├── models.py
- ├── views.py
- ├── serializers.py
- └── requirements.txt
Προσθήκη εξαρτήσεων στο request.txt:
- Flask
- Flask-RESTful
- Flask-SQLAlchemy
- Flask-Migrate
- apispec
- flask-apispec
Εκτελέστε την ακόλουθη εντολή για να εγκαταστήσετε εξαρτήσεις:
pip install -r requirements.txt
Ορίστε το μοντέλο χρήστη στο 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)
Ορίστε τους σειριακούς χρήστες στο 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)
-
Ορισμός προβολών στο 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
Στο 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()
Ξεκινήστε την εφαρμογή εκτελώντας την ακόλουθη εντολή:
python app.py
1. Διατηρήστε την τεκμηρίωση και τον κώδικα σε συγχρονισμό
Βεβαιωθείτε ότι η τεκμηρίωση είναι πάντα σε συγχρονισμό με τον κώδικα για να αποφύγετε ασυνέπειες μεταξύ της τεκμηρίωσης και του πραγματικού API. Μπορείτε να χρησιμοποιήσετε εργαλεία CI/CD για αυτόματη δημιουργία και ανάπτυξη τεκμηρίωσης.
2. Χρησιμοποιήστε σχολιασμούς και διακοσμητές
Χρησιμοποιώντας σχόλια και διακοσμητές, η τεκμηρίωση μπορεί να γίνει πιο συνοπτική και ευανάγνωστη. Για παράδειγμα, χρησιμοποιήστε το @doc decorator του Flask-Apispec για να προσθέσετε πληροφορίες τεκμηρίωσης σε μια λειτουργία προβολής.
3. Ορίστε καθολικές παραμέτρους και αποκρίσεις
Για παραμέτρους και αποκρίσεις που χρησιμοποιούνται συνήθως, καθολικές παράμετροι και πρότυπα απόκρισης μπορούν να οριστούν στο Apispec για μείωση του επαναλαμβανόμενου κώδικα.
- 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. Επανεξετάζετε και ενημερώνετε τακτικά την τεκμηρίωση
Ελέγχετε και ενημερώνετε τακτικά την τεκμηρίωση για να διασφαλίζετε την ακρίβεια και την πληρότητα. Αυτό μπορεί να επιτευχθεί με τη δημιουργία ενός κύκλου αναθεώρησης εγγράφων ή με την εισαγωγή μιας διαδικασίας αναθεώρησης εγγράφων.
Για περισσότερες λειτουργίες και λεπτομερή χρήση, ανατρέξτε στην επίσημη τεκμηρίωση:
https://apispec.readthedocs.io/en/latest
Μέσα από αυτό το άρθρο, πιστεύω ότι έχετε μια βασική κατανόηση και κυριαρχία του Apispec. Από τη βασική χρήση έως τις προηγμένες λειτουργίες, έως τις πρακτικές περιπτώσεις και τις βέλτιστες πρακτικές, παρουσιάζουμε αναλυτικά τον τρόπο χρήσης του Apispec για τη δημιουργία και τη συντήρηση εγγράφων API.
Ελπίζω να μπορείτε να εφαρμόσετε αυτή τη γνώση σε πραγματικά έργα και να προσθέσετε μια νότα φωτεινότητας στο API σας.