簡単にdjangoフレームインテグレーションswaggerとカスタマイズパラメータの問題を話します。


紹介する
私たちは実際の開発において、API文書を生成するためにdjangoの枠組みをswaggerと統合する必要があります。ネットではdjango統合swaggerについての例もありますが、プロジェクトごとに使用される依存バージョンが異なりますので、いくつかの例が私たちに合わないかもしれません。私も実際の集積の過程で、どのようにカスタマイズパラメータなどの問題に出会い、最終的に統合に成功し、結果を皆さんに共有しました。
開発バージョン
私が開発して使っている依存バージョンは、私が使っているのはすべて投稿日までの最新バージョンです。
Django 2.7
django-rest swager 2.2.0
djangorstframe ework 3.10.3
settings.pyを修正します
1、プロジェクト導入のレガットframwワークスワッグ依存

INSTALLED_APPS = [
 ......
 'rest_framework_swagger',
 ......
]
2、DEFAULT_を設定するSCHEMA_CLASSは、ここでは後ほどエラーが発生します。

REST_FRAMEWORK = {
 ......
 'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.AutoSchema',
 ......
}
アプリの下にschema_を作成します。view.py
この文書では、corepiのSchemaGenerator類を継承し、get_を書き換えます。linksメソッドは、書き換えの目的は、私たちのカスタムパラメータを実現し、ページに表示することです。ここで直接コピーして使えばいいです。

from rest_framework.schemas import SchemaGenerator
from rest_framework.schemas.coreapi import LinkNode, insert_into
from rest_framework.renderers import *
from rest_framework_swagger import renderers
from rest_framework.response import Response
from rest_framework.decorators import APIView
from rest_framework.permissions import AllowAny,IsAuthenticated,IsAuthenticatedOrReadOnly
from django.http import JsonResponse

class MySchemaGenerator(SchemaGenerator):

 def get_links(self, request=None):
  links = LinkNode()

  paths = []
  view_endpoints = []
  for path, method, callback in self.endpoints:
   view = self.create_view(callback, method, request)
   path = self.coerce_path(path, method, view)
   paths.append(path)
   view_endpoints.append((path, method, view))

  # Only generate the path prefix for paths that will be included
  if not paths:
   return None
  prefix = self.determine_path_prefix(paths)

  for path, method, view in view_endpoints:
   if not self.has_view_permissions(path, method, view):
    continue
   link = view.schema.get_link(path, method, base_url=self.url)
   #           views          .
   link._fields += self.get_core_fields(view)

   subpath = path[len(prefix):]
   keys = self.get_keys(subpath, method, view)

   # from rest_framework.schemas.generators import LinkNode, insert_into
   insert_into(links, keys, link)

  return links

 #              ,   swagger        .
 def get_core_fields(self, view):
  return getattr(view, 'coreapi_fields', ())

class SwaggerSchemaView(APIView):
 _ignore_model_permissions = True
 exclude_from_schema = True

 #permission_classes = [AllowAny]
 #               ,       ,   AllowAny,        ,    IsAuthenticated
 permission_classes = [IsAuthenticated]
 # from rest_framework.renderers import *
 renderer_classes = [
  CoreJSONRenderer,
  renderers.OpenAPIRenderer,
  renderers.SwaggerUIRenderer
 ]

 def get(self, request):
  #    titile description                  
  generator = MySchemaGenerator(title='API    ',description='''    、    ''')

  schema = generator.get_schema(request=request)

  # from rest_framework.response import Response
  return Response(schema)


def DocParam(name="default", location="query",required=True, description=None, type="string",
    *args, **kwargs):
 return coreapi.Field(name=name, location=location,
       required=required, description=description,
       type=type)
実際の応用
あなたのアプリケーションでインターフェースを定義してリリースします。ここでテストインターフェースを使って検証します。
注意
1、すべてのインターフェースは、API Viewを引き継ぐために、cassで定義しなければならない。
2、classの下のコメントpostは、postメソッドを説明する役割で、ページ上で展示されます。
3、corepi_fieldsで定義されている属性nameはパラメータ名で、locationは伝値方式です。ここで一つはqueryクエリを採用しています。一つはheaderを採用しています。私たちは身分認証を行います。
4、最後にpostメソッドを定義し、get、putなどもできます。実際の状況によって定義します。

#       schema_view.py         ,     
from app.schema_view import DocParam

'''
   
'''
class CustomView(APIView):
 '''
 post:
        
 '''
 coreapi_fields = (
  DocParam(name="id",location='query',description='    '),
  DocParam(name="AUTHORIZATION", location='header', description='token'),
 )

 def post(self, request):
  print(request.query_params.get('id'));
  return JsonResponse({'message':'  !'})
5、パラメーターを受け取るということに注意しなければいけません。私は共通の方法を定義しました。ここでは多すぎる説明はしません。例えば、実際の過程で応用インターフェースとスワッグ呼び出しインターフェースの伝達値の問題があったら、下記のコードを参照してください。

def getparam(attr,request):
 obj = request.POST.get(attr);
 if obj is None:
  obj = request.query_params.get(attr);
 return obj;
url.pyを修正します
前のステップで定義されたテストインターフェースについて、以下のように構成します。

from django.contrib import admin
from rest_framework import routers
from django.conf.urls import url,include

#          schema
from app.schema_view import SwaggerSchemaView
#      
from app.recommend import CustomView

router = routers.DefaultRouter()

urlpatterns = [
 # swagger      
 url(r"^docs/$", SwaggerSchemaView.as_view()),
 url(r'^admin/', admin.site.urls),
 url(r'^', include(router.urls)),
 # drf  
 url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))

 #     
 url(r'^test1', CustomView.as_view(), name='test1'),
]
効果の展示
アクセスアドレス:http://localhost:8001/docs/


締め括りをつける
以上の浅談djangoフレームインテグレーションswaggar及びカスタムパラメータの問題は小編集が皆さんに提供した内容の全部です。参考にしていただければと思います。どうぞよろしくお願いします。