Django接收自定义http header(转)

原文:http://callmepeanut.blog.51cto.com/7756998/1390769

用Django做后台,客户端向Django请求数据,为了区分不同的请求,想把每个请求类别加在HTTP头部(headers)里面。

先做实验,就用Python的httplib库来做模拟客户端,参考网上写出模拟代码如下:

#coding=utf8
import httplib
httpClient = None
try:
    myheaders = { "category": "Books",
                  "id": "21",
                  ‘My-Agent‘: "Super brower"
              }
    httpClient = httplib.HTTPConnection(‘10.14.1XX.XXX‘,8086,timeout=30)
    httpClient.request(‘GET‘,‘/headinfo/‘,headers=myheaders)
    response = httpClient.getresponse()
    print response.status
    print response.reason
    print response.read()
except Exception, e:
    print e
finally:
    if httpClient:
        httpClient.close()

其中‘/headinfo/‘为服务器的响应目录。

然后是服务端的响应代码,《The Django Book》第七章有个获取META的例子:

# GOOD (VERSION 2)
def ua_display_good2(request):
    ua = request.META.get(‘HTTP_USER_AGENT‘, ‘unknown‘)
    return HttpResponse("Your browser is %s" % ua)

正好看过这个例子,就模拟上面的这个写了一个能够返回客户端自定义头部的模块:

from django.http import HttpResponse
def headinfo(request):
    category = request.META.get(‘CATEGORY‘, ‘unkown‘)
    id = request.META.get(‘ID‘,‘unkown‘)
    agent = request.META.get(‘MY-AGENT‘,‘unkown‘)
    html = "<html><body>Category is %s, id is %s, agent is %s</body></html>" % (category, id, agent)
    return HttpResponse(html)

运行结果如下:

$python get.py
#输出:
#200
#OK
#<html><body>Category is unkown, id is unkown, agent is unkown</body></html>

可以看到服务器成功响应了,但是却没有返回自定义的内容。

我以为是客户端模拟headers出问题了,查找和试验了许多次都没有返回正确的结果。后来去查Django的文档,发现了相关的描述:

HttpRequest.META

A standard Python dictionary containing all available HTTP headers. Available headers depend on the client and server, but here are some examples:

  • CONTENT_LENGTH – the length of the request body (as a string).
  • CONTENT_TYPE – the MIME type of the request body.
  • HTTP_ACCEPT_ENCODING – Acceptable encodings for the response.
  • HTTP_ACCEPT_LANGUAGE – Acceptable languages for the response.
  • HTTP_HOST – The HTTP Host header sent by the client.
  • HTTP_REFERER – The referring page, if any.
  • HTTP_USER_AGENT – The client’s user-agent string.
  • QUERY_STRING – The query string, as a single (unparsed) string.
  • REMOTE_ADDR – The IP address of the client.
  • REMOTE_HOST – The hostname of the client.
  • REMOTE_USER – The user authenticated by the Web server, if any.
  • REQUEST_METHOD – A string such as "GET" or "POST".
  • SERVER_NAME – The hostname of the server.
  • SERVER_PORT – The port of the server (as a string).

With the exception of CONTENT_LENGTH and CONTENT_TYPE, as given above, any HTTP headers in the request are converted toMETA keys by converting all characters to uppercase, replacing any hyphens with underscores and adding an HTTP_ prefix to the name. So, for example, a header called X-Bender would be mapped to the META key HTTP_X_BENDER.

其中红色的部分说明是说除了两个特例之外,其他的头部在META字典中的key值都会被加上“HTTP_”的前缀,终于找到问题所在了,赶紧修改服务端代码:

category = request.META.get(‘HTTP_CATEGORY‘, ‘unkown‘)
id = request.META.get(‘HTTP_ID‘,‘unkown‘)

果然,执行后返回了想要的结果:

$python get.py
#正确的输出:
#200
#OK
#<html><body>Category is Books, id is 21, agent is Super brower</body></html>

得到的经验就是遇到问题要多查文档,搜索引擎并不一定比文档更高效。

时间: 2024-10-26 23:54:20

Django接收自定义http header(转)的相关文章

Django使用自定义认证方式

