Django的View(视图)
视图函数
视图函数,接受Web请求并且返回Web响应(必须返回响应)
响应可以是一张网页的HTML内容,一个重定向,一个404错误
from django.shortcuts import render, HttpResponse,redirect def current_datetime(request): html = "<html><body>你好</body></html>" return HttpResponse(html)
每个视图函数都需要接收请求和返回响应,使用HttpRequest对象作为第一个参数,
并且通常称之为request。每个视图函数都负责返回一个HttpResponse对象,其中包含生成的响应
Request对象
request属性:
django将请求报文中的请求行、首部信息、内容主体封装成 HttpRequest类中的属性
1. request.method 获取请求的方法
值为一个字符串,"GET"、"POST",必须使用大写
对请求方法进行判断if request.method=="POST":pass
2.request.GET 通常用来获取URL里面的参数
值为QueryDict对象,类似于字典,包含HTTP GET的所有参数
如:127.0.0.1:8000/edit_book/?id=1&name=jerd request.GET --> {"id":1, "name":"jerd"} request.GET.get("id") #1
3.request.POST 用来获取POST提交过来的数据
1.POST请求可以带有空的POST字典,如果通过POST发送一个表单,但是表单中没有任何的数据,
QueryDict 对象依然会被创建。
2.如果使用POST上传文件的话,文件信息将包含在FILES属性中
request.FIlES.get('upload_file')
3.键值对的值是多个的时候,比如checkbox类型的input标签,select标签
需要用request.POST.getlist("hobby")
4.request.path_info
获取用户请求的路径(不包含IP和端口和URL参数) 在网页上输入http://127.0.0.1:8000/t_test/ print(request.path_info) 结果:/t_test/
5.request.get_full_path()
在网页上输入http://127.0.0.1:8000/t_test/ print(request.get_full_path()) 结果:/t_test/ 在网页上输入http://127.0.0.1:8000/t_test/?page=5 print(request.get_full_path()) 结果:/t_test/?page=5
6.request.FILES
一个类似于字典的对象,包含所有的上传文件信息。
print(request.FILES) #{'upload_file': [<InMemoryUploadedFile: 0020033025290064_b.jpg (image/jpeg)>]}> file_obj=request.FIlES.get('upload_file')
在使用form表单提交文件时,表单中必须带有enctype="multipart/form-data
否则FILES将为一个空的QueryDict
上传文件
''' urls文件 from django.conf.urls import url from app import views url(r'^upload/', views.upload), html文件 enctype必须要写 form中的input必须有name属性,且注意csrf阻拦 <form action="/upload/,method="post",enctype="multipart/form-data> {% csrf_token %} < input type = "file" name = "upload_file" > < input type = "submit" value = "开始上传" > </form> views文件 from django.shortcuts import HttpResponse,render,redirect def upload(request): if request.method=="POST": file为页面上type = files类型input的name属性值 print(request.FILES) #{'upload_file': [<InMemoryUploadedFile: 0020033025290064_b.jpg (image/jpeg)>]}> file_obj=request.FIlES.get('upload_file') filename=file_obj.name with open(filename,"wb") as f: # 从上传的文件对象中一点一点读 for chunk in request.FILES['file'].chunks(): f.write(chunk) ##从上传的文件对象中一行一行 for line in file_obj: f.write(line) return HttpResponse("上传成功") return render(request,"upload.html") '''
Response对象
响应对象主要有三种形式:
1. HttpResponse --> 返回字符串内容
2. render --> 返回一个html页面
3. redirect --> 返回一个重定向(告诉浏览器再去访问另外的网址)
render方法是结合一个给定的模板和一个给定的上下文字典,将模板页面中的模板语法(在html中为{{}} {% %})
进行渲染,将渲染后的html页面作为响应体。响应的状态码。默认为200。
return render(request, 'index.html', {'name': 'zhao'})
redirect:传递要重定向的一个硬编码的URL
def login(request): return redirect("/login/")
也可传递一个完整的url
默认情况下,redirect() 返回一个临时重定向,响应状态码:302
redirect都接收一个permanent 参数;如果设置为True,将返回一个永久的重定向,响应状态码:301
return redirect("/login/", permanent=True)
A页面临时重定向到B页面,那搜索引擎收录的就是A页面。
A页面永久重定向到B页面,那搜索引擎收录的就是B页面。
301和302的区别
301和302状态码都表示重定向,浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,
(用户看到的效果就是他输入的地址A瞬间变成了另一个地址B)
不同处:
301表示旧地址A的资源已经被永久地移除了,搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;
302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,
搜索引擎会抓取新的内容而保存旧的网址。
重定向原因
(1)网站调整(如改变网页目录结构); (2)网页被移到一个新地址; (3)网页扩展名改变(如应用需要把.php改成.Html或.shtml)。 如果不做重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户得到一个404页面错误信息
JsonResponse对象
JsonResponse是HttpResponse的子类,专门用来生成JSON编码的响应
1.HttpResponse返回的都是字符串,如果要传字典和列表需要序列化处理
def t_test(request): li=[1,2,3] dic={"k1":jerd,"k2":"dandan"} import json str_li=json.dumps(li) str_dic = json.dumps(dic) return HttpResponse(str_li,str_dic) #只能返回一个字符串。显示不出来
2.使用JsonResponse
from django.http import JsonResponse def t_test(request): dic={"k1":jerd,"k2":"dandan"} return JsonResponse(dic)
默认只能传字典,传列表需要添加safe=False
return JsonResponse(li,safe=False)
Django中HttpResponse,JsonResponse和rest—framework中Response的区别
1.HttpResonse返回的是字符串
使用HttpResponse,ajax还需要进行json解析
#views.py return HttpResponse(json.dumps({"msg":"ok!"})) #index.html var data=json.parse(data) console.log(data.msg);
2.JsonResponse返回的是json数据
class JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None,**kwargs)
这个类是HttpRespon的子类,它主要和父类的区别在于:
1.它的默认Content-Type 被设置为: application/json
2.第一个参数,data应该是一个字典类型,当 safe 这个参数被设置为:False ,那data可以填入任何能被转换为JSON格式的对象,比如list, tuple, set。 默认的safe 参数是 True. 如果你传入的data数据类型不是字典类型,那么它就会抛出 TypeError的异常。
3.json_dumps_params参数是一个字典,它将调用json.dumps()方法并将字典中的参数传入给该方法。
使用JsonResponse两边都不需要进行json的序列化与反序列化,ajax接受的直接是一个对象
#views.py from django.http import JsonResponse return JsonResponse({"msg":"ok!"}) #index.html console.log(data.msg);
3.Response按照指定的congtent-type渲染数据,并返回给客户端
将未处理的内容通过内容协商来决定将数据以什么形式返回给客户端
class Response(SimpleTemplateResponse):
def __init__(self, data=None, status=None,
template_name=None, headers=None,
exception=False, content_type=None):pass