4. render, redirect, HttpRespons
Render():
把模板和context结合在一起,返回一个带有这个组合的Http响应。
render(request, template_name, context=None, content_type=None, status=None, using=None)
- request,template_name必填;
- context:A dictionary of values
- content_type:The MIME type to use for the resulting document
- status:返回状态码,默认200
- using:The NAME of a template engine to use for loading the template.
多用于渲染模板并返回。
Redirect():
返回一个http响应重定向到一个合适的URL(参数to提供)。
redirect(to, permanent=False, *args, **kwargs)
to:
- 可以是一个model(会自动调用get_absolute_url())
- 也可以是一个view的函数(或者是一个url 的name),此时会调用reverse进行url逆向解析。
- 同时也可以是一个硬编码相对url和绝对url。
def my_view(request):
...
return redirect('https://example.com/')
return redirect('/some/url/')
return redirect(reverse('commons.views.invoice_return_index', args=[]))
Attention:redirect会返回302状态码(302重定向是暂时的重定向)
reverse():
用来在一个view函数中,通过url pattern进行跳转,执行其他view函数。
reverse(viewname, urlconf=None, *args=None, **kwargs=None, current_app=None)
- viewname:当然可以用view.name,但是官网不建议这样做,最好用在url pattern里面每一个url的name。
path('archive/', views.archive, name='news-archive')
# using the named URL
reverse('news-archive')
-
args 和 kwargs 不能同时被传递。
-
urlconf:指明了当前执行reverse用到的URL patterns的URLconf module,默认使用当前线程的根URLconf 。这里利用Get的方式进行返回,所以要传递参数时,url pattern里要进行正则分析。个人觉得在不需要正则表达式时,是可以用return 直接调用function来代替的。
如果没有匹配,就会返回异常:NoReverseMatch
注意,不是所有的表达都可以reverse:
The main restriction at the moment is that the pattern cannot contain alternative choices using the vertical bar ("|") character. You can quite happily use such patterns for matching against incoming URLs and sending them off to views, but you cannot reverse such patterns.
HttpResponse()
由程序员构造的一个对象,定义于django.http。不需要返回模板,直接返回该对象。
该对象有很多方式进行构造修改,更多异步
谈到HttpResponse,就不得不谈到HttpRequest对象:
请求一张页面时,Django把请求的metadata数据包装成一个HttpRequest对象,然后Django加载合适的view方法,把这个HttpRequest 对象作为第一个参数传给view方法。
- 任何view方法都应该返回一个HttpResponse对象。
- render是对HttpResponse对象的一种包装,返回render就是返回一个被包装的HttpResponse对象。
- HttpRequest对象由Django自动包装,HttpResponse则是由程序员手动包装。
HttpResponseRedirect()
是HttpResponse的一个子类,构造函数接受单个参数:重定向到的URL,类似Redirect,返回302状态码。