首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在drf_spectacular (django)中发送带有请求的自定义JSON头?

在Django REST Framework (DRF) 中使用 drf-spectacular 生成 API 文档时,如果你想要发送带有自定义 JSON 头的请求,可以通过以下步骤实现:

基础概念

  • 自定义 JSON 头:指的是在 HTTP 请求中添加非标准的头部信息,通常用于传递额外的数据或身份验证信息。
  • DRF:Django REST Framework 是一个强大的且灵活的工具包,用于构建 Web API。
  • drf-spectacular:是一个用于生成 OpenAPI 文档的工具,它基于 DRF 构建。

相关优势

  • 灵活性:DRF 提供了高度的灵活性来定义 API 的行为。
  • 文档生成:drf-spectacular 自动从代码注释中提取信息,生成 OpenAPI 文档。

类型

  • 请求头:HTTP 请求中的头部信息,用于传递元数据。

应用场景

  • 身份验证:使用自定义头传递 API 密钥或令牌。
  • 版本控制:通过自定义头来指定 API 版本。

如何发送带有自定义 JSON 头的请求

1. 在视图中处理自定义头

首先,你需要在 DRF 视图中处理自定义头。例如:

代码语言:txt
复制
from rest_framework.views import APIView
from rest_framework.response import Response

class CustomHeaderView(APIView):
    def get(self, request, format=None):
        custom_header = request.META.get('HTTP_X_CUSTOM_HEADER')
        return Response({'custom_header': custom_header})

2. 在序列化器中添加自定义头

如果你需要在序列化器中使用自定义头,可以在序列化器中进行处理。

3. 在测试中发送带有自定义头的请求

在编写测试时,你可以使用 APIClient 发送带有自定义头的请求:

代码语言:txt
复制
from rest_framework.test import APITestCase, APIClient

class CustomHeaderTests(APITestCase):
    def setUp(self):
        self.client = APIClient()

    def test_custom_header(self):
        response = self.client.get('/custom-header/', HTTP_X_CUSTOM_HEADER='test_value')
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.data['custom_header'], 'test_value')

遇到的问题及解决方法

问题:自定义头在请求中未生效

原因:可能是由于自定义头的名称不正确,或者在请求中没有正确设置。

解决方法

  • 确保自定义头的名称在代码中与请求中一致。
  • 使用 HTTP_X_CUSTOM_HEADER 格式来访问自定义头。

问题:drf-spectacular 未生成自定义头的文档

原因:drf-spectacular 默认不会自动检测自定义头,需要手动添加。

解决方法

  • 在视图中使用 @extend_schema 装饰器来手动添加自定义头信息:
代码语言:txt
复制
from drf_spectacular.utils import extend_schema, extend_schema_view
from drf_spectacular.types import OpenApiTypes

@extend_schema(request=None, responses={200: {'type': 'object', 'properties': {'custom_header': {'type': 'string'}}}})
@extend_schema_view(get=CustomHeaderView.get)
class CustomHeaderView(APIView):
    def get(self, request, format=None):
        custom_header = request.META.get('HTTP_X_CUSTOM_HEADER')
        return Response({'custom_header': custom_header})

参考链接

通过以上步骤,你可以在 DRF 中发送并处理带有自定义 JSON 头的请求,并确保 drf-spectacular 正确生成相关文档。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

使用AJAX获取Django后端数据

AJAX提供了一种将GET或POST请求发送Django视图并接收任何返回数据而无需刷新页面的方法。...根据Django项目的URLconf和视图配置方式,URL可能包含关键字参数或查询字符串,我们希望在视图中使用该参数来选择请求数据。 Headers 设置AJAX请求参数。...我们必须通过添加方法“ POST”来明确地告诉它发出POST请求。 Credentials 我们需要指定如何在请求发送凭据。凭证可能很棘手,特别是如果项目的前端和后端分别托管。...BODY POST请求目标是将数据发送到视图并更新数据库。 这意味着我们还需要在fetch调用包含数据。...一旦获得了请求数据,我们就可以执行用户希望启动AJAX请求操作。这可能是创建模型新实例或更新现有实例。 与GET请求一样,可以使用JsonResponse和带有数据字典将数据发送回页面。

