先说render_to_response(),是django.shortcuts中的一个方法,用于渲染模板:
使用方法:
return render_to_response('blog.html',{ 'id': id, 'tag': tag},context_instance=RequestContext(request))
render()也是django.shortcuts中的一个方法,render()方法是render_to_response的一个崭新的快捷方式,前者会自动使用RequestContext。而后者必须coding出来,django1.3开始引入。
使用方法:
return render(request, 'blog.html', {'id': id, 'tag': tag})
但是有些人觉得官方的这个快捷方式并不好用,自己写了“类似render”的方式:链接
接下来看看,shortcuts里面都有哪些封好的方法:
- render_to_response
- render
- redirect
- _get_queryset
- get_object_or_404
- get_list_or_404
- resolve_url
而shorcuts.py引入了基本的request和response等,shorcuts收集了“跨越” 多层MVC 的辅助函数和类。 换句话讲,这些函数/类为了方便,引入了可控的耦合。
from django.http import ( Http404, HttpResponse, HttpResponsePermanentRedirect, HttpResponseRedirect, ) from django.template import loader from django.urls import NoReverseMatch, reverse from django.utils import six from django.utils.encoding import force_text from django.utils.functional import Promise
自己平时写代码的时候,有时候直接写了
from django.shortcuts import HttpResponse ,其实只是多次导入而已,改成django.http导入更标准些。
再说下django.http
Django 使用Request 对象和Response 对象在系统间传递状态。而这些API 定义在django.http模块中。
包含的所有方法:
__all__ = [ 'SimpleCookie', 'parse_cookie', 'HttpRequest', 'QueryDict', 'RawPostDataException', 'UnreadablePostError', 'HttpResponse', 'StreamingHttpResponse', 'HttpResponseRedirect', 'HttpResponsePermanentRedirect', 'HttpResponseNotModified', 'HttpResponseBadRequest', 'HttpResponseForbidden', 'HttpResponseNotFound', 'HttpResponseNotAllowed', 'HttpResponseGone', 'HttpResponseServerError', 'Http404', 'BadHeaderError', 'JsonResponse', 'FileResponse', ]
分类情况
from django.http.cookie import SimpleCookie, parse_cookie from django.http.request import ( HttpRequest, QueryDict, RawPostDataException, UnreadablePostError, ) from django.http.response import ( BadHeaderError, FileResponse, Http404, HttpResponse, HttpResponseBadRequest, HttpResponseForbidden, HttpResponseGone, HttpResponseNotAllowed, HttpResponseNotFound, HttpResponseNotModified, HttpResponsePermanentRedirect, HttpResponseRedirect, HttpResponseServerError, JsonResponse, StreamingHttpResponse, )
在django1.7,新引入了JsonResponse,可以直接处理json的格式的返回。不需要再做json.dumps等操作,很方便。
使用方法:
>>> from django.http import JsonResponse >>> response = JsonResponse({'foo': 'bar'}) >>> response.content '{"foo": "bar"}'
另外,HttpRequest提供了一个get_host()方法:
根据从HTTP_X_FORWARDED_HOST(如果打开USE_X_FORWARDED_HOST)和HTTP_HOST 头部信息返回请求的原始主机。如果这两个头部没有提供相应的值,则使用SERVER_NAME 和SERVER_PORT,在PEP 3333 中有详细描述。
当主机位于多个代理的后面,get_host() 方法将会失败。有一个解决办法是使用中间件重写代理的头部,例如下面的例子: class MultipleProxyMiddleware(object): FORWARDED_FOR_FIELDS = [ 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED_HOST', 'HTTP_X_FORWARDED_SERVER', ] def process_request(self, request): """ Rewrites the proxy headers so that only the most recent proxy is used. """ for field in self.FORWARDED_FOR_FIELDS: if field in request.META: if ',' in request.META[field]: parts = request.META[field].split(',') request.META[field] = parts[-1].strip() 这个中间件应该放置在所有依赖于get_host() 的中间件之前 —— 例如,CommonMiddleware 和CsrfViewMiddleware。 HttpRequest.get_full_path()¶
至于真实用户访问ip的获取,如果只是日志,可以在nginx或其他web服务器设置,如果是代码中控制,也可以采用中间件的方式统一设置,再在django代码中控制。具体见下一篇,django获取用户真实访问ip。
说点什么
欢迎讨论