五、HttpRequest对象

回想一下,利用HTTP协议向服务器传参有几种途径?

  • 提取URL的特定部分,如/weather/beijing/2018,可以在服务器端的路由中用正则表达式截取;
  • 查询字符串(query string),形如key1=value1&key2=value2;
  • 请求体(body)中发送的数据,比如表单数据、json、xml;
  • 在http报文的头(header)中。

5.1 URL路径参数

  • 如果想从URL中获取值,需要在正则表达式中使用分组
  • 获取值分为两种方式
    • 位置参数

      • 参数的位置不能错
    • 关键字参数
      • 参数的位置可以变,跟关键字保持一致即可
  • 注意:两种参数的方式不要混合使用,在一个正则表达式中只能使用一种参数方式
  • 分别使用以上两种获取URL值的方式提取出18 188
    • http://127.0.0.1:8000/18/188/

位置参数

  • 应用中urls.py

     url(r'^(\d+)/(\d+)/$', views.index),
    
  • 视图中函数: 参数的位置不能错

    def index(request, value1, value2):# 构造上下文context = {'v1':value1, 'v2':value2}return render(request, 'Book/index.html', context)
    

关键字参数    【项目中基本上都是使用关键字参数的】

  • 应用中urls.py

    • 其中?P<value1>部分表示为这个参数定义的名称为value1
    • 可以是其它名称,起名要做到见名知意

      url(r'^(?P<value1>\d+)/(?P<value2>\d+)/$', views.index),
      
  • 视图中函数: 参数的位置可以变,跟关键字保持一致即可

    def index(request, value2, value1):# 构造上下文context = {'v1':value1, 'v2':value2}return render(request, 'Book/index.html', context)
    

5.2 Django中的QueryDict对象

HttpRequest对象的属性GET、POST都是QueryDict类型的对象

与python字典不同,QueryDict类型的对象用来处理同一个键带有多个值的情况

  • 方法get():根据键获取值

    如果一个键同时拥有多个值将获取最后一个值

    如果键不存在则返回None值,可以设置默认值进行后续处理

    get('键',默认值)
    
  • 方法getlist():根据键获取值,值以列表返回,可以获取指定键的所有值

    如果键不存在则返回空列表[],可以设置默认值进行后续处理

    getlist('键',默认值)
    

5.3. 查询字符串Query String

获取请求路径中的查询字符串参数(形如?k1=v1&k2=v2),可以通过request.GET属性获取,返回QueryDict对象。

# /get/?a=1&b=2&a=3def get(request):a = request.GET.get('a')b = request.GET.get('b')alist = request.GET.getlist('a')print(a)  # 3print(b)  # 2print(alist)  # ['1', '3']return HttpResponse('OK')

重要:查询字符串不区分请求方式,即假使客户端进行POST方式的请求,依然可以通过request.GET获取请求中的查询字符串数据。

5.4 请求体

请求体数据格式不固定,可以是表单类型字符串,可以是JSON字符串,可以是XML字符串,应区别对待。

可以发送请求体数据的请求方式有POSTPUTPATCHDELETE

Django默认开启了CSRF防护,会对上述请求方式进行CSRF防护验证,在测试时可以关闭CSRF防护机制,方法为在settings.py文件中注释掉CSRF中间件,如:

5.4.1 表单类型 Form Data

前端发送的表单类型的请求体数据,可以通过request.POST属性获取,返回QueryDict对象。

def post(request):a = request.POST.get('a')b = request.POST.get('b')alist = request.POST.getlist('a')print(a)print(b)print(alist)return HttpResponse('OK')

5.4.2 非表单类型 Non-Form Data

非表单类型的请求体数据,Django无法自动解析,可以通过request.body属性获取最原始的请求体数据,自己按照请求体格式(JSON、XML等)进行解析。request.body返回bytes类型。

例如要获取请求体中的如下JSON数据

{"a": 1, "b": 2}

【注意:1.双引号,2.不要加多余的逗号】