Django使用自定义认证方式 创建登录应用 首先创建一个新的login app,用来存放认证用到代码 python manage.py startapp login 修改settings.py中的认证项 AUTHENTICATION_BACKENDS = ( 'login.auth.UsernamePasswordAuth', ) 自定义认证类 在login app下创建auth.py文件,内容如下 #coding:utf-8 from django.contrib.auth.models i

nginx 自定义http header

用NGINX做负载,但后端有N多服务器,请求过去不知道到哪台服务器,为了便于定位问题, 我们自定义http header加入后端服务器, 先看下配置 upstream backend { server 172.29.88.226:8080 weight=1; server 172.29.88.227:8080 weight=1; sticky;} ##Custom Header##   map $upstream_addr $server_x_tag{     '172.29.88.226:80

Django入门--自定义过滤器与标签

为了让Django找到自定义的模板过滤器和模板标签,需要进行文件路径配置,配置方式分为APP目录下配置和项目路径下配置两种方式: 1.在APP目录下配置:针对某个应用特定的自定义 第一步:在APP目录下创建"templatetags"文件夹: 第二步:在"templatetags"文件夹下创建python模块(py文件) 2.在项目目录下配置:针对所有应用的自定义 第一步:在项目目录下创建一个新的app,例如"common"文件夹 第二步:在项目

再遇CORS -- 自定义HTTP header的导致跨域

指路牌 后端配置好了跨域,但是前端在HTTP header添加token后,又产生跨域的问题 Flask.Vue(Axios).跨域 适用场景 前后端分离,想要使用token来管理登录状态,或调用后台接口 环境 平台无关 参考博客 axios 在header中配置token信息后,向后端请求会报跨域的问题.但是用postman测试的时候没有什么问题. 这个问题的回答其实没有给出直接性的帮助,甚至回答的有点奇怪,但是帮我打开了思路. 背景 出于多种考虑,放弃了使用类似WordPress这种现成博客

Django之自定义标签,过滤器,以及inclusion_tag

目录 Django之自定义标签,过滤器,以及inclusion_tag 自定义过滤器 自定义标签 inclusion_tag inclusion_tag() 项目实例: inclusion_tag() 案例(博客左侧标签栏) Django之自定义标签,过滤器,以及inclusion_tag 自定义过滤器 1,确定app是否在setting中注册 2 在app下创建一个templatetags的文件夹(模块)(名字不能变***) 3 在模块下创建一个py文件,名字随意:mytag.py 4 第一步

django 组件 自定义标签 静态文件配置

组件 将一些功能标签写在一个html文件里,这个文件作为一个组件,如果那个文件需要就直接拿过来使用即可: 这是title.html文件,写了一个导航栏,作为一个公用的组件 <div style="background-color: cyan;width: 100%;height: 40px;"> <span style="font-size: 20px;">首页</span> <span style="font-s

Django中自定义过滤器的使用

我在这里做的是: 从数据库查出id递增的一些信息,展示在前台. 编写一个过滤器判断查出数据的id是偶数的返回True 奇数返回False 1 创建项目,创建应用,注册应用,配置settings.py文件,配置urls映射,编写views试图,编写模板templates,编写models模块 切记 注册应用.  很多伙伴找不到自己定义的过滤器,是因为忘记注册应用! 2 创建过滤器的目录: 实际上,在项目目录或者应用目录下创建都是可以的,创建一个名为templatetags的python模块 在我这

django中自定义标签和过滤器

想要实现自定义标签和过滤器需要进行准备工作: 准备(必需)工作: 1  在某个app下创建一个名为templatetags(必需,且包名不可变)的包.假设我们在名为polls的app下创建了一个templatetags的包,并在该包下创建了一个名为mytags的文件.那么目录结构看起来应该就像这样: polls/ __init__.py models.py templatetags/ __init__.py mytags.py views.py 2  settings文件中的INSTALLD_A

Django的自定义标签

Django提供了自定义标签功能,可以方便常用方法的重复使用. 标签的本质就是函数,标签名就是函数名. 注意点: 1.需要到django.template对象. 2.register = template.Library(),@register.simple_tag作为装饰器. 3.在html中使用标签时,要先{% load blog_tags %},之后才能使用blog_tags.py中的自定义标签. 4.blog_tags.py的项目位置,位于应用目录下的templatetags目录下,te