django中的render(),render_to_response()

先说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里面都有哪些封好的方法:

  1. render_to_response
  2. render
  3. redirect
  4. _get_queryset
  5. get_object_or_404
  6. get_list_or_404
  7. 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。

 

Written by

说点什么

欢迎讨论

avatar

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

  Subscribe  
提醒