可以进行如下方法操作:

import jsondef post_json(request):json_str = request.bodyjson_str = json_str.decode()  # python3.6 无需执行此步req_data = json.loads(json_str)  # 转换成字典print(req_data['a'])print(req_data['b'])return HttpResponse('OK')

【在助手中选择POSTBody下 的raw会出来Text,再选择J送,再在里面写Json数据】

5.5 请求头

可以通过request.META属性获取请求头headers中的数据,request.META为字典类型

常见的请求头如:

  • CONTENT_LENGTH– The length of the request body (as a string).
  • CONTENT_TYPE– The MIME type of the request body.
  • HTTP_ACCEPT– Acceptable content types for the response.
  • 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).

具体使用如:

def get_headers(request):print(request.META['CONTENT_TYPE'])return HttpResponse('OK')

5.6 其他常用HttpRequest对象属性

  • method:一个字符串,表示请求使用的HTTP方法,常用值包括:'GET'、'POST'。
  • user:请求的用户对象。
  • path:一个字符串,表示请求的页面的完整路径,不包含域名和参数部分。
  • encoding:一个字符串,表示提交的数据的编码方式。

    • 如果为None则表示使用浏览器的默认设置,一般为utf-8。
    • 这个属性是可写的,可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值。
  • FILES:一个类似于字典的对象,包含所有的上传文件。

【使用方法:request.method】

六、HttpResponse对象

视图在接收请求并处理后,必须返回HttpResponse对象或子对象。HttpRequest对象由Django创建,HttpResponse对象由开发人员创建。

6.1 HttpResponse

可以使用django.http.HttpResponse来构造响应对象。

HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)

也可通过HttpResponse对象属性来设置响应体、响应体数据类型、状态码:

  • content:表示返回的内容。  【传递字符串,不要传递对象、字典等数据】
  • status_code:返回的HTTP响应状态码。  【必须为100~499,只能使用系统规定的】

响应头可以直接将HttpResponse对象当做字典进行响应头键值对的设置:

response = HttpResponse()
response['itcast'] = 'Python'  # 自定义响应头Itcast, 值为Python

示例:

from django.http import HttpResponsedef response(request):return HttpResponse('itcast python', status=400)或者response = HttpResponse('itcast python')response.status_code = 400response['itcast'] = 'Python'return response

6.2 HttpResponse子类

Django提供了一系列HttpResponse的子类,可以快速设置状态码

  • HttpResponseRedirect 301
  • HttpResponsePermanentRedirect 302
  • HttpResponseNotModified 304
  • HttpResponseBadRequest 400
  • HttpResponseNotFound 404
  • HttpResponseForbidden 403
  • HttpResponseNotAllowed 405
  • HttpResponseGone 410
  • HttpResponseServerError 500

6.3 JsonResponse

若要返回json数据,可以使用JsonResponse来构造响应对象,作用:

  • 帮助我们将数据转换为json字符串
  • 设置响应头Content-Typeapplication/json

【遇到字典时就用此反应响应】

from django.http import JsonResponsedef response(request):return JsonResponse({'city': 'beijing', 'subject': 'python'})

6.4 redirect重定向

from django.shortcuts import redirectdef response(request):return redirect('/get_header')

【跳转页面,如注册完后跳转到首页】

【也可以这样写:return redirect('http://www.baidu.com')】

【path = reverse('book:index')      return redirect(path)】

