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值。
  

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

(0)

相关推荐

  • DRF跨域后端解决之django-cors-headers的使用

    在使用django-rest-framework开发项目的时候我们总是避免不了跨域的问题,因为现在大多数的项目都是前后端分离,前后端项目部署在不同的web服务器上,因为我们是后端程序员,因此我要通过后端的程序实现跨域.当然如果前端框架是Vue的话,则可以代理服务实现跨域,我也就知道一点点,如果有兴趣,大家可以自行搜索哦. DRF后端实现跨域我们使用一个第三方扩展--- djangocorsheaders 安装 pip install django-cors-headers 注册 INSTALLE

  • Django Python 获取请求头信息Content-Range的方法

    request请求头信息的键会加上HTTP_转换成大写存到request.META中 因此你只需要 content_range = request.META['HTTP_CONTENT_RANGE'] 这样就可以获取到Content-Range的信息. django官网的解释: A standard Python dictionary containing all available HTTP headers. Available headers depend on the client and

  • Django接收自定义http header过程详解

    add by zhj: Django将所有http header(包括你自定义的http header)都放在了HttpRequest.META这个Python标准字典中,当然HttpRequest.META 中还包含其它一些键值对,这些键值对是Django加进去的,如SERVER_PORT等.对于http header,Django进行了重命名,规则如下 (1) 所有header名大写,将连接符"-"改为下划线"_" (2) 除CONTENT_TYPE和CONTE

  • 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中的小写转为大写,横线"-"转为下划线

  • Nginx如何获取自定义请求header头和URL参数详解

    目录 一.获取 header 请求头 二.获取url参数 总结 一.获取 header 请求头 在 ngx_lua 中访问 Nginx 内置变量 ngx.var.http_HEADER 即可获得请求头HEADER的内容. 在 nginx配置中,通过$http_HEADER 即可获得请求头HEADER的内容. 案例: $.ajax({ ....... headers: { Accept: "application/json; charset=utf-8", X-TimerLocal: &

  • PHP Header失效的原因分析及解决方法

    在PHP中用header("location:test.php")进行跳转要注意以下几点: 1.location和":"号间不能有空格,否则会出错. 2.在用header前不能有任何的输出,包括include的页面中标签"?>"后不能有空格!! 3.header后的PHP代码还会被执行. 续: 问题:header函数前输入内容 一般来说在header函数前不能输出html内容,类似的还有setcookie() 和 session 函数,这些

  • Django如何使用jwt获取用户信息

    HTTP请求是无状态的,我们通常会使用cookie或session对其进行状态保持,cookie存储在客户端,容易被用户误删,安全性不高,session存储在服务端,在服务器集群情况下需要解决session不共享的问题,常用的解决方案有4种:客户端Cookie保存.服务器间Session同步.使用集群管理Session.把Session持久化到数据库. jwt:json web token 在用户注册登录后,记录用户登录状态,我们可以用cookie和session来做状态保持,cookie存储在

  • Django路由层如何获取正确的url

    目录 前言 Tips - django版本区别 路由匹配 无名分组&有名分组 无名分组 有名分组 小提示 反向解析 路由不涉及分组的反向解析 有名分组&无名分组的反向解析 路由分发 前言 客户端浏览器访问Django后端时通过网关和中间件之后会首先在路由层进行路由匹配,只有路由匹配成功之后才能执行对应的视图函数内的逻辑进行数据的处理,本文就来介绍路由层(以diango1.x版本为例)是如何进行路由匹配的? Tips - django版本区别 在django1.x版本和django2.x及更

  • Django 如何获取前端发送的头文件详解(推荐)

    Django里面,我们知道可以在函数里面里面通过参数获取前端发来的数据. 比如可以通过request获取各种form的值啊,cookie啊等等. def index(reqeust): # 获取当前已经登录的用户 v = reqeust.COOKIES.get('username111') return render(reqeust,'index.html',{'current_user': v}) 这些方法是Django把一些常用的数据已经替我们封装好了,因此可以直接使用.但是这些方法并不全,

  • Django之富文本(获取内容,设置内容方式)

    富文本 1.Rich Text Format(RTF) 微软开发的跨平台文档格式,大多数的文字处理软件都能读取和保存RTF文档,其实就是可以添加样式的文档,和HTML有很多相似的地方 图示 2.tinymce插件 安装插件 pip install django-tinymce 配置插件 使用 后台管理中 HTMLField 页面中使用 textarea 3.在后台管理中使用 配置settings.py文件 INSTALLED_APPS 添加 tinymce 应用 INSTALLED_APPS =

  • Django session登陆并获取值的实例

    1.使用session登陆,那么就说明大家登录注册都可以实现.那就直接写seesion的教程 2.在views.py登陆注册已经实现,那么就往session里面添加数据 user =request.session['name'] = name 3.views.py的登陆视图 #登陆模块 def login(request,ess=None): #判断请求方式GET/POST if request.method == 'POST': #获取数据 name = request.POST['name'

  • 从Request.Url中获取根网址的简单操作

    在拼接绝对路径的网址时,经常需要从Request.Url中获取根网址(比如https://git.oschina.net),然后与相对路径一起拼接为绝对路径. 以前的做法如下: var uri = Request.Url.Scheme + "://" + Request.Url.Host + "/userfile/img"; 今天发现了更简单的方法: var uri = Request.Url.GetLeftPart(UriPartial.Authority) +

  • django model的update时auto_now不被更新的原因及解决方式

    gmt_create自动添加auto_now_add:gmt_modify自动更新auto_now class CommonInfo(models.Model): """基类,提供共同信息,不会创建真实的table""" class Meta: # 声明自己为抽象基类 abstract = True # 下面表示先根据更新时间gmt_modify降序排序,如果更新时间相同,再根据创建时间gmt_create降序排序 ordering = ['-g

随机推荐