Django框架基础知识09-请求与响应
HttpRequest对象:
服务器接收到http协议的请求后,会根据报文创建HttpRequest对象视图函数的第一个参数是HttpRequest对象在django.http模块中定义了HttpRequest对象的API
form标签中的GET和POST:
在HTML中,form表单的作用是收集标签中的内容,<form>...</form> 中间可以由访问者添加类似于文本,选择,或者一些控制模块等等.然后这些内容将会被送到服务端。
一个表单必须指定两样东西:
\1. form的method参数用于设置表单的提交方式,默认使用POST.
\2. action用于设置表单的提交url,如果不写或者保持空字符串,那么将使用当前的URL.
form表单使用get方式提交的例子:
在上面的视图中渲染模板,下面的视图处理提交的数据.
get方式提交的数据会在url中显示出来.
1.get提交的参数会在url中显示.
2.可以通过request.GET.get的方法来获取提交的参数.
form表单使用post方式提交的例子:
url的配置
post方式提交的数据不会在url中显示.
1.post的提交方式不会在url中显示参数
2.可以通过request.POST.get方式来获取提交的数据
一键多值的getlist方法:
request对象的属性GET、POST都是QueryDict类型的对象
与python字典不同,QueryDict类型的对象用来处理同一个键带有多个值的情况
-
方法get():
根据键获取值,如果传送多值,只能获取键的一个值
如果一个键同时拥有多个值,获取最后一值
-
方法getlist():
根据键获取值将键的值以列表返回
可以获取一个键的多个值
在模板中写上携带get参数的url.
视图中获取参数.
request中GET和POST对象的属性:
GET属性
-
QueryDict类型的对象
-
包含get请求方式的所有参数
-
与url请求地址中的参数对应,位于?后面
-
参数的格式是键值对,如key1=value1
-
多个参数之间,使用&连接,如key1=value1&key2=value2
POST属性
-
QueryDict类型的对象
-
包含post请求方式的所有参数
-
与form表单中的控件对应
-
表单中控件要有name属性,则name属性的值为键,value属性的值为值,构成键值对提交
-
对于checkbox控件,name属性一样为一组,当控件被选中后会被提交,存在一键多值的情况.
GET和POST请求方式总结:
-
GET:GET如其名,是从服务器获取数据,不会更改服务器的状态和数据,在URL中携带参数发送给服务器。
-
POST则是将一定量的数据发送给服务器,一般会更改服务器的数据。
-
POST方法的参数不能在URL当中看到,他是通过body参数传递给服务器的,所以相对GET方法直接能在URL当中看到传递的参数,显得更加安全一些.当然,也不能简单的判定POST方法比GET方法更安全,要使网站保持安全,需要做更多的安全处理.
文件上传:
Django在处理文件上传的时候,文件数据被保存在了request.FILES
FILES中的每个键为<input type="file" name="" />中的name
设置文件的存储路径
1.在项目根目录下static中创建media文件夹
2.图片上传后,会被保存到“/static/media/文件”
3.打开settings.py文件,增加media_root项
文件上传form表单中:
FILES只有在请求的方法为POST 且提交的<form>带有enctype="multipart/form-data" 的情况下才会包含数据。否则,FILES 将为一个空的类似于字典的对象
文件上传视图函数:
HttpResponse对象:
content,返回的内容,字节型,上面写错了.
response.write方法,可以分批次写入数据.再拼接
response.content.decode('utf-8')
HttpResponse的子类:
返回数据的响应函数有:
HttpResponse() 返回简单的字符串对象
render() 渲染模板
redirect() 重定向
JsonResponse() 返回json数据
- 帮助用户创建JSON编码的响应
- 参数data是字典对象
- JsonResponse的默认Content-Type为application/json
HTTP协议:
HTTP(超文本传输协议)是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。
客户端和服务器都是怎么记录登录的状态的呢?
浏览器中的----cookie:
服务器中设置cookie及获取cookie:
注意:设置cookie值以及删除cookie值都是response对象的操作,而获取cookie是从requeset相应中获得的.
虽然cookie可以保存状态 但注意不要存储敏感信息.
在数据库属性中设置:创建mysql数据库要使用utf8mb4字符集,这是一个历史遗留问题,最新的mysql支持的编码.整理collate要选用utf8_bin,怎么对字符进行排序.
写sql时候在=号后面加bynary,主动的使其大小写敏感.
在form表单里加入{% csrf_token %},django自动加入字段
上传文件代码:
def upload(request):
if request.method == 'POST':
files = request.FILES.getlist('file',None)
for file in files:
day_dir = datetime.now().strftime('%Y%m%d')
pre_dir = os.path.join(UPLOAD_ROOT,day_dir)
if not os.path.exists(pre_dir):
os.mkdir(pre_dir)
filename = os.path.join(pre_dir,file.name)
with open(filename,'wb') as f:
for line in file.chunks():
f.write(line)
return HttpResponse('上传成功')