प्रौद्योगिकी साझेदारी

Apispec, OpenAPI (Swagger) विनिर्देशान् जनयितुं Python पुस्तकालयः

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

सामग्रीसूची

01एपिआइस्पेक् किम् ?

एपिस्पेक् किमर्थं चिनोति ?

संस्थापनं विन्यासश्च

02Apispec इत्यस्य मूलभूतः उपयोगः

सरलं एपिआइ दस्तावेजीकरणं जनयन्तु

1. Apispec उदाहरणं रचयन्तु

2. एपिआइ मार्गाः दृश्यानि च परिभाषयन्तु

3. Apispec मध्ये मार्गं योजयन्तु

Flask तथा APIspec एकीकृत करें

1. Flask तथा Flask-Apispec संस्थापयन्तु

2. Flask अनुप्रयोगं रचयन्तु

Django तथा APIspec एकीकृत्य

1. Django तथा Django-Rest-Framework संस्थापयन्तु

2. Django परियोजनानि अनुप्रयोगाः च रचयन्तु

3. Django परियोजना विन्यस्तं कुर्वन्तु

4. Django दृश्यानि परिभाषयन्तु

5. URL विन्यस्तं कुर्वन्तु

6. OpenAPI विनिर्देशं जनयन्तु

03Apispec इत्यस्य उन्नतविशेषताः

1. कस्टम जनरेटर

2. बहुविधरूपरेखानां समर्थनं कुर्वन्तु

3. स्वयमेव अन्तरफलकदस्तावेजान् जनयन्तु

4. तृतीयपक्षीयसाधनैः सह एकीकरणं कुर्वन्तु

०४व्यावहारिकप्रकरणाः

1. परियोजना परिचय

2. परियोजना संरचना

3. आश्रयाणि संस्थापयन्तु

4. आदर्शं परिभाषयतु

5. दृश्यानि क्रमाङ्कनं च परिभाषयन्तु

6. मुख्यानुप्रयोगं परिभाषयन्तु

7. एप् चालयित्वा दस्तावेजीकरणं पश्यन्तु

उत्पन्नं एपिआइ-दस्तावेजं द्रष्टुं http://localhost:5000/swagger/ इति गच्छन्तु ।

05उत्तम अभ्यास

०६ सारांशः



01एपिआइस्पेक् इति किम् ?

एपिआइस्पेस् इत्यस्य परिचयः

Apispec OpenAPI (Swagger) विनिर्देशान् जनयितुं Python पुस्तकालयः अस्ति । एतत् विकासकान् स्वयमेव एपिआइ-दस्तावेजान् जनयितुं परिपालयितुं च सहायं कर्तुं शक्नोति तथा च सहजं विस्तृतं च अन्तरफलकं विवरणं प्रदातुं शक्नोति । Apispec इत्यस्य माध्यमेन वयं Python फंक्शन् अथवा क्लास् इत्यस्य documentation स्ट्रिंग् इत्येतत् OpenAPI विनिर्देशस्य अनुरूपं दस्तावेजे सहजतया परिवर्तयितुं शक्नुमः, येन दस्तावेजीकरणं मैन्युअल् रूपेण लेखनस्य कष्टं न्यूनीकरोति

एपिस्पेक् किमर्थं चिनोति ?

  • सरलं सुलभं च: Apispec सरलं सुलभं च API प्रदाति येन भवान् शीघ्रं आरभुं शक्नोति।

  • लचीला तथा शक्तिशाली: बहुविधरूपरेखां (यथा Flask, Django) विस्तारं च समर्थयति, यत् आवश्यकतानुसारं दस्तावेजजननं अनुकूलितुं शक्नोति ।

  • स्वचालनम्: स्वयमेव दस्तावेजान् जनयित्वा अद्यतनं कृत्वा हस्तचलितसञ्चालनस्य अनुरक्षणस्य च व्ययस्य न्यूनीकरणं कुर्वन्तु।

संस्थापनं विन्यासश्च

Apispec इत्यस्य उपयोगं आरभ्यतुं पूर्वं प्रथमं तत् संस्थापयितुं आवश्यकम् । भवान् pip इत्यस्य उपयोगेन संस्थापयितुं शक्नोति:

pip install apispec

Github परियोजना पता:

https://github.com/marshmallow-code/apispec

02APIspec इत्यस्य मूलभूतः उपयोगः

कतिपयानां सरलानाम् उदाहरणानां माध्यमेन Apispec इत्यस्य मूलभूतं उपयोगं पश्यामः ।

