多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# Response对象 ## HttpResponse对象 * 在django.http模块中定义了HttpResponse对象的API * HttpRequest对象由Django自动创建,HttpResponse对象由程序员创建 * 不调用模板,直接返回数据 ```text from django.http import HttpResponse def index(request): return HttpResponse("你好") ``` * 调用模板 ```text from djangp.http import HttpResponse from django.template import RequestContext,loader def index(request): templates = loader.get_template('myapp/index.html') context ={'h':'hello'} return HttpResponse(templates.render(context,request)) ``` ## 属性 * content:表示返回的内容,字符串类型 * charset:表示response采用的编码字符集,字符串类型 * status\_code:响应的HTTP响应状态码 * content-type:指定输出的MIME类型 ## 方法 * init:使用也内容实例化HttpResponse对象 * write\(content\):以文件的方式写 * flush\(\):以文件的方式输出缓存区 * set\_cookie\(key,value=",max\_age=None,expires=None\):设置Cookie * key、value都是字符串类型 * max\_age是一个整数目标是在指定秒数后过期 * expires是一个datetime或timedelta对象,会话将在这个指定的日期/时间过期,注意datetime和timedelta值只有在使用PickleSerializer时才可序列化 * max\_age与expires二选一 * 如果不指定过期时间,则两个星期后过期 ```text from django.http import HttpReponse from datetime import * ``` * 创建cookie ```text from django.http import HttpResponse def index(request): response = HttpResponse() cookie = request.COOKIES response.set_cookie('name', 'angle') #response.set_cookie('h1', '你好', None, datetime(2016, 10, 31)) return response ``` * 在屏幕上输出cookie值 ```text from django.http import HttpResponse def index(request): response = HttpResponse() cookie = request.COOKIES response.write('<h1>' + cookie['name'] + '</h1>') return response ``` * delete\_cookie\(key\):删除指定的key的Cookie,如果key不存在则什么也不发生 ## 子类HttpResponseRedirect * 重定向,服务器端跳转 * 构造函数的第一个参数用来指定重定向的地址 ```text from django.http import HttpResponse,HttpResponseRedirect def index(request): return HttpResponseRedirect('js/') def index2(request,id): return HttpResponse(id) ``` 请求地址:127.0.0.1:8000/index 请求结果地址:127.0.0.1:8000/index/js/ * 反向解析 ```text from django.urls import reverse def index(request): print(reverse('myapp:index')) # /sunck/index/ return render(request,'myapp/index.html') ``` * index.html ```text <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>学生信息</title> </head> <body> <h1>学生列表</h1> <a href="/good/123/">链接1</a> # {# 硬链接 <a href="{% url 'myapp:good' 1%}">链接2</a> # {# 反向解析 </body> </html> ``` * 请求地址:[http://localhost:8000/sunck/index/](http://localhost:8000/sunck/index/) * 第一个链接:[http://localhost:8000/good/123/](http://localhost:8000/good/123/) * 第二个链接:[http://localhost:8000/sunck/good/1](http://localhost:8000/sunck/good/1) * 注意: * 在urls.py中添加 ```text app_name = 'myapp' ``` * 在test2/urls.py中添加 ```text url(r'^sunck/',include('myapp.urls',namespace='myapp')), ``` ## 子类JsonResponse * 返回json数据,一般用于异步请求 * _init_\(data\) * 帮助用户创建json编码的响应 * 参数data是字典对象 * JsonResponse的默认Content-Type为application/json ```text from django.http import JsonResponse def jsonTest(request): return JsonResponse({'list':'abc'}) 配置路由: url(r'^js/$',views.jsonTest,name="js"), ``` ## 简写函数 ### render * render\(request,template\_name\[,context\]\) * 结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的HttpResponse对象 * request:该request用于生产response * template\_name:要使用的模板的完整名称 * context:添加到模板上下文的一个字典,视图将在渲染模板之间调用它 ```text from django.shortcuts import render def index(request): retuen render(request,'myapp/index.html',{'name':'angle'}) ``` ### **重定向** * redirect\(url\) * 为传递进来的参数返回HttpReponseRedirect * url推荐使用反向解析 ```text def showindex(request): print(reverse("myapp:index")) # return redirect(reverse('myapp:index')) return redirect('/sunck/index') return redirect(reverse('myapp:index')) //重定向访问index.html ``` ### 得到对象或返回404 * get\_object\_or-404\(klass,\*args,\*\*kwargs\) * 通过模型管理器或查询集调用get\(\)方法,如果没有找到对象,不引发模型的DoesNotExist异常,而是引发Http404异常 * klass:获取对象的模型类、Manager对象或QuerySet对象 * \*\*kwargs:查询的参数,格式应该可以被get\(\)和filter\(\)接受 * 如果找到多个对象将引发MultipleObjectReturned ```text from django.shortcuts import * def detail(request,id): try: g = get_object_or_404(Grades,gname="python01") except Grades.MultipleObjectsReturned: return HttpResponse('error') return render(request,'myapp/detail.html',{'grade':g,"id":id}) # 将settings.py中的DEBUG改为False # 将请求地址输入2和100查看效果 ``` ## 得列表或返回404 * get\_list\_or\_404\(klass,args,\*kwargs\) * klass:获取列表的一个Model,Manager或QuerySet实例 * \*\*kwargs:查询的参数,格式应该可以被get\(\)和filter\(\)接受 ```text from django.shortcuts import * def index(request): list = get_list_or_404(Grades,pk__lt==6) return render(request,'myapp/detail.html',{'grade':g) ``` 将settings.py中的DEBUG改为False