最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

django-rest-framework 自定義swagger過(guò)程詳解

 更新時(shí)間:2019年07月18日 15:27:24   投稿:yaominghui  
這篇文章主要介紹了django-rest-framework 自定義swagger過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

前言

之前的文章編寫(xiě)了一個(gè)返回json的例子,直接用瀏覽器進(jìn)行g(shù)et請(qǐng)求雖然成功了, 但是接口文檔的樣式很難看, 不好用. 而且提示沒(méi)有訪問(wèn)權(quán)限.

我們一般都希望能夠直接在接口文檔中進(jìn)行請(qǐng)求, 以測(cè)試接口, 本篇文章中會(huì)給出一個(gè)自定義swagger(openapi)的例子. 使接口文檔變得美觀可用, 可以填寫(xiě)參數(shù), 可以進(jìn)行請(qǐng)求以觀察數(shù)據(jù)格式, 測(cè)試接口是否可用.

環(huán)境

workon python35
pip list
chardet (3.0.4)
coreapi (2.3.3)
coreschema (0.0.4)
Django (1.11.6)
django-rest-swagger (2.1.2)
django-simple-serializer (2.0.7)
djangorestframework (3.7.1)
future (0.16.0)
idna (2.6)
itypes (1.1.0)
Jinja2 (2.9.6)
MarkupSafe (1.0)
openapi-codec (1.3.2)
pip (9.0.1)
pytz (2017.2)
requests (2.18.4)
setuptools (36.6.0)
simplejson (3.11.1)
uritemplate (3.0.0)
urllib3 (1.22)
wheel (0.30.0)

阿里云的源中 最新版的django-rest-frmework版本為3.7.1

3.6 與 3.7的結(jié)構(gòu)稍有不同. 我之前用3.6, 但是以下對(duì)swagger的修改以3.7.1版本為基準(zhǔn). 理解原理之后不同版本只需要稍作修改即可.

第一步修改配置

進(jìn)入settings.py 文件, 確保INSTALLED_APPS中包含rest_framework

INSTALLED_APPS = [
  'django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.messages',
  'django.contrib.staticfiles',
  'rest_framework',
  'rest_framework_swagger',
  'mytest',
]

我們導(dǎo)入了三個(gè)框架

  • rest_framework
  • rest_framework_swagger
  • mytest (之前的文章中編寫(xiě)簡(jiǎn)單接口的app)

然后在settings.py 文件中添加以下代碼

REST_FRAMEWORK = {
  # 下面這一行表示接口文檔的訪問(wèn)權(quán)限, AllowAny不做權(quán)限限制.
  'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.AllowAny',),
  # 'PAGE_SIZE': 10,
  'PAGINATE_BY':10,
}


SWAGGER_SETTINGS = {
  # 基礎(chǔ)樣式
  'SECURITY_DEFINITIONS': {
    "basic":{
      'type': 'basic'
    }
  },
  # 如果需要登錄才能夠查看接口文檔, 登錄的鏈接使用restframework自帶的.
  'LOGIN_URL': 'rest_framework:login',
  'LOGOUT_URL': 'rest_framework:logout',
  # 'DOC_EXPANSION': None,
  # 'SHOW_REQUEST_HEADERS':True,
  # 'USE_SESSION_AUTH': True,
  # 'DOC_EXPANSION': 'list',
  # 接口文檔中方法列表以首字母升序排列
  'APIS_SORTER': 'alpha',
  # 如果支持json提交, 則接口文檔中包含json輸入框
  'JSON_EDITOR': True,
  # 方法列表字母排序
  'OPERATIONS_SORTER': 'alpha',
  'VALIDATOR_URL': None,
}

第二步編寫(xiě)自定義的swagger接口文檔頁(yè)面.

思路:

之前urls.py中的接口文檔頁(yè)面來(lái)自這里

from rest_framework.schemas import get_schema_view

查看源碼, 繼承schema, 返回schema的子類(lèi)即可.