सरलं एपिआइ दस्तावेजीकरणं जनयन्तु

1. Apispec उदाहरणं रचयन्तु

  1. from apispec import APISpec
  2. spec = APISpec(
  3.     title="My API",
  4.     version="1.0.0",
  5.     openapi_version="3.0.0",
  6.     info=dict(description="This is a sample API"),
  7. )

2. एपिआइ मार्गाः दृश्यानि च परिभाषयन्तु

  1. def get_user(user_id):
  2.     """
  3.     ---
  4.     get:
  5.       description: Get a user by ID
  6.       parameters:
  7.         - name: user_id
  8.           in: path
  9.           required: true
  10.           schema:
  11.             type: integer
  12.       responses:
  13.         200:
  14.           description: A user object
  15.           content:
  16.             application/json:
  17.               schema:
  18.                 type: object
  19.                 properties:
  20.                   id:
  21.                     type: integer
  22.                   name:
  23.                     type: string
  24.     """
  25.     return {"id": user_id, "name""John Doe"}

3. Apispec मध्ये मार्गं योजयन्तु

  1. spec.path(
  2.     path="/users/{user_id}",
  3.     operations=dict(
  4.         get=dict(
  5.             description="Get a user by ID",
  6.             parameters=[
  7.                 {
  8.                     "name""user_id",
  9.                     "in""path",
  10.                     "required"True,
  11.                     "schema": {"type""integer"},
  12.                 }
  13.             ],
  14.             responses={
  15.                 "200": {
  16.                     "description""A user object",
  17.                     "content": {
  18.                         "application/json": {
  19.                             "schema": {
  20.                                 "type""object",
  21.                                 "properties": {
  22.                                     "id": {"type""integer"},
  23.                                     "name": {"type""string"},
  24.                                 },
  25.                             }
  26.                         }
  27.                     },
  28.                 }
  29.             },
  30.         )
  31.     ),
  32. )

Flask तथा APIspec एकीकृत करें

1. Flask तथा Flask-Apispec संस्थापयन्तु

pip install Flask Flask-Apispec

2. Flask अनुप्रयोगं रचयन्तु

  1. from flask import Flask, jsonify
  2. from flask_apispec import FlaskApiSpec, doc, marshal_with
  3. from flask_apispec.views import MethodResource
  4. from marshmallow import Schema, fields
  5. app = Flask(__name__)
  6. class UserSchema(Schema):
  7.     id = fields.Int()
  8.     name = fields.Str()
  9. class UserResource(MethodResource):
  10.     @doc(description='Get a user by ID', tags=['User'])
  11.     @marshal_with(UserSchema)
  12.     def get(self, user_id):
  13.         return {"id": user_id, "name""John Doe"}
  14. app.add_url_rule('/users/<int:user_id>', view_func=UserResource.as_view('user_resource'))
  15. docs = FlaskApiSpec(app)
  16. docs.register(UserResource)
  17. @app.route('/swagger/')
  18. def swagger_ui():
  19.     return jsonify(docs.spec.to_dict())
  20. if __name__ == '__main__':
  21.     app.run()

Django तथा APIspec एकीकृत्य

1. Django तथा Django-Rest-Framework संस्थापयन्तु

pip install django djangorestframework

2. Django परियोजनानि अनुप्रयोगाः च रचयन्तु

  1. django-admin startproject myproject
  2. cd myproject
  3. django-admin startapp myapp

3. Django परियोजना विन्यस्तं कुर्वन्तु

settings.py मध्ये rest_framework तथा apispec योजयन्तु:

  1. INSTALLED_APPS = [
  2.     ...
  3.     'rest_framework',
  4.     'myapp',
  5.     'apispec',
  6. ]

4. Django दृश्यानि परिभाषयन्तु

myapp/views.py इत्यत्र:

  1. from rest_framework.views import APIView
  2. from rest_framework.response import Response
  3. from rest_framework.schemas import AutoSchema
  4. class UserView(APIView):
  5.     schema = AutoSchema(
  6.         manual_fields=[
  7.             coreapi.Field('user_id', required=True, location='path', schema={'type''integer'})
  8.         ]
  9.     )
  10.     def get(self, request, user_id):
  11.         """
  12.         Get a user by ID.
  13.         ---
  14.         responses:
  15.           200:
  16.             description: A user object
  17.             content:
  18.               application/json:
  19.                 schema:
  20.                   type: object
  21.                   properties:
  22.                     id:
  23.                       type: integer
  24.                     name:
  25.                       type: string
  26.         """
  27.         return Response({"id": user_id, "name""John Doe"})

