您的位置:首页 > 编程语言 > Go语言

Django中获取参数的方法

2018-07-05 21:07 260 查看

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

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

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

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

  • 在http报文的头(header)中。

    1.URL中参数的获取

    在定义路由URL时,可以使用正则表达式提取参数的方法从URL中获取请求参数,Django会将提取的参数直接传递到视图的传入参数中。 一、未命名参数按定义顺序传递 注意:参数获取的顺序与url中参数的位置一一对应,不能互换

    url(r'^weather/([a-z]+)/(\d{4})/$', views.weather),
    
    def weather(request, city, year):
    print('city=%s' % city)
    print('year=%s' % year)
    return HttpResponse('OK')
    二、命名参数按名字传递 注意:如果在路由中指定了参数的名字,name接收参数时,必须要使用路由中指定的参数名称,不能换成其他名字,此时,两个参数位置可以互换。
    url(r'^weather/(?P<city>[a-z]+)/(?P<year>\d{4})/$', views.weather),
    
    def weather(request, year, city):
    print('city=%s' % city)
    print('year=%s' % year)
    return HttpResponse('OK')

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

    (形如?k1=v1&k2=v2),可以通过request.GET属性获取,返回QueryDict对象。什么是QueryDict对象?定义在django.http.QueryDictHttpRequest对象的属性GET、POST都是QueryDict类型的对象与python字典不同,QueryDict类型的对象用来处理同一个键带有多个值的情况【1】方法get():根据键获取值如果一个键同时拥有多个值将获取最后一个值如果键不存在则返回None值,可以设置默认值进行后续处理
    dict.get('键',默认值)
    可简写为: dict['键']
    【2】方法getlist():根据键获取值,值以列表返回,可以获取指定键的所有值如果键不存在则返回空列表[],可以设置默认值进行后续处理
    dict.getlist('键',默认值)
    获取参数实例访问路径:/user/qs/?a=10&b=20&a=30
    url(r'^qs/$',views.qs,name='qs'),
    
    def qs(request):
    a = request.GET.get('a')  #30
    b = request.GET.get('b')  #20
    num_list = request.GET.getlist('a') #['10','30']
    print(a)
    print(b)
    print(num_list)
    
    return HttpResponse(reverse('user:qs'))
    重要:查询字符串不区分请求方式,即假使客户端进行POST方式的请求,依然可以通过request.GET获取请求中的查询字符串数据。

    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.其他常用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值。
    return HttpResponse('success')







阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: