大兄弟,这种是直接看几行源码就能明白的问题。
你的方法 1 和 方法 2 本质的差别在于是否需要在 context 中添加 request。所以你只要明白 django 中这个 request 和
locals() 是什么意思,就知道这两个的区别了。
- locals(): 这是一个 Python 局部命名空间,存在局部变量。
- django 的 request: 这个是 Django Request 的一个实例,主要存储着一些 HTTP 相关一些基本信息。
至于用不用 request 取决你模板中时候要使用,不使用不传也是可以的。
----
其实放出的这两个函数的源码,你就可以看出来和你方法 1 和 方法 2 有什么异同了。
#: django.shortcuts.render
def render(request, template_name, context=None, content_type=None, status=None, using=None):
content = loader.render_to_string(template_name, context, request, using=using)
return HttpResponse(content, content_type, status)
loader 是 django template 的一个代理。
render_to_string 本质就是把 template 转换成字符串。
#: loader.render_to_string
def render_to_string(template_name, context=None, request=None, using=None):
if isinstance(template_name, (list, tuple)):
template = select_template(template_name, using=using)
else:
template = get_template(template_name, using=using)
return template.render(context, request)
明显看出来,你对框架整体架构不是很清楚。
我觉得我的《 Bottle 源码分析》对你会有帮助:
https://hexiangyu.me/posts/18