5. URL विन्यस्तं कुर्वन्तु

myapp/urls.py इत्यत्र:

  1. from django.urls import path
  2. from .views import UserView
  3. urlpatterns = [
  4.     path('users/<int:user_id>/', UserView.as_view(), name='user-view'),
  5. ]

6. OpenAPI विनिर्देशं जनयन्तु

manage.py इत्यत्र :

  1. from apispec import APISpec
  2. from rest_framework.schemas import get_schema_view
  3. spec = APISpec(
  4.     title="My API",
  5.     version="1.0.0",
  6.     openapi_version="3.0.0",
  7. )
  8. schema_view = get_schema_view(title="My API")
  9. schema = schema_view.get_schema(request=None, public=True)
  10. spec.components.schema('User', schema)
  11. spec.path(path='/users/{user_id}/', operations=schema['paths']['/users/{user_id}/'])
  12. print(spec.to_yaml())

03APIspec इत्यस्य उन्नतविशेषताः

1. कस्टम जनरेटर

APIspec एकं लचीलं विस्तारतन्त्रं प्रदाति यत् भवन्तं जनरेटर् अनुकूलितुं शक्नोति । Apispec द्वारा प्रदत्तं आधारवर्गं उत्तराधिकारं प्राप्य विस्तारं कृत्वा भवान् स्वस्य जननतर्कं कार्यान्वितुं शक्नोति ।

  1. from apispec import BasePlugin
  2. class MyPlugin(BasePlugin):
  3.     def path_helper(self, operations, *, resource, **kwargs):
  4.         operations.update({
  5.             'get': {
  6.                 'description''Get a user by ID',
  7.                 'parameters': [
  8.                     {'name''user_id''in''path''required'True'schema': {'type''integer'}}
  9.                 ],
  10.                 'responses': {
  11.                     '200': {
  12.                         'description''A user object',
  13.                         'content': {
  14.                             'application/json': {
  15.                                 'schema': {
  16.                                     'type''object',
  17.                                     'properties': {
  18.                                         'id': {'type''integer'},
  19.                                         'name': {'type''string'}
  20.                                     }
  21.                                 }
  22.                             }
  23.                         }
  24.                     }
  25.                 }
  26.             }
  27.         })
  28. spec = APISpec(
  29.     title="My API",
  30.     version="1.0.0",
  31.     openapi_version="3.0.0",
  32.     plugins=[MyPlugin()],
  33. )

2. बहुविधरूपरेखानां समर्थनं कुर्वन्तु

एपिस्पेक् विविधं लोकप्रियं पायथन्-रूपरेखां समर्थयति, यथा Flask, Django, Falcon इत्यादीनि । शीघ्रं एपिआइ दस्तावेजान् जनयितुं भवान् स्वस्य आवश्यकतानुसारं समुचितं ढाञ्चं प्लग-इन् च चिन्वितुं शक्नोति ।

3. स्वयमेव अन्तरफलकदस्तावेजान् जनयन्तु

एपिस्पेक् स्वयमेव कस्यचित् फंक्शन् अथवा क्लास् इत्यस्य दस्तावेजीकरणस्ट्रिंग् इत्यस्य आधारेण अन्तरफलकदस्तावेजान् जनयितुं शक्नोति, येन दस्तावेजान् मैन्युअल् रूपेण लेखनस्य कार्यभारः न्यूनीकरोति ।

  1. def get_user(user_id):
  2.     """
  3.     ---
  4.     get:
  5.       description: Get a user by ID
  6.       parameters:
  7.         - name: user_id
  8.           in: path
  9.           required: true
  10.           schema:
  11.             type: integer
  12.       responses:
  13.         200:
  14.           description: A user object
  15.           content:
  16.             application/json:
  17.               schema:
  18.                 type: object
  19.                 properties:
  20.                   id:
  21.                     type: integer
  22.                   name:
  23.                     type: string
  24.     """
  25.     return {"id": user_id, "name""John Doe"}

4. तृतीयपक्षीयसाधनैः सह एकीकरणं कुर्वन्तु

