先说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。
说点什么
欢迎讨论