接下來(lái)編寫(xiě)自己的schema

from rest_framework.permissions import AllowAny
from rest_framework.schemas import SchemaGenerator
from rest_framework.schemas.generators import LinkNode, insert_into
from rest_framework.renderers import *
from rest_framework_swagger import renderers
from rest_framework.response import Response

# from rest_framework.schemas import SchemaGenerator
class MySchemaGenerator(SchemaGenerator):

  def get_links(self, request=None):
    # from rest_framework.schemas.generators import LinkNode,
    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編寫(xiě)過(guò)程中自定義參數(shù).
      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

  # 從類(lèi)中取出我們自定義的參數(shù), 交給swagger 以生成接口文檔.
  def get_core_fields(self, view):
    return getattr(view, 'coreapi_fields', ())


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

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

  def get(self, request):
    generator = MySchemaGenerator(title='xxxxx',
                   description='''xxxxx''')

    schema = generator.get_schema(request=request)

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

上面的代碼中我加了注釋, 寫(xiě)出了需要用到的一些方法, 參數(shù), 類(lèi) 都是從哪里import進(jìn)來(lái)的.

上面的代碼自定義了一個(gè)swagger頁(yè)面, 加入了自定義參數(shù)的方法, 設(shè)置了訪問(wèn)權(quán)限(AllowAny), 添加了title和description,
原理, 其實(shí)就是繼承父類(lèi), 重寫(xiě)方法以覆蓋父類(lèi)中的方法, 修改子類(lèi)中overwrite的方法以添加我們想要的內(nèi)容.

上面的代碼其實(shí)寫(xiě)在哪里都可以, 找得到就行,我一般寫(xiě)在views.py 文件中和其他接口放在一起, 畢竟 http://xxxxx/docs/ 和/api/getjson 這樣的接口一樣都返回一個(gè)視圖.

最后一步

修改urls.py文件, 把接口放出去.

from django.conf.urls import url, include
from django.contrib import admin
from rest_framework.schemas import get_schema_view
from mytest.views import ReturnJson
import mytest
# 下面是剛才自定義的schema
from mytest.views import SwaggerSchemaView

urlpatterns = [
  url(r'^admin/', admin.site.urls),
  url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
  url(r'^docs/', SwaggerSchemaView.as_view(), name='apiDocs'),
  url(r'^api/getjson', ReturnJson.as_view()),
]

注意上面我們添加了兩個(gè)接口.

api-auth/和docs/

還記得配置文件中的他們嗎

'LOGIN_URL': 'rest_framework:login',
'LOGOUT_URL': 'rest_framework:logout',

api-auth/就是為他倆準(zhǔn)備的. 因?yàn)橛袝r(shí)我們需要讓接口文檔登錄之后才能夠被看到..

最后運(yùn)行項(xiàng)目看到

剩下的問(wèn)題

我們的第一個(gè)接口沒(méi)有參數(shù). 向接口文檔的getjson接口添加一個(gè)參數(shù).

修改 getjson接口對(duì)應(yīng)的views.py文件中的類(lèi).ReturnJson類(lèi).

添加以下代碼

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)


class ReturnJson(APIView):

  coreapi_fields=(
    DocParam("token"),
  )

  def get(self, request, *args, **kwargs):
    return JsonResponse("Hello world!!!!!!!!++++++中文測(cè)試")

這是所有的import

from django.shortcuts import render
from rest_framework.views import APIView
from dss.Serializer import serializer
from django.http import HttpResponse, HttpRequest
from rest_framework.permissions import AllowAny
from rest_framework.schemas import SchemaGenerator
from rest_framework.schemas.generators import LinkNode, insert_into
from rest_framework.renderers import *
from rest_framework_swagger import renderers
from rest_framework.response import Response
# from rest_framework.schemas import *

我也忘了. coreapi.Field是從哪里import的了....

以上代碼為 getjson接口添加了token參數(shù).

