Próiseáil Amharc CoinníollLink to this heading

Is féidir le cliaint HTTP roinnt ceanntásca a sheoladh chun insint don fhreastalaí faoi chóipeanna d'acmhainn a chonaic siad cheana féin. Úsáidtear é seo go coitianta agus leathanach gréasáin á aisghabháil (ag baint úsáide as iarratas HTTP GET ``) chun na sonraí go léir a sheachaint le haghaidh rud atá aisghabháilte an cliant cheana féin. Mar sin féin, is féidir na ceanntásca céanna a úsáid le haghaidh gach modh HTTP (`POST ``, `PUT, DELETE`, srl.).

I gcás gach leathanach (freagra) a sheolann Django ar ais ó radharc, d'fhéadfadh sé dhá cheannteideal HTTP a sholáthar: an ceannteideal Etag agus an ceannteideal `Last-Modified. Tá na ceanntásca seo roghnach ar fhreagairtí HTTP. Is féidir iad a shocrú le d'fheidhm amharc, nó is féidir leat brath ar an: class: ~django.middleware.http.ConditionalGetMiddleware middleware chun an ceannteideal Etag a shocrú.

<9110 #section -13.1.1> <9110 #section -13.1.2>Nuair a iarrann an cliant an acmhainn chéanna eile, féadfaidh sé ceannteideal a sheoladh ar nós: rfc: If-Modified-Since nó: rfc: If-<9110 #section -13.1.3> Unmodified-Since, ina bhfuil <9110 #section -13.1.4> dáta an t-am modhnaithe deireanach a seoladh é, nó fiú:rfc: If-Match nó:rfc: If-None-Match, ina raibh an Etag` deireanach seoladh. Má mheaitseálann an leagan reatha den leathanach leis an Etag ``a sheol an cliant, nó mura modhnaíodh an acmhainn, is féidir cód stádais 304 a sheoladh ar ais, in ionad freagra iomlán, ag insint don chliant nach bhfuil aon rud athraithe. Ag brath ar an gceanntásc, má tá an leathanach modhnaithe nó mura bhfuil an leathanach comhoiriúnach leis an `Etag` a sheol an cliant, féadfar cód stádais 412 (Réamhchoinníoll Theip) a thabhairt ar ais.

Nuair a theastaíonn rialú níos mionghráite uait féadfaidh tú feidhmeanna próiseála coinníollach in aghaidh amharc a úsáid.

An maisitheoir coinníollLink to this heading

Uaireanta (i ndáiríre, go minic) is féidir leat feidhmeanna a chruthú chun an luach: rfc: EtaG <9110 #section -8.8.3> nó an t-am deireanach modhnaithe d'acmhainn a ríomh go tapa, **gan gá duit na ríomhanna go léir a theastaíonn chun an radharc iomlán a thógáil. Is féidir le Django na feidhmeanna seo a úsáid ansin chun rogha “fóirithint luath” a sholáthar don phróiseáil amharc. Ag rá leis an gcliant nár modhnaíodh an t-ábhar ón iarratas deireanach, b'fhéidir.

Cuirtear an dá fheidhm seo ar aghaidh mar pharaiméadair chuig an maisitheoir ``django.views.decorators.http.condition`. Úsáideann an maisitheoir seo an dá fheidhm (ní gá duit ach ceann amháin a sholáthar, mura féidir leat an dá chainníocht a ríomh go héasca agus go tapa) chun oibriú amach má mheaitseálann na ceannteidil san iarratas HTTP iad siúd ar an acmhainn. Mura n-oireann siad, caithfear cóip nua den acmhainn a ríomh agus glaoch ar do ghnáthradharc.

Tá cuma seo ar shíniú an maisitheora coinníoll:

Code
condition(etag_func=None, last_modified_func=None)

Cuirfear an dá fheidhm, chun an eTag agus an t-am modhnaithe deireanach a ríomh, ar an réad iarraidh` atá ag teacht isteach agus na paraiméadair chéanna, san ord céanna, mar an fheidhm amharc atá á gcabhrú leo a fhilleadh. Ba chóir don fheidhm a rith ``last_modified_func luach caighdeánach dáta-ama a thabhairt ar ais ag sonrú an uair dheireanach a mhodhnaíodh an acmhainn, nó None mura bhfuil an acmhainn ann. <9110 #section -8.8.3>Ba chóir don fheidhm a chuirtear chuig an maisitheoir etag sreang a thabhairt ar ais a léiríonn na:rfc: Etag don acmhainn, nó ``None ``mura bhfuil sé ann.

