HttpResponse对象
注意
一下项目主要在tzlook下完成
概念
服务器接收到http协议的请求后,会根据报文创建HttpRequest对象,视图函数的第一个参数是HttpRequest对象
在django.http模块中定义了HttpRequest对象的API
特点
属性:
path:一个字符串,表示请求的页面的完整路径,不包含域名
method:一个字符串,表示请求使用的HTTP方法,常用值包括: 'GET'、 'POST 。
encoding:一个字符串,表示提交的数据的编码方式,如果为None则表示使用浏览器的默认设置,一般为utf-8
这个属性是可写的,可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值
GET: 一个类似于字典的对象,包含get请求方式的所有参数
POST: 一个类似于字典的对象,包含post请求方式的所有参数
FILES:一个类似于字典的对象,包含所有的上传文件
COOKIES:一个标准的Python字典,包含所有的cookie,键和值都为字符串
session:一个既可读又可写的类似于字典的对象,表示当前的会话,只有当Django启用会话的支持时才可用,详细内容见"状态保持"
方法:
is_ajax(): 如果请求是通过XMLHttpRequest发起的,则返回True
细节
前端响应与后端匹配的HTTP请求方式要一致
表单标签
在HTML中,form表单的作用是收集标签中的内容,<form... </form>中间可以由访问者添加类似于文本,选择,或者一些控制模块等等,然后这些内容将会被送到服务端。
一个表单必须指定两样东西:
1. form的method参数用于设置表单的提交方式,默认使用POST.
2.action用于设置表单的提交url,如果不写或者保持空字符串,那么将使用当前的URL.
表单标签的示例代码
<form action=" /blog/ get_ test1" method=" get" >
a: < i nput type=" text name=" a > < br>
b: < input type=" text name=" b~ > < br >
< input type=" submi t”value=" 提交">
</ form>
视图渲染H5文件
def req_ test (request) :
print (request. path)
print (request. method)
return render (request,' tsl1/get_ form. html' )
def get_ test (request) :
a = request. GET. get( a' )
b = request. GET. get( b' )
print(a, b)
return Ht tpResponse 11111)
Get 和 Post方法的区分
1.get提交的参数会在url中显示.
2.可以通过request.GET.get的方法来获取提交的参数.
Get和Post请求
Get属性
1.-QueryDict类型的对象
2.-包含get请求方式的所有参数
3.-与url请求地址中的参数对应,位于?后面
4.-参数的格式是键值对,如key1 =value1多个参数之间,使用&连接,如 key1 = value1
https://www.baidu.com/s?ie=utf-8&word=%E6%B7%98%E5%AE%9D
Post属性
1.-QueryDict类型的对象
2.-包含post请求方式的所有参数
3.-与form表单中的控件对应
4.-表单中控件要有name属性,则name属性的值为键,value 属性的值为值,构成键值对提交
5.-对于checkbox控件,name 属性一样为一组,当控件被选中后会被提交,存在一-键多值的情况.
关于二者的总结
1. GET:GET如其名,是从服务器获取数据,不会更改服务器的状态和数据,在URL中携带参数发送给服务器。
2. POST则是将一定量的数据发送给服务器,一般会更改服务器的数据。
3. POST方法的参数不能在URL当中看到,他是通过body参数传递给服务器的,所以相对GET方法直接能在URL当中看到传递的参数,显得更加安全一些。当然也不能简单的判定POST方法比GET方法更安全,要使网站保持安全需要做更多的安全处理。
类视图
示例代码—-视图编写逻辑
from django. views import View
class BlogAdd (View) :
def get(self, request) :
return render (request,' blogs/demo_ add. html' )
def post (self, request) :
title = request. POST. get(' title' )
content = request. POST[content' ]
blog = BlogModel (title=title, content= content)
blog. save()
return redirect (reverse( cls_ add' ))
代码实战—-1(浏览器提交Get请求的数据)
### HTML5
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试Views视图函数</title>
</head>
<body>
<form action="#" method="get">
a: <input type="text" name="a"><br>
b: <input type="text" name="b"><br>
</form>
<input type="submit" value="提交">
</body>
</html>
### views.py
from django.http import HttpResponse
def get_test(request):
a = request.GET.get('a')
b = request.GET.get('b')
print(a, b)
return HttpResponse("测试GET方法")
### urls.py
path('get_test/', views.get_test), # 测试Get方法
效果
代码实战—-2(渲染提交表单)
### views.py
def req_test(request):
print(request.path)
print(request.method)
return render(request, "viewstest.html")
### urls.py
path('req_test/', views.req_test), # 测试Get方法,渲染整个HTML5
效果
代码实战—-3同时处理多种请求
### views.py
def post_test(request):
if request.method == 'GET':
return render(request, 'viewstest.html')
elif request.method == 'POST':
a = request.POST.get('a')
b = request.POST.get('b')
print(a, b)
return HttpResponse('')
else:
return HttpResponse("这个不是一个可以处理的请求")
### urls.py
path('post_test/', views.post_test), # 测试Get方法,同时处理两种请求
使用django.db.Views书写请求
### views.py
class BlogAdd(View):
def get(self, request):
return render(request, 'viewstest.html')
def post(self, request):
title = request.POST.get('title')
content = request.POST.get('content')
return HttpResponse('post请求。')
### urls.py
path('clas_add/', views.BlogAdd.as_view(), name = "clas_add"), # django.db.Views重构
使用postman监听
辅助工具___postman
### 下载地址
https://www.postman.com/downloads/
使用详情
文件上传
理论知识
### 保存路径的书写
Django在处理文件上传的时候,文件数据被保存在了request.FILESFILES中的每个键
为<input type= "file" name="" />中的name
### 设置文件的存储路径
1.在项目根目录下static中创建media文件夹
2.图片上传后,会被保存到“/static/medial文件”
3.打开settings.py文件,增加media root项
参数
属性:
content:表示返回的内容,字符串类型
Charset:表示response采用的编码字符集,字符串类型
status_code: 响应的HTTP响应状态码
content-type:指定输出的MIME类型
方法:
init :使用页内容实例化HttpResponse对象
write(content):以文件的方式写
flush():以文件的方式输出缓存区
set_cookie(key, value='', max_age=None, expires=None): 设置Cookie # expire 有效期
key、value都是字符串类型
max__age是一一个整数,表示在指定秒数后过期
expires是一个datetime或timedelta对象,会话将在这个指定的日期/时间过期,注意datetime和timedelta值只有在使用PickleSerializer时才可序列化
max_age与expires二选一
如果不指定过期时间,则关闭浏览器就失效。
delete_cookie(key): 删除指定的key的Cookie,如果key不存在则什么也不发生
HttpResponse子类
### 返回数据的响应函数有
返回数据的响应函数有:
1. HttpResponse() 返回简单的字符串对象
2. render() 渲染模板
3. redirect() 重定向
4. JsonResponse() 返回json数据
### JSON格式
from django. http import JsonResponse
def resp (request) :
return JsonResponse({ ss:1234})
### 作用
帮助用户创建、JSON编码的响应
-参数data是字典对象
- JsonResponse的默认Content-Type为application/json
代码块
### settings.py
# 设置上传文件夹地址
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
MEDIA_ROOT = os.path.join(BASE_DIR, 'static/media')
### views.py
import os
from django.shortcuts import render
from django.http import HttpResponse
from django.views import View
from tzlook.settings import MEDIA_ROOT
def upload_test(request):
if request.method == 'GET':
return render(request, 'ss.html')
elif request.method == 'POST':
fl = request.FILES('file')
fl.name = os.path.join(MEDIA_ROOT, fl.name)
with open(fl.name, 'wb') as f:
for c in fl.chunks():
f.write(c)
return HttpResponse('成功读取,已结束。')
else:
return HttpResponse('ERROR')
### urls.py
path('upload_test/', views.upload_test, name = "upload_test"), # 文件上传
效果
文件保存位置
主项目同级目录
设置cookie
### views.py
### 特别注意,一个语句只能设置一个cookie,设置多个就使用两次该语句
def set_cookie(request):
'''
设置cookies
'''
response = HttpResponse('设置cookie')
response.set_cookie('name') # 默认关闭浏览器则过期
response.set_cookie('taka') # 默认关闭浏览器则过期
return response
### urls.py
path('set_cookie/', views.set_cookie, name = "set_cookie"), # 设置cookies
获取cookie
### views.py
def get_cookies(request):
'''
获取cookie
'''
cookie = request.COOKIES
print(cookie)
return HttpResponse("获取cookie")
### urls.py
path('get_cookies/', views.get_cookies, name="get_cookies"), # 获取cookies
删除cookie
### views.py
def delete_ck(request):
'''
用什么方法创建就用什么方法删除
'''
rs = HttpResponse('删除cookie')
rs.delete_cookie('name')
return rs
### urls.py
path('delete_ck/', views.delete_ck, name="delete_ck"), # 删除cookies
效果
总结
content 返回的是一个字符串类型
charset 字符串类型 编码的字符集
post比get安全,比如我们的敏感信息不能放入get里面