4. render, redirect, HttpResponse, reverse

Render():

把模板和context结合在一起,返回一个带有这个组合的Http响应。

render(request, template_name, context=None, content_type=None, status=None, using=None)

  1. request,template_name必填;
  2. context:A dictionary of values
  3. content_type:The MIME type to use for the resulting document
  4. status:返回状态码,默认200
  5. using:The NAME of a template engine to use for loading the template.

多用于渲染模板并返回。

Redirect():

返回一个http响应重定向到一个合适的URL(参数to提供)。
redirect(to, permanent=False, *args, **kwargs)

to:

  1. 可以是一个model(会自动调用get_absolute_url())
  2. 也可以是一个view的函数(或者是一个url 的name),此时会调用reverse进行url逆向解析。
  3. 同时也可以是一个硬编码相对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)

  1. viewname:当然可以用view.name,但是官网不建议这样做,最好用在url pattern里面每一个url的name。
path('archive/', views.archive, name='news-archive')
# using the named URL
reverse('news-archive')
  1. args 和 kwargs 不能同时被传递。

  2. 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方法。

  1. 任何view方法都应该返回一个HttpResponse对象。
  2. render是对HttpResponse对象的一种包装,返回render就是返回一个被包装的HttpResponse对象。
  3. HttpRequest对象由Django自动包装,HttpResponse则是由程序员手动包装。

HttpResponseRedirect()

是HttpResponse的一个子类,构造函数接受单个参数:重定向到的URL,类似Redirect,返回302状态码。

你可能感兴趣的:(4. render, redirect, HttpResponse, reverse)