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

摘要:
)url,defget_value:a=请求.GET.GET('a')#3b=请求.GET.GET('b')#2num_List=请求。获取。getlist('a')#['1','3']printprintreturnHttpResponse 3。请求主体中的参数3.1获取表单数据通过请求获取url。POST,defget_body:form_Data=请求。帖子。get('c')printreturnHttpResponse 3.2非表单数据获取非表单类型请求主体数据。Django无法自动解析。您可以通过请求获取最原始的请求体数据。body属性,并根据请求主体格式解析它。例如,头的键是api_Auth,在Django中,应该使用request.META.get获取请求头的数据。

通常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.QueryDictHttpRequest对象的属性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'{
    "f":200,
    "d":300
    
}'
    # 对二进制数据进行解码,解码得到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值。

免责声明:文章转载自《Django中获取URL路径参数(路径,查询,请求头,请求体)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇测评国内免费网站监控服务AM335X的USB otg网卡(RNDIS /Ethernet Gadget)调试下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Django web框架之权限管理二

1. login登录 def login(request): if request.method=="GET": return render(request,'login.html') else: username=request.POST.get('user') password=reque...

(四)WebGIS中通过行列号来换算出多种瓦片的URL 之离线地图

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.前言 在前面我花了两个篇幅来讲解行列号的获取,也解释了为什么要获取行列号。在这一章,我将把常见的几种请求瓦片时的URL样式罗列出来,并且给出大致的解释。 我在这里将地图分为离线地图和在线地图。所谓离线地图,即保存在本地而没有发...

Django中CSS加载background url('')问题

Django中CSS加载background url('')问题 在django中, 默认CSS中如果有 background url('images/a.jpg') 这类的属性,会被django当成URL来解析 这样会造成找不到该文件的问题。 所以为了解决这个问题,首先需要配置setting.py, 配置STATICFILES_DIRS STATIC...

[转] Blob对象

Blob是计算机界通用术语之一,全称写作:BLOB(binary large object),表示二进制大对象。MySql/Oracle数据库中,就有一种Blob类型,专门存放二进制数据。在javascript中,Blob通常表示二进制数据,不过它们不一定非得是大量数据,Blob也可以表示一个小型文本文件的内容。本文将详细介绍Blob 构造函数 Blob(...

模拟浏览器请求(WebRequest)

原文地址:https://www.cnblogs.com/mafei2014/articles/4316375.html  运用场景: 现在假设有两个公司A 和 B,现在A公司想要访问B公司的的数据,而B公司我们不能直接的就把数据库暴露给A公司,于是B公司给A公司提供的一个请求url,通过这个请求就可以访问到B公司提供给A公司的请求,但是现在问题来了,A公...

tp配置+路由+基本操作

 一、打开apache 的配置文件httpd_conf添加以下代码 <VirtualHost *:80>DocumentRoot "D:wwwroot hinkphppublicindex.php"  #网站运行目录ServerName tp.com #域名</VirtualHost><VirtualHost *:80>...