Apispec इत्येतत् अनेकैः तृतीयपक्षीयसाधनैः सह एकीकृत्य, यथा Swagger UI, ReDoc इत्यादिभिः सह, सहजज्ञानयुक्तं अन्तरफलकदस्तावेजप्रदर्शनं परीक्षणकार्यं च प्रदातुं शक्यते ।

  1. from flask import Flask, jsonify
  2. from flask_apispec import FlaskApiSpec
  3. app = Flask(__name__)
  4. @app.route('/users/<int:user_id>', methods=['GET'])
  5. def get_user(user_id):
  6.     """
  7.     ---
  8.     get:
  9.       description: Get a user by ID
  10.       parameters:
  11.         - name: user_id
  12.           in: path
  13.           required: true
  14.           schema:
  15.             type: integer
  16.       responses:
  17.         200:
  18.           description: A user object
  19.           content:
  20.             application/json:
  21.               schema:
  22.                 type: object
  23.                 properties:
  24.                   id:
  25.                     type: integer
  26.                   name:
  27.                     type: string
  28.     """
  29.     return jsonify({"id": user_id, "name""John Doe"})
  30. docs = FlaskApiSpec(app)
  31. docs.register(get_user)
  32. if __name__ == '__main__':
  33.     app.run()

04व्यावहारिकप्रकरणाः

एकं सम्पूर्णं एपिआइ दस्तावेजीकरणप्रणालीं निर्मायताम्

1. परियोजना परिचय

मानातु अस्माकं सरलं उपयोक्तृप्रबन्धनप्रणाली अस्ति तस्य एपिआइ दस्तावेजीकरणस्य आवश्यकता अस्ति । अस्माकं एपिआइ मध्ये उपयोक्तृसंयोजनं, विलोपनं, परिवर्तनं, प्रश्नक्रियाः, तथैव केचन मूलभूतपरिचयप्रमाणीकरणकार्यं च समाविष्टम् अस्ति ।

2. परियोजना संरचना

  1. user_management/
  2. ├── app.py
  3. ├── models.py
  4. ├── views.py
  5. ├── serializers.py
  6. └── requirements.txt

3. आश्रयाणि संस्थापयन्तु

requirements.txt इत्यत्र आश्रयाणि योजयन्तु:

  1. Flask
  2. Flask-RESTful
  3. Flask-SQLAlchemy
  4. Flask-Migrate
  5. apispec
  6. flask-apispec

निर्भरतां संस्थापयितुं निम्नलिखितम् आदेशं चालयन्तु ।

pip install -r requirements.txt

4. आदर्शं परिभाषयतु

models.py इत्यस्मिन् उपयोक्तृप्रतिरूपं परिभाषयन्तु:

  1. from flask_sqlalchemy import SQLAlchemy
  2. db = SQLAlchemy()
  3. class User(db.Model):
  4.     id = db.Column(db.Integer, primary_key=True)
  5.     name = db.Column(db.String(80), nullable=False)
  6.     email = db.Column(db.String(120), unique=True, nullable=False)

5. दृश्यानि क्रमाङ्कनं च परिभाषयन्तु

serializers.py इत्यस्मिन् उपयोक्तृक्रमाङ्ककाः परिभाषयन्तु:

  1. from marshmallow import Schema, fields
  2. class UserSchema(Schema):
  3.     id = fields.Int(dump_only=True)
  4.     name = fields.Str(required=True)
  5.     email = fields.Email(required=True)

views.py इत्यत्र दृश्यानि परिभाषयन्तु:

  1. from flask import request
  2. from flask_restful import Resource
  3. from models import User, db
  4. from serializers import UserSchema
  5. class UserResource(Resource):
  6.     def get(self, user_id):
  7.         user = User.query.get_or_404(user_id)
  8.         schema = UserSchema()
  9.         return schema.dump(user)
  10.     def post(self):
  11.         schema = UserSchema()
  12.         user = schema.load(request.json)
  13.         db.session.add(user)
  14.         db.session.commit()
  15.         return schema.dump(user), 201
  16.     def put(self, user_id):
  17.         user = User.query.get_or_404(user_id)
  18.         schema = UserSchema(partial=True)
  19.         updated_user = schema.load(request.json, instance=user)
  20.         db.session.commit()
  21.         return schema.dump(updated_user)
  22.     def delete(self, user_id):
  23.         user = User.query.get_or_404(user_id)
  24.         db.session.delete(user)
  25.         db.session.commit()
  26.         return ''204

6. मुख्यानुप्रयोगं परिभाषयन्तु

