4. render, redirect, HttpResponse, reverse

weixin_33935777發表於2018-05-04

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狀態碼。

相關文章