HttpResponse对象

注意

一下项目主要在tzlook下完成

概念

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

特点

  1. 属性:
  2. path:一个字符串,表示请求的页面的完整路径,不包含域名
  3. method:一个字符串,表示请求使用的HTTP方法,常用值包括: 'GET' 'POST 。
  4. encoding:一个字符串,表示提交的数据的编码方式,如果为None则表示使用浏览器的默认设置,一般为utf-8
  5. 这个属性是可写的,可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值
  6. GET: 一个类似于字典的对象,包含get请求方式的所有参数
  7. POST: 一个类似于字典的对象,包含post请求方式的所有参数
  8. FILES:一个类似于字典的对象,包含所有的上传文件
  9. COOKIES:一个标准的Python字典,包含所有的cookie,键和值都为字符串
  10. session:一个既可读又可写的类似于字典的对象,表示当前的会话,只有当Django启用会话的支持时才可用,详细内容见"状态保持"
  11. 方法:
  12. is_ajax(): 如果请求是通过XMLHttpRequest发起的,则返回True

细节

前端响应与后端匹配的HTTP请求方式要一致

表单标签

  1. HTML中,form表单的作用是收集标签中的内容,<form... </form>中间可以由访问者添加类似于文本,选择,或者一些控制模块等等,然后这些内容将会被送到服务端。
  2. 一个表单必须指定两样东西:
  3. 1. formmethod参数用于设置表单的提交方式,默认使用POST.
  4. 2.action用于设置表单的提交url,如果不写或者保持空字符串,那么将使用当前的URL.

表单标签的示例代码

  1. <form action=" /blog/ get_ test1" method=" get" >
  2. a: < i nput type=" text name=" a > < br>
  3. b: < input type=" text name=" b~ > < br >
  4. < input type=" submi t”value=" 提交">
  5. </ form>