Socraíonn an maisitheoir na ceannteidil Etag agus Last-Modified ar an bhfreagra mura bhfuil siad socraithe ag an dearcadh cheana féin agus má tá modh an iarratais sábháilte (GET` nó HEAD`).

Is dócha gur fearr a mhíniú le sampla an ghné seo a úsáid go húsáideach. Cuir i gcás go bhfuil an péire samhlacha seo agat, a léiríonn córas blag beag:

Code
import datetime
from django.db import models


class Blog(models.Model): ...


class Entry(models.Model):
    blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
    published = models.DateTimeField(default=datetime.datetime.now)
    ...

Mura n-athraíonn an leathanach tosaigh, ag taispeáint na hiontrálacha blag is déanaí, ach nuair a chuireann tú iontráil nua blag leis, is féidir leat an t-am deireanach modhnaithe a ríomh go han-tapa. Teastaíonn an dáta ``foilsithe ``is déanaí uait do gach iontráil a bhaineann leis an bhlag sin. Bealach amháin chun é seo a dhéanamh ná:

Code
def latest_entry(request, blog_id):
    return Entry.objects.filter(blog=blog_id).latest("published").published

Is féidir leat an fheidhm seo a úsáid ansin chun leathanach gan athrú a bhrath go luath do d'amharc leathanaigh tosaigh:

Code
from django.views.decorators.http import condition


@condition(last_modified_func=latest_entry)
def front_page(request, blog_id): ...

Aicearraí chun luach amháin a ríomhLink to this heading

Mar riail ghinearálta, más féidir leat feidhmeanna a sholáthar chun * an eTag agus an t-am deireanach modhnaithe a ríomh, ba cheart duit é sin a dhéanamh. Níl a fhios agat cé na ceanntásca a sheolfaidh aon chliant HTTP ar leith chugat, mar sin bí réidh chun an dá rud a láimhseáil. Mar sin féin, uaireanta ní furasta ach luach amháin a ríomh agus soláthraíonn Django maisiúcháin nach ndéanann ach eTag nó ríomhanna modhnaithe deiridh amháin.

