我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Django request.META.get()获取不到header头的原因分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Django request.META.get()获取不到header头的原因分析

在使用Django过程中需要开发一些API给其他系统使用,为了安全把Token等验证信息放在header头中。

如何获取:

使用request.META.get("headerkey")来获取

注意:

如果headerkey为auth-token,即headers={'auth-token':'1234'}

应该使用request.META.get("HTTP_AUTH_TOKEN")获取

headerkey中的小写转为大写,横线“-”转为下划线“_”,并且加上前缀HTTP

尤其注意headerkey中不应该包含 HTTP前缀,以及符号"_",否则会取不到对应的值

补充:Django中获取参数(路径,查询,请求头,请求体)

一、通常HTTP协议向服务器传参有几种途径

提取URL的特定部分,如/weather/shanghai/2018,可以在服务器端的路由中用正则表达式截取;

查询字符串(query string),形如key1=value1&key2=value2;

请求体(body)中发送的数据,比如表单数据、json、xml;

在http报文的头(header)中。

1.URL中参数的获取

在定义路由URL时,可以使用正则表达式提取参数的方法从URL中获取请求参数,Django会将提取的参数直接传递到视图的传入参数中。

1. 1未命名参数按定义顺序传递

注意:参数获取的顺序与url中参数的位置一一对应,不能互换


url(r'^users/([a-z]+)/(\d{4})/$', views.get_user),  
def get_user(request, name, ID):
    print('name=%s' % name)
    print('id=%s' % id)
    return HttpResponse('OK')

1.2 命名参数按名字传递

注意:如果在路由中指定了参数的名字,name接收参数时,必须要使用路由中指定的参数名称,不能换成其他名字,此时,两个参数位置可以互换。


url(r'^users/(?P<name>[a-z]+)/(?P<id>\d{4})/$', views.users),  
def weather(request, name, id):
    print('name=%s' % name)
    print('id=%s' % id)
    return HttpResponse('OK')

2.获取请求路径中的查询字符串参数

(形如?k1=v1&k2=v2),可以通过request.GET属性获取,返回QueryDict对象。

什么是QueryDict对象?

定义在django.http.QueryDict

HttpRequest对象的属性GET、POST都是QueryDict类型的对象

与python字典不同,QueryDict类型的对象用来处理同一个键带有多个值的情况

2.1方法get():根据键获取值

如果一个键同时拥有多个值将获取最后一个值

如果键不存在则返回None值,可以设置默认值进行后续处理


dict.get('key',value)==>可简写为: dict['key']

2.2方法getlist():根据键获取值,值以列表返回,可以获取指定键的所有值

如果键不存在则返回空列表[],可以设置默认值进行后续处理

dict.getlist('键',默认值)   

2.3获取参数实例

访问路径:/user/qs/?a=1&b=2&a=3

注意:查询字符串不区分请求方式,客户端GET,POST方式的请求,都可以通过request.GET获取请求中的查询字符串数据。


url(r'^qs/$',views.get_value,name='g_v'),  
def get_value(request):
    a = request.GET.get('a')  #3
    b = request.GET.get('b')  #2
    num_list = request.GET.getlist('a') #['1','3']
    print(a)
    print(b)
    print(num_list)  
    return HttpResponse(reverse('user:get_value'))

3.请求体中的参数  

3.1表单数据获取   

通过request.POST来获取

注意:Django默认开启了CSRF防护,会对上述请求方式进行CSRF防护验证,在开发测试时可以关闭CSRF防护机制,方法为在settings.py文件中注释掉CSRF中间件


url(r'^getbody/$',views.get_body),
  
def get_body(request):
    form_data = request.POST.get('c')
    print(form_data)
    return HttpResponse(form_data)

3.2非表单数据获取

非表单类型的请求体数据,Django无法自动解析,可以通过request.body属性获取最原始的请求体数据,自己按照请求体格式(JSON、XML等)进行解析。request.body返回bytes类型


import json  
url(r'^getjson/$',views.get_body_json),  
def get_body_json(request):
    # 得到的是一个二进制数据
    json_str = request.body
    print(json_str)                     # b'{\n    "f":200,\n    "d":300\n    \n}'\
    # 对二进制数据进行解码,解码得到json数据
    json_str = json_str.decode()
    print(json_str)                     # {"f":200,"d":300}
    # 将json数据转化成字典形式
    json_data = json.loads(json_str)
    print(json_data)                    # {'f': 200, 'd': 300}
    # 获取json数据,使用字典方式取值
    print(json_data['d'])               # 300
    print(json_data['f'])               # 200
    return HttpResponse('ok')

4.例如:Django获取http请求头内容  

通过view函数传递过来的 reuqest,使用request.META.get("header key")来获取

  注意:

header key必须大写,前缀必须是"HTTP",后面如果连接符是横线“-”,要改成下划线“_”。例如你的header的key为api_auth,那在Django中应该使用request.META.get("HTTP_API_AUTH")来获取请求头的数据。

5.其他常用HttpRequest对象属性

request.method 请求方式

request.path 请求路径

request.user 请求的用户对象

request.FILES 一个类似于字典的对象,包含所有的上传文件

request.encoding 一个字符串,表示请求的页面的完整路径,不包含域名和参数部分。


url(r'^otherattr/$', views.other_attr),  
def other_attr(request):
    print(request.method)    # POST
    print(request.path)      # /user/otherattr/
    print(request.encoding)  # None:表示使用浏览器的默认设置,一般为utf-8,这个属性是可写的,
    # 可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值。
  

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。如有错误或未考虑完全的地方,望不吝赐教。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Django request.META.get()获取不到header头的原因分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Django request.META.get()为什么获取不到header头

这篇文章主要介绍Django request.META.get()为什么获取不到header头,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在使用Django过程中需要开发一些API给其他系统使用,为了安全把Toke
2023-06-14

获取数据不流畅的原因分析

在信息爆炸的时代,开放的数据共享大大加快了科学技术向前推进的步伐。研究者在公共数据获取方面遭遇的限制,则反过来阻碍了科研的进步。编程学习网教育
获取数据不流畅的原因分析
2024-04-23

网站优化达不到预期效果的原因分析

这篇文章将为大家详细讲解有关网站优化达不到预期效果的原因分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一般达不到优化效果的关键因素有两个:一、网站关键词排名上去了,但是营销没跟上互联网的环境和现实环境
2023-06-10

分析uniapp请求不到数据的原因和解决方法

近年来,随着移动应用的普及,通过Uniapp开发的App也越来越多。不过,由于技术的限制和服务器的不稳定性等原因,Uniapp在请求数据时往往会遇到一些问题,其中最常见的问题是“Uniapp请求不到数据”。本文将介绍这个问题的原因以及解决方法。一、原因1.1 服务器问题在请求数据时,Uniapp需要通过服务器获取数据。如果服务器出现了问题,比如服务器宕机或者服务器压力太大等原因
2023-05-14

使用this.$nextTick()获取不到数据更新后的this.$refs.xxx.及场景分析

今天遇到了这样一个场景,在数据更新之后,使用this.$nextTick(()=>{console.log(this.$refs.xxx)})获取不到改dom,但是用setTimeout能够获取到,在此记录一下,感兴趣的朋友跟随小编一起看看吧
2023-02-06

Android push到/system/app下,导致找不到so文件,抛出java.lang.UnsatisfiedLinkError的原因分析和解决方案

首先,我们来看一份真实案例的输出日志: AndroidRuntime: FATAL EXCEPTION: main AndroidRuntime: Process: com.cmccpoc, PID: 2708 AndroidRuntime
2022-06-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录