Django视图之HttpRequest对象和HttpResponse对象相关推荐

  1. django请求与响应(HttpRequest对象和HttpResponse对象)

    HttpRequest对象 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象视图函数的第一个参数是HttpRequest对象在django.http模块中定义了HttpReq ...

  2. Django从理论到实战(part43)--HttpResponse对象

    学习笔记,仅供参考,有错必纠 参考自:Django打造大型企业官网–Huang Y: 文章目录 HttpResponse对象 常用属性 常用方法 HttpResponse对象 Django服务器接收到 ...

  3. django request对象和HttpResponse对象

    HttpRequest对象(除非特殊说明,所有属性都是只读,session属性是个例外) HttpRequest.scheme 请求方案(通常为http或https) HttpRequest.body ...

  4. HttpResponse对象

    HttpResponse对象 在django.http模块中定义了HttpResponse对象的API HttpRequest对象由Django自动创建,HttpResponse对象由程序员创建 不调 ...

  5. Django视图(二)

    Django视图(二) 文章目录 Django视图(二) 一.HttpReqeust对象 1.QueryDict对象 2.GET属性 3.POST属性 二.HttpResponse对象 1.属性 2. ...

  6. Django视图(python函数)

    1.视图 视图负责接受Web请求HttpRequest,进行逻辑处理,返回Web响应HttpResponse给请求者 响应可以是一张网页的HTML内容,一个重定向,一个404错误等 视图就是pytho ...

  7. Django框架-Django视图(views)系统

    Django的视图系统 定义:一个视图函数(或类),简称为视图,是一个简单的python函数或类,它接受web请求并且返回web响应. 响应可以是一张网页的html内容,一个重定向,一个404错误,一 ...

  8. 【django】HttpResponse对象

    视图在接收请求并处理后,必须返回HttpResponse对象或⼦对象.HttpRequest对象由Django创建,HttpResponse对象由开发⼈员创建. 一.HttpResponse 可以使⽤ ...

  9. django jsonresponse_0基础掌握Django框架(29)HttpResponse对象

    为了更好的学习效果,请搭配视频教程一起学习: Django零基础到项目实战 - 网易云课堂​study.163.com HttpResponse对象 Django服务器接收到客户端发送过来的请求后,会 ...

最新文章

  1. 如何加入家庭组计算机打印机,如何使用利用win7家庭组打印机
  2. java中xml怎样配置_如何通过XML方式配置并实现Mybatis
  3. python入门买什么书-大学生Python入门什么书好?
  4. B-TrunC标准成功加入ITU集群国际标准
  5. c语言图片raw保存,求指导,如何用c语言实现读取*.raw格式图像
  6. python学习笔记2018-9-18
  7. 微信“拍一拍”的后悔药来了!手滑拍了老板终于有救了
  8. 关于如何提高代码可测试性的一些看法
  9. paip.调试js 查看元素事件以及事件断点
  10. 华为ENSP远程登录
  11. linux系统中的软件管理(软件仓库的搭建:本地+网络源+第三方)
  12. python输出一棵树_如何用Python画一棵树
  13. 模拟人生畅玩版正在连接至服务器,模拟人生™:畅玩版无法连接服务器如何解决...
  14. utf8字符集中漢字默認占三個字節
  15. 苹果6s最大屏幕尺寸_羡慕苹果3DTouch好用?安卓这个功能不比它差!
  16. 吴恩达访谈 - Geoffrey Hinton(个人不懂或是想了解的名词)
  17. 修改Chrome默认的搜索引擎
  18. Vue (一) --- vue.js的快速入门使用
  19. 物联网系列--整体框架搭建
  20. SharedPreferencesUtil工具类

热门文章

  1. CT片居然可以这么玩:用头部CT断层扫描片复原三维头像
  2. 从数百个Excel中查找数据,一分钟用Python搞定
  3. 知乎「致知计划之科学季」颁奖,创作者分享80万元奖金
  4. 直播回顾 | 关于Apollo 5.0控制在环仿真技术的分享
  5. 商汤62篇论文入选CVPR 2019,一览五大方向最新研究进展
  6. 面试官:如果要存ip地址,用什么数据类型比较好
  7. 早就听闻阿里开源的 Arthas 在做 Java 应用诊断上十分牛逼,没失望
  8. 面试环节:在浏览器输入 URL 回车之后发生了什么?(超详细版)
  9. 2021阿里技术人的成长路径!
  10. 支持向量机背后的数学原理!