视图渲染H5文件

  1. def req_ test (request) :
  2. print (request. path)
  3. print (request. method)
  4. return render (request,' tsl1/get_ form. html' )
  5. def get_ test (request) :
  6. a = request. GET. get( a' )
  7. b = request. GET. get( b' )
  8. print(a, b)
  9. return Ht tpResponse 11111)

Get 和 Post方法的区分

  1. 1.get提交的参数会在url中显示.
  2. 2.可以通过request.GET.get的方法来获取提交的参数.

Get和Post请求

Get属性

  1. 1.-QueryDict类型的对象
  2. 2.-包含get请求方式的所有参数
  3. 3.-与url请求地址中的参数对应,位于?后面
  4. 4.-参数的格式是键值对,如key1 =value1多个参数之间,使用&连接,如 key1 = value1
  5. https://www.baidu.com/s?ie=utf-8&word=%E6%B7%98%E5%AE%9D

Post属性

  1. 1.-QueryDict类型的对象
  2. 2.-包含post请求方式的所有参数
  3. 3.-与form表单中的控件对应
  4. 4.-表单中控件要有name属性,则name属性的值为键,value 属性的值为值,构成键值对提交
  5. 5.-对于checkbox控件,name 属性一样为一组,当控件被选中后会被提交,存在一-键多值的情况.

关于二者的总结

  1. 1. GET:GET如其名,是从服务器获取数据,不会更改服务器的状态和数据,在URL中携带参数发送给服务器。
  2. 2. POST则是将一定量的数据发送给服务器,一般会更改服务器的数据。
  3. 3. POST方法的参数不能在URL当中看到,他是通过body参数传递给服务器的,所以相对GET方法直接能在URL当中看到传递的参数,显得更加安全一些。当然也不能简单的判定POST方法比GET方法更安全,要使网站保持安全需要做更多的安全处理。

类视图

示例代码—-视图编写逻辑

  1. from django. views import View
  2. class BlogAdd (View) :
  3. def get(self, request) :
  4. return render (request,' blogs/demo_ add. html' )
  5. def post (self, request) :
  6. title = request. POST. get(' title' )
  7. content = request. POST[content' ]
  8. blog = BlogModel (title=title, content= content)
  9. blog. save()
  10. return redirect (reverse( cls_ add' ))

代码实战—-1(浏览器提交Get请求的数据)

  1. ### HTML5
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <title>测试Views视图函数</title>
  7. </head>
  8. <body>
  9. <form action="#" method="get">
  10. a: <input type="text" name="a"><br>
  11. b: <input type="text" name="b"><br>
  12. </form>
  13. <input type="submit" value="提交">
  14. </body>
  15. </html>
  16. ### views.py
  17. from django.http import HttpResponse
  18. def get_test(request):
  19. a = request.GET.get('a')
  20. b = request.GET.get('b')
  21. print(a, b)
  22. return HttpResponse("测试GET方法")
  23. ### urls.py
  24. path('get_test/', views.get_test), # 测试Get方法

效果

代码实战—-2(渲染提交表单)

  1. ### views.py
  2. def req_test(request):
  3. print(request.path)
  4. print(request.method)
  5. return render(request, "viewstest.html")
  6. ### urls.py
  7. path('req_test/', views.req_test), # 测试Get方法,渲染整个HTML5

效果

代码实战—-3同时处理多种请求

  1. ### views.py
  2. def post_test(request):
  3. if request.method == 'GET':
  4. return render(request, 'viewstest.html')
  5. elif request.method == 'POST':
  6. a = request.POST.get('a')
  7. b = request.POST.get('b')
  8. print(a, b)
  9. return HttpResponse('')
  10. else:
  11. return HttpResponse("这个不是一个可以处理的请求")
  12. ### urls.py
  13. path('post_test/', views.post_test), # 测试Get方法,同时处理两种请求

使用django.db.Views书写请求

  1. ### views.py
  2. class BlogAdd(View):
  3. def get(self, request):
  4. return render(request, 'viewstest.html')
  5. def post(self, request):
  6. title = request.POST.get('title')
  7. content = request.POST.get('content')
  8. return HttpResponse('post请求。')
  9. ### urls.py
  10. path('clas_add/', views.BlogAdd.as_view(), name = "clas_add"), # django.db.Views重构

使用postman监听

辅助工具___postman

  1. ### 下载地址
  2. https://www.postman.com/downloads/

使用详情

文件上传

理论知识

  1. ### 保存路径的书写
  2. Django在处理文件上传的时候,文件数据被保存在了request.FILESFILES中的每个键
  3. 为<input type= "file" name="" />中的name
  4. ### 设置文件的存储路径
  5. 1.在项目根目录下static中创建media文件夹
  6. 2.图片上传后,会被保存到“/static/medial文件”
  7. 3.打开settings.py文件,增加media root

参数

  1. 属性:
  2. content:表示返回的内容,字符串类型
  3. Charset:表示response采用的编码字符集,字符串类型
  4. status_code: 响应的HTTP响应状态码
  5. content-type:指定输出的MIME类型
  6. 方法:
  7. init :使用页内容实例化HttpResponse对象
  8. write(content):以文件的方式写
  9. flush():以文件的方式输出缓存区
  10. set_cookie(key, value='', max_age=None, expires=None): 设置Cookie # expire 有效期
  11. keyvalue都是字符串类型
  12. max__age是一一个整数,表示在指定秒数后过期
  13. expires是一个datetimetimedelta对象,会话将在这个指定的日期/时间过期,注意datetimetimedelta值只有在使用PickleSerializer时才可序列化
  14. max_ageexpires二选一
  15. 如果不指定过期时间,则关闭浏览器就失效。
  16. delete_cookie(key): 删除指定的keyCookie,如果key不存在则什么也不发生

HttpResponse子类

  1. ### 返回数据的响应函数有
  2. 返回数据的响应函数有:
  3. 1. HttpResponse() 返回简单的字符串对象
  4. 2. render() 渲染模板
  5. 3. redirect() 重定向
  6. 4. JsonResponse() 返回json数据
  7. ### JSON格式
  8. from django. http import JsonResponse
  9. def resp (request) :
  10. return JsonResponse({ ss:1234})
  11. ### 作用
  12. 帮助用户创建、JSON编码的响应
  13. -参数data是字典对象
  14. - JsonResponse的默认Content-Typeapplication/json

代码块

  1. ### settings.py
  2. # 设置上传文件夹地址
  3. STATIC_URL = '/static/'
  4. STATICFILES_DIRS = [
  5. os.path.join(BASE_DIR, 'static')
  6. ]
  7. MEDIA_ROOT = os.path.join(BASE_DIR, 'static/media')
  8. ### views.py
  9. import os
  10. from django.shortcuts import render
  11. from django.http import HttpResponse
  12. from django.views import View
  13. from tzlook.settings import MEDIA_ROOT
  14. def upload_test(request):
  15. if request.method == 'GET':
  16. return render(request, 'ss.html')
  17. elif request.method == 'POST':
  18. fl = request.FILES('file')
  19. fl.name = os.path.join(MEDIA_ROOT, fl.name)
  20. with open(fl.name, 'wb') as f:
  21. for c in fl.chunks():
  22. f.write(c)
  23. return HttpResponse('成功读取,已结束。')
  24. else:
  25. return HttpResponse('ERROR')
  26. ### urls.py
  27. path('upload_test/', views.upload_test, name = "upload_test"), # 文件上传

效果

文件保存位置

主项目同级目录

设置cookie

  1. ### views.py
  2. ### 特别注意,一个语句只能设置一个cookie,设置多个就使用两次该语句
  3. def set_cookie(request):
  4. '''
  5. 设置cookies
  6. '''
  7. response = HttpResponse('设置cookie')
  8. response.set_cookie('name') # 默认关闭浏览器则过期
  9. response.set_cookie('taka') # 默认关闭浏览器则过期
  10. return response
  11. ### urls.py
  12. path('set_cookie/', views.set_cookie, name = "set_cookie"), # 设置cookies

获取cookie

  1. ### views.py
  2. def get_cookies(request):
  3. '''
  4. 获取cookie
  5. '''
  6. cookie = request.COOKIES
  7. print(cookie)
  8. return HttpResponse("获取cookie")
  9. ### urls.py
  10. path('get_cookies/', views.get_cookies, name="get_cookies"), # 获取cookies

删除cookie

  1. ### views.py
  2. def delete_ck(request):
  3. '''
  4. 用什么方法创建就用什么方法删除
  5. '''
  6. rs = HttpResponse('删除cookie')
  7. rs.delete_cookie('name')
  8. return rs
  9. ### urls.py
  10. path('delete_ck/', views.delete_ck, name="delete_ck"), # 删除cookies

效果

总结

content 返回的是一个字符串类型

charset 字符串类型 编码的字符集

post比get安全,比如我们的敏感信息不能放入get里面