最終效果.

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python防止隨意修改類(lèi)屬性的實(shí)現(xiàn)方法

    python防止隨意修改類(lèi)屬性的實(shí)現(xiàn)方法

    這篇文章主要介紹了python防止隨意修改類(lèi)屬性的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • PyTorch線性回歸和邏輯回歸實(shí)戰(zhàn)示例

    PyTorch線性回歸和邏輯回歸實(shí)戰(zhàn)示例

    這篇文章主要介紹了PyTorch線性回歸和邏輯回歸實(shí)戰(zhàn)示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • python實(shí)時(shí)監(jiān)控logstash日志代碼

    python實(shí)時(shí)監(jiān)控logstash日志代碼

    這篇文章主要介紹了python實(shí)時(shí)監(jiān)控logstash日志代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • 基于Python實(shí)現(xiàn)用戶(hù)管理系統(tǒng)

    基于Python實(shí)現(xiàn)用戶(hù)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了基于Python實(shí)現(xiàn)用戶(hù)管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • Python中的字符串切片(截取字符串)的詳解

    Python中的字符串切片(截取字符串)的詳解

    這篇文章主要介紹了Python中的字符串切片(截取字符串)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • django 數(shù)據(jù)庫(kù)連接模塊解析及簡(jiǎn)單長(zhǎng)連接改造方法

    django 數(shù)據(jù)庫(kù)連接模塊解析及簡(jiǎn)單長(zhǎng)連接改造方法

    今天小編就為大家分享一篇django 數(shù)據(jù)庫(kù)連接模塊解析及簡(jiǎn)單長(zhǎng)連接改造方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • Django與遺留的數(shù)據(jù)庫(kù)整合的方法指南

    Django與遺留的數(shù)據(jù)庫(kù)整合的方法指南

    這篇文章主要介紹了Django與遺留的數(shù)據(jù)庫(kù)整合的方法指南,Django是最具人氣的Python開(kāi)發(fā)框架,需要的朋友可以參考下
    2015-07-07
  • python 多線程串行和并行的實(shí)例

    python 多線程串行和并行的實(shí)例

    今天小編就為大家分享一篇python 多線程串行和并行的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-02-02
  • PyTorch模型調(diào)試與故障排除指南

    PyTorch模型調(diào)試與故障排除指南

    在當(dāng)代深度學(xué)習(xí)領(lǐng)域,PyTorch 已成為開(kāi)發(fā)和訓(xùn)練神經(jīng)網(wǎng)絡(luò)的主要框架之一,然而隨著模型復(fù)雜度的增加和數(shù)據(jù)規(guī)模的擴(kuò)大,開(kāi)發(fā)者常常面臨各種調(diào)試和優(yōu)化挑戰(zhàn),本文旨在為 PyTorch 開(kāi)發(fā)者提供一個(gè)全面的調(diào)試指南,涵蓋從基礎(chǔ)概念到高級(jí)技術(shù)的廣泛內(nèi)容,需要的朋友可以參考下
    2024-09-09
  • 淺談Pycharm的項(xiàng)目文件名是紅色的原因及解決方式

    淺談Pycharm的項(xiàng)目文件名是紅色的原因及解決方式

    這篇文章主要介紹了淺談Pycharm的項(xiàng)目文件名是紅色的原因及解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06

最新評(píng)論

诸城市| 岳阳市| 东宁县| 海丰县| 阿拉善左旗| 东丰县| 灵台县| 萨嘎县| 遵义市| 南宁市| 河南省| 于都县| 彰化市| 华容县| 乾安县| 东明县| 射洪县| 海淀区| 大洼县| 乐东| 安吉县| 遵化市| 都昌县| 闻喜县| 大新县| 北川| 右玉县| 河源市| 涡阳县| 巨鹿县| 马公市| 从化市| 留坝县| 隆昌县| 淄博市| 长子县| 安达市| 霞浦县| 库尔勒市| 昌图县| 娄烦县|