7.6K40

Django Swagger文档库drf-spectacular

methods:检查extend_schema特殊方法,默认匹配所有 versions:检查extend_schema特殊API版本,默认匹配所有 example:将请求/响应示例附加到操作...,因此页面就会显示两种认证方式 BUG 目前使用存在一个BUG,就是对于read_only字段,按照我们理解就是在查询请求是返回给客户端,而创建时在请求不需要包含。...在默认生成swagger界面上,我们看到情况与理解一样,对于JSON参数请求是没有问题,我们只需要输入必填字段就可以了,但是如果是form-data参数,虽然显示依然不包含read_only...字段,请求却无法发送成功。...格式请求参数,缺点是必填和选填参数搞不清楚 在后端序列化时候,针对不同请求,明确定义相对应序列化类来处理,缺点是后端代码变多了,而且埋没了DRF为我们提供很多使用方便特性。

1.9K20
  • Django 获取请求参数

    Django 获取请求参数原理   上面我简单介绍了requests库与request方法区别,而在django,是如何获取请求参数呢?...请记住一点:requests是用来发送请求,在djangorequest是用来获取请求参数。...使用形式: 发送请求: requests.post() django获取请求参数:request.POST.get() 那么问题来了,django视图函数request到底哪里来?...使用postman请求 控制台日志: 5.获取非表单类型 request.body属性:获取非表单类型请求体数据,JSON、XML等,获取到数据类型为bytes类型 获取数据后,自己解析数据取出参数...("你ip地址是%s"%ip) 获取自定义请求内容 用postman增加一个自定义请求,key=id,value=1。

    2.7K40

    关于python 跨域处理方式详解

    因为浏览器同源策略限制,不是同源脚本不能操作其他源下面的资源,想操作另一个源下面的资源就属于跨域了,这里说跨域是广义跨域,我们常说代码请求跨域,是狭义跨域,即在脚本代码向非同源域发送http...下面两种情况,是不受跨域限制,严格来讲,这两种情况只是跨站资源请求: 1)页面链接,重定向及表单提交是不受同源策略限制 2)跨域资源引入,<script src=”” <image src...jsonCallback:"test", # 自定义jsonp回调函数参数名,默认为jQuery自动生成函数名,也可以自定义,jQuery会自动为你处理。...2、在响应加上响应允许跨域参数,告诉浏览器当前请求被服务器接受,这种跨域方式也是通用。...pip install Django-cors-headers.zip 在settings.py中间件配置 【’corsheaders.middleware.CorsMiddleware’

    2.1K30

    djangoRequest-7

    请求体 4.1 Form表单 4.2 非表单类型 请求 其他 利用HTTP协议向服务器传参有以下几种方式 从url截取 使用查询字符串 在请求体中发送数据 在http报文 header 中发送数据...QueryDict 在django HttpRequest 对象,属性 GET 和 POST 得到都是 django.http.QueryDict 所创建实例,这是django自定义一个类似字典类...请求请求体获得参数各种有多种,例如 表单,json,xml...不同格式数据要区别对待 可以发送请求体数据请求方式有POST、PUT、PATCH、DELETE。...django默认开启了csrf防护,会对上述请求方式做验证,测试时可以关闭验证。...例如前端请求json数据: url demo/json 路由 url(r'^json', views.get_json, name="json") json数据 {"name": "xuanli",

    1.2K30

    【愚公系列】2022年01月 Python教学课程 46-Django框架之HttpRequest

    请求体(body)中发送数据,比如表单数据、json、xml; 在http报文(header)。...2.请求请求体数据格式不固定,可以是表单类型字符串,可以是JSON字符串,可以是XML字符串,应区别对待。 可以发送请求体数据请求方式有POST、PUT、PATCH、DELETE。...,Django无法自动解析,可以通过request.body属性获取最原始请求体数据,自己按照请求体格式(JSON、XML等)进行解析。...['a']) print(req_data['b']) return HttpResponse('OK') 5.请求 可以通过request.META属性获取请求headers数据...常见请求: CONTENT_LENGTH– The length of the request body (as a string).

    1K60

    六种Web身份验证方法比较和Flask示例代码

    WWW-AuthenticateBasic 标会导致浏览器显示用户名和密码提升WWW-Authenticate: Basic 输入凭据后,它们将与每个请求一起发送到标头中:Authorization:...它不要求用户在每个请求中提供用户名或密码。相反,在登录后,服务器将验证凭据。如果有效,它将生成一个会话,将其存储在会话存储,然后将会话 ID 发送回浏览器。...Cookie 随每个请求一起发送,即使它不需要身份验证 容易受到 CSRF 攻击。在此处阅读有关CSRF以及如何在Flask预防CSRF更多信息。...JWT 声明被编码为 JSON 对象,该对象用作 JSON Web 签名 (JWS) 结构有效负载或 JSON Web 加密 (JWE) 结构明文,从而使声明能够使用消息身份验证代码 (MAC)...奥斯利布 OAuthLib Flask-OAuthlib Django OAuth Toolkit Django OIDC Provider FastAPI:带有密码和持有者简单 OAuth2 FastAPI

    7.4K40

    DRFRequest对象和Response对象

    因此,HttpRequest类方法和属性依旧是可以使用。 Request.data Request对象数据是自动根据前端发送数据格式进行解析之后结果。...) 包含了对POST、PUT、PATCH请求方式解析后数据; 利用了REST frameworkparsers解析器,不仅支持表单类型数据,也支持JSON数据。...如果需要上传文件,请阅读DRF上传文件 注意 在开发客户端应用程序时,请始终记住确保Content-Type在 HTTP 请求发送数据时设置标。...例如,如果您json使用带有.ajax() 方法jQuery发送编码数据,则应确保包含该contentType: 'application/json'设置。...无论请求方式是什么,URL参数,我们在DRF总是使用request.query_params来获取。

    1.6K40

    Django请求和响应对象

    Django请求和响应对象 Django 使用请求和响应对象在系统传递状态。 当一个页面被请求时,Django 会创建一个 HttpRequest 对象,这个对象包含了请求元数据。...请求任何 HTTP 都会被转换为 META 键,方法是将所有字符转换为大写字母,用下划线代替任何连字符,并在名称前加上 HTTP_` 前缀。...例如,请求头里X-CSRFToken在META变为HTTP_X_CSRFTOKEN. 中间件设置属性 Django contrib 应用包含一些中间件会在请求设置属性。...带有 close() 方法对象,文件和生成器,会立即关闭。如果你需要将响应从迭代器流式传输到客户端,你必须使用 StreamingHttpResponse 类来代替。...它继承了它超类大部分行为,但有一些不同: 其默认 Content-Type 设置为 application/json。 第一个参数 data 应该是 dict 实例。

    1.5K20

    Django REST Framework-信号

    一、概述Django REST Framework(DRF)信号(Signals)是一种非常有用机制,可以让我们在某些重要事件发生时执行一些自定义代码。...二、什么是信号信号是Django一个概念,用于处理某些重要事件发生时执行自定义代码。DRF扩展了Django信号系统,添加了一些新信号,使我们可以更好地处理API相关事件。...在请求处理过程某些特定时间点执行某些操作,请求前、请求后、异常处理等。DRF提供了多个信号,可以通过导入django.dispatch.Signal来访问这些信号。...我们可以在do_something函数执行任何自定义代码,发送电子邮件、调用外部API等。...这些信号可以帮助我们在请求处理过程执行自定义操作,记录请求日志、检查授权等。

    7.2K101

    CSRF 原理与防御案例分析

    注意 Token 不应该放置在网页 Url ,如果放在 Url 当浏览器自动访问外部资源, img 标签 src 属性指向攻击者服务器,Token 会出现作为 Referer 发送给外部服务器...在接收请求服务端判断请求 Referer 是否为正常发送请求页面,如果不是,则进行拦截。 不过此方法有时也存在着一定漏洞,比如可绕过等,所以最好还是使用 Token。...当 https 向 http 进行跳转时,使用 Html 标签( img、iframe) 进行 CSRF 攻击时,请求是不会带上 Referer ,可以达到空 Referer 目的。...最后应关注那些高权限账户能够进行特权操作,:上传文件、添加管理员,在许多渗透测试,便是起初利用这点一撸到底。...这个就是 Django CSRF 防御机制,当我们发送 POST 请求Django 会自动检测 CSRF_Token 值是否正确。

    2.3K30

    Django之视图层与模板层

    ,同理也有HttpRequest.GET.getlist("键") #part2 一.HttpRequest.body 当浏览器基于http协议POST方法提交数据时,数据会被放到请求体中发送django...,django会将接收到请求 体数据存放于HttpRequest.body属性,因为该属性值为Bytes类型,所以通常情况下直接处理Bytes、并从中提 取有用数据操作是复杂而繁琐,好在django...,而是会将表单数据按照 k1=v1&k2=v2&k3=v3格式放到url,然后发送djangodjango会将这些数据封装到request.GET,注意此 时request.body为空、无用...2:如果表单属性method='POST',那么在提交表单时,表单内所有数据都会存放于请求,在发送django 后会封装到request.body里,此时django为了方便我们提取数据,会.../form-data" 如果form表单提交数据是按照编码格式1,那么request.body数据格式类似于GET方法数据格式, k1=v1&k2=v2,此时django会将request.body

    9.2K10

    Django】 Python Web 框架基础

    pip3 install django 安装 django 最新版本 或 $ sudo pip3 install django[==版本] 安装 django 指定版本 : `$ sudo pip3..., 此配置文件也可以定义一些自定义变量用于作用全局作用域数据传递 settings.py 文件介绍 https://docs.djangoproject.com/en/2.2/ref/settings...) False 表示当前项目运行在生产环境(不启用调试) ALLOWED_HOSTS 设置允许访问到本项目的host请求值,取值: [] 空列表,表示只有host请求为127.0.0.1,...P\d{1,2})$',views.cal_view), HTTP协议 请求是指浏览器端通过HTTP协议发送给服务器端数据 响应是指服务器端接收到请求后做相应处理后再回复给浏览器端数据...() : 请求完整路径 request.get_host() : 请求主机 request.META : 请求元数据(消息) request.META[‘REMOTE_ADDR’] : 客户端

    2.1K20

    说说web应用程序用户认证

    前端发送请求,后端返回数据。这里后端是指服务器,前端是指浏览器。 后端只能收到前端发送请求请求参数,及资源定位符(url)。...在没有用户认证情况下,无论前端是谁,只要发送请求一样,后端返回数据也是一样,前端人人平等,后端对他们一视同仁。...在 Django Rest Framework ,认证功能是可插拨,非常方便。REST框架提供了现成身份验证方案,如下。并且还允许您实现自定义方案。...这里必须要自己实现自定义验证吗?...前端在每次请求时将 JWT 放入 HTTP Header Authorization 位。(解决XSS 和 XSRF 问题) 后端检查是否存在,存在,则验证 JWT 有效性。

    2.2K20

    最近答不好面试题记录

    vuexa模块使用b模块actions ?...跨域请求分为两种:简单请求和复杂请求 符合以下任一一种情况就为复杂请求: 1.使用方法put/delete/patch/post; 2.使用json格式数据(content-type: application.../json) 3.请求带有自定义头部 其他情况都为简单请求 option请求出现情况有两种 1:获取后台服务器支持HTTP通信方式 2:对跨域请求进行preflight request (预检请求...) 预检请求首先需要向另外一个域名资源发送一个Http Options请求,以检查实际发送请求是否是安全,options请求是浏览器自发起preflight request(预检请求) preflight...: 告知服务器实际请求所携带自定义Header字段 同时服务器也会添加origin header,告知服务器实际请求客户端地址。

    1.3K10

    低代码平台amis学习 三:发送网络请求并回显响应内容

    ,支持:get、post、put、delete、patch url:请求地址(这里写你要调用接口完整地址即可) data:随请求一起发送数据 注意这里定义参数时使用了官方所说「数据映射」方式,它好处是可以自己定义随请求发送参数名...字段,加上$,表示获取这个表单字段对应值 更多用法参考 自定义api请求体数据格式,另外amis也允许自定义请求请求数据格式等,官方文档中有详细说明 https://aisuda.bce.baidu.com.../baidu/amis/issues/111 解决方案就是在服务端返回header添加必要参数 我后端服务是使用django,所以这些可以在settings.py文件中进行设置(前提已经安装了...response = JsonResponse(data, json_dumps_params={'ensure_ascii': False}) # amis需要返回这种请求,设置响应请求...再次点击提交按钮,请求就能正常发送了 在页面显示响应内容 我打算把接口返回全部响应内容都显示在页面,在github中找到了对应issue: https://github.com/baidu/amis

    2.9K20

    Django 跨域访问POST请求需预先发送option请求问题处理方案

    /download/2.0.13/tarball/ 问题描述 使用POST请求访问Django后端API时自动先发送option请求,然后才执行POST请求 原因分析 跨域资源共享(CORS)机制导致。...),并且是非简单请求,就会触发CORS预检请求(preflight);"预检"请求请求方法是OPTIONS,如果请求OK,才会再次发送目标操作请求。...实际开发过程,后台采用token检验机制,前台发送请求必须将token放到Request Header,那么就需要传输自定义Header信息、或则请求头中Content-Type设置为"application.../json",就会形成非简单请求。...解决方法 一种比较合适解决方法就是增加响应“Access-Control-Max-Age”来控制浏览器在多长时间内(单位为秒)无需在请求发送预检请求,从而减少不必要预检请求

    1.1K30

    03.Django基础三之视图函数

    属性:   django请求报文中请求行、头部信息、内容主体封装成 HttpRequest 类属性。 除了特殊说明之外,其他均为只读。...POST 请求可以带有 POST 字典 —— 如果通过 HTTP POST 方法发送一个表单,但是表单没有任何数据,QueryDict 对象依然会被创建。...注意,FILES 只有在请求方法为POST 且提交 带有enctype="multipart/form-data" 情况下才会 包含数据。...,就叫做重定向,网站自己做重定向,你访问还是访问你之前,你自己啥也不用做,浏览器发送请求,然后服务端响应,然后服务端告诉浏览器,你直接跳转到另外一个网址上,那么浏览器又自动发送了另外一个请求发送到服务端...3.json_dumps_params参数是一个字典,它将调用json.dumps()方法并将字典参数传入给该方法。

    5K30

    在 REST 服务中支持 CORS

    概述本节提供 CORS 概述以及如何在 IRIS REST 服务启用 CORS 概述。CORS 简介跨域资源共享 (CORS) 允许在另一个域中运行脚本访问服务。...在某些环境,将带有脚本网页与提供 REST 服务服务器放在不同域中是很有用。 CORS 支持这种安排。...用户浏览器向 IRIS REST 服务发送一个特殊请求,该请求指示 XMLHttpRequest HTTP 请求方法和原始网页域,在本示例为 DomOne。...在 REST 服务启用对 CORS 支持有两个部分:启用 REST 服务以接受部分或所有 HTTP 请求 CORS 标。。编写代码,使 REST 服务检查 CORS 请求并决定是否继续。...如果 HandleCorsRequest 参数为 0(默认值),则对所有调用禁用 CORS 标处理。在这种情况下,如果 REST 服务接收到带有 CORS 标请求,则服务会拒绝该请求

    2.6K30
    领券