Rinne na maisitheoirí django.views.decorators.http.etag agus django.views.decorators.http.last_modified an cineál céanna feidhmeanna leis an maisitheoir ``condition`. Is iad seo a gcuid sínithe:

Code
etag(etag_func)
last_modified(last_modified_func)

D'fhéadfaimis an sampla níos luaithe a scríobh, nach n-úsáideann ach feidhm modhnaithe deireanach, ag baint úsáide as ceann de na maisitheoirí seo:

Code
@last_modified(latest_entry)
def front_page(request, blog_id): ...

... nó:

Code
def front_page(request, blog_id): ...


front_page = last_modified(latest_entry)(front_page)

Úsáid coinníoll agus an dá choinníoll á thástáilLink to this heading

D'fhéadfadh go mbeadh cuma níos deise ag daoine áirithe triail a bhaint as na maisitheoirí etag agus last_modified a shlánú más mian leat an dá réamhchoinníoll a thástáil. Mar sin féin, bheadh iompar mícheart mar thoradh air seo.

Code
# Bad code. Don't do this!
@etag(etag_func)
@last_modified(last_modified_func)
def my_view(request): ...


# End of bad code.

Níl a fhios ag an gcéad maisitheoir aon rud faoin dara ceann agus d'fhéadfadh sé freagra a thabhairt nach ndéantar an freagra a mhodhnú fiú má chinnfeadh an dara maisitheoirí a mhalairt. Úsáideann an maisitheoir coinníoll an dá fheidhm aisghlaonna ag an am céanna chun an gníomh ceart atá le déanamh a oibriú amach.

Ag baint úsáide as na maisitheoirí le modhanna HTTP eileLink to this heading

Tá an maisitheoir coinníoll úsáideach le haghaidh níos mó ná iarratais GET agus HEAD` amháin (tá iarratais HEAD mar an gcéanna le GET sa chás seo). Is féidir é a úsáid freisin chun seiceáil a sholáthar d'iarratais POST ``, `PUT agus DELETE. Sna cásanna seo, ní é an smaoineamh freagra “neamh-mhodhnaithe” a thabhairt ar ais, ach a rá don chliant gur athraíodh an acmhainn atá siad ag iarraidh a athrú idir an dá linn.

Mar shampla, smaoinigh ar an malartú seo a leanas idir an cliant agus an freastalaí:

  1. Iarratann cliant /foo/.

  2. Freagraíonn freastalaí le ábhar áirithe le ETag de ``"abcd1234"`.

  3. Seolann cliant iarratas HTTP PUT chuig /foo/ chun an acmhainn a nuashonrú. Seolann sé ceanntásc ``If-Match: “abcd1234" ``freisin chun an leagan atá á iarraidh a nuashonrú a shonrú.

  4. Seiceálann freastalaí chun a fháil amach an bhfuil an acmhainn athraithe, tríd an eTag a ríomh ar an mbealach céanna a dhéanann sé d'iarratas ``GET ``(ag baint úsáide as an bhfeidhm chéanna). Má athraíodh an acmhainne**, cuirfidh sé cód stádais 412 ar ais, rud a chiallaíonn “theip ar réamhchoinníoll”.

  5. Seolann an cliant iarratas GET ``chuig `/foo/, tar éis freagra 412 a fháil, leagan nuashonraithe den ábhar a aisghabháil sula ndéantar é a nuashonrú.

Is é an rud tábhachtach a thaispeánann an sampla seo ná gur féidir na feidhmeanna céanna a úsáid chun luachanna eTag agus modhnú deireanacha a ríomh i ngach cás. Déanta na fírinne, ba cheart duit** na feidhmeanna céanna a úsáid, ionas go gcuirfear na luachanna céanna ar ais gach uair.

Comparáid le próiseáil choinníollach middlewareLink to this heading

Soláthraíonn Django láimhseáil coinníollach GET via: class: django.middleware.http.conditionalGetMiddleware. Cé go bhfuil sé oiriúnach do go leor cásanna, tá teorainneacha ag an middleware maidir le hardúsáid:

  • Cuirtear i bhfeidhm go domhanda ar gach tuairim i do thionscadal.

  • Ní shábhálann sé tú ón bhfreagra a ghiniúint, rud a d'fhéadfadh a bheith daor.

  • Níl sé oiriúnach ach le haghaidh iarratais HTTP GET.

Ba chóir duit an uirlis is oiriúnaí a roghnú do d'fhadhb ar leith anseo. Má tá bealach agat chun eTags agus amanna modhnaithe a ríomh go tapa agus má thógann dearcadh éigin tamall an t-ábhar a ghiniúint, ba cheart duit smaoineamh ar an maisitheoir coinníoll a thuairiscítear sa doiciméad seo a úsáid. Má ritheann gach rud go gasta cheana féin, cloí leis an meán-earraí a úsáid agus laghdófar méid tráchta líonra a sheoltar ar ais chuig na cliaint fós mura bhfuil an dearcadh athraithe.