app.py इत्यत्र : १.

  1. from flask import Flask
  2. from flask_restful import Api
  3. from flask_migrate import Migrate
  4. from models import db
  5. from views import UserResource
  6. from flask_apispec import FlaskApiSpec
  7. from flask_apispec.extension import FlaskApiSpec
  8. app = Flask(__name__)
  9. app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
  10. db.init_app(app)
  11. migrate = Migrate(app, db)
  12. api = Api(app)
  13. api.add_resource(UserResource, '/users/<int:user_id>')
  14. docs = FlaskApiSpec(app)
  15. docs.register(UserResource)
  16. if __name__ == '__main__':
  17.     app.run()

7. एप् चालयित्वा दस्तावेजीकरणं पश्यन्तु

निम्नलिखित आदेशं चालयित्वा अनुप्रयोगं आरभत:

python app.py

उत्पन्नं एपिआइ-दस्तावेजं द्रष्टुं http://localhost:5000/swagger/ इति गच्छन्तु ।

05उत्तम अभ्यास

1. दस्तावेजीकरणं कोडं च समन्वयेन स्थापयन्तु

दस्तावेजीकरणस्य वास्तविक-एपिआइ-इत्यस्य च मध्ये असङ्गतिं परिहरितुं दस्तावेजीकरणं सदैव कोडेन सह समन्वयं भवति इति सुनिश्चितं कुर्वन्तु । स्वयमेव दस्तावेजीकरणं जनयितुं परिनियोजितुं च भवान् CI/CD उपकरणानां उपयोगं कर्तुं शक्नोति ।

2. एनोटेशन्स् तथा अलङ्कारस्य उपयोगं कुर्वन्तु

टिप्पणीनां, अलङ्कारस्य च उपयोगेन दस्तावेजीकरणं अधिकं संक्षिप्तं पठनीयं च कर्तुं शक्यते । उदाहरणार्थं, दृश्यकार्यं प्रति दस्तावेजीकरणसूचनाः योजयितुं Flask-Apispec इत्यस्य @doc decorator इत्यस्य उपयोगं कुर्वन्तु ।

3. वैश्विकमापदण्डान् प्रतिक्रियाश्च परिभाषयन्तु

सामान्यतया प्रयुक्तानां मापदण्डानां प्रतिक्रियाणां च कृते, पुनरावृत्तिसङ्केतस्य न्यूनीकरणाय Apispec इत्यस्मिन् वैश्विकमापदण्डाः प्रतिक्रियासारूप्याणि च परिभाषितुं शक्यन्ते ।

  1. spec.components.parameter("user_id""path", schema={"type""integer"}, required=True)
  2. spec.components.response("User", {
  3.     "description""A user object",
  4.     "content": {
  5.         "application/json": {
  6.             "schema": {
  7.                 "type""object",
  8.                 "properties": {
  9.                     "id": {"type""integer"},
  10.                     "name": {"type""string"}
  11.                 }
  12.             }
  13.         }
  14.     }
  15. })

4. नियमितरूपेण दस्तावेजानां समीक्षां कृत्वा अद्यतनं कुर्वन्तु

सटीकताम् पूर्णतां च सुनिश्चित्य दस्तावेजानां नियमितरूपेण समीक्षां कृत्वा अद्यतनं कुर्वन्तु। एतत् दस्तावेजसमीक्षाचक्रं स्थापयित्वा अथवा दस्तावेजसमीक्षाप्रक्रियायाः परिचयं कृत्वा प्राप्तुं शक्यते ।

अधिककार्यं विस्तृतप्रयोगाय च आधिकारिकदस्तावेजं पश्यन्तु:

https://apispec.readthedocs.io/en/latest

06संक्षेपः

अस्य लेखस्य माध्यमेन मम विश्वासः अस्ति यत् भवतः एपिस्पेक् विषये मूलभूतं अवगमनं निपुणता च अस्ति। मूलभूतप्रयोगात् उन्नतकार्यपर्यन्तं, व्यावहारिकप्रकरणानाम् उत्तमप्रथानां च यावत्, वयं एपिआइ दस्तावेजान् जनयितुं परिपालयितुं च Apispec इत्यस्य उपयोगः कथं करणीयः इति व्यापकरूपेण परिचययामः।

आशासे यत् भवान् एतत् ज्ञानं वास्तविकप्रकल्पेषु प्रयोक्तुं शक्नोति तथा च स्वस्य एपिआइ मध्ये प्रकाशस्य स्पर्शं योजयितुं शक्नोति।