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

 更新时间:2021年04月23日 10:47:43   作者:Gradet丶  
这篇文章主要介绍了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值。
  

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

相关文章

  • Python中的self用法详解

    Python中的self用法详解

    在本篇文章里小编给大家整理的是关于Python中的self用法以及实例内容,需要的朋友们参考下。
    2019-08-08
  • Django的Modelforms用法简介

    Django的Modelforms用法简介

    这篇文章主要介绍了Django的Modelforms用法简介,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • 用Python写一个球球大作战小游戏

    用Python写一个球球大作战小游戏

    这篇文章主要介绍了如何用Python写一个球球大作战小游戏,我们需要实现每位玩家操控一个可自由移动的小球球,通过滑动屏幕,你可以指挥自己的球球在地图上四处游走,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • Django实现静态文件缓存到云服务的操作方法

    Django实现静态文件缓存到云服务的操作方法

    这篇文章主要介绍了Django实现静态文件缓存到云服务的操作方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • win10系统配置GPU版本Pytorch的详细教程

    win10系统配置GPU版本Pytorch的详细教程

    这篇文章主要介绍了win10系统配置GPU版本Pytorch,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • 解决Keras中Embedding层masking与Concatenate层不可调和的问题

    解决Keras中Embedding层masking与Concatenate层不可调和的问题

    这篇文章主要介绍了解决Keras中Embedding层masking与Concatenate层不可调和的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • Python脚本,标识符,变量使用,脚本语句,注释,模块引用详解

    Python脚本,标识符,变量使用,脚本语句,注释,模块引用详解

    这篇文章主要为大家详细介绍了Python脚本,标识符,变量使用,脚本语句,注释,模块引用,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • selenium常用API的使用过程记录(包括自动登录)

    selenium常用API的使用过程记录(包括自动登录)

    selenium是一个自动测试工具,它可以帮我通过代码去实现驱动浏览器自动执行相应的操作,所以我们也可以用它来做爬虫,主要使用selenium的目的是为了跳过登录验证,这篇文章主要介绍了selenium的使用过程记录,已经常用API接口(包括自动登录)
    2024-02-02
  • 一文搞懂Python中subprocess模块的使用

    一文搞懂Python中subprocess模块的使用

    subprocess是子流程,即进程的意思,该模块可以启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值。本文将和大家聊聊subprocess模块的使用,需要的可以参考一下
    2022-11-11
  • python实现计算倒数的方法

    python实现计算倒数的方法

    这篇文章主要介绍了python实现计算倒数的方法,涉及Python针对数学运算操作的相关技巧,需要的朋友可以参考下
    2015-07-07

最新评论