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ú.

When the client next requests the same resource, it might send along a header such as either If-Modified-Since or If-Unmodified-Since, containing the date of the last modification time it was sent, or either If-Match or If-None-Match, containing the last ETag it was sent. If the current version of the page matches the ETag sent by the client, or if the resource has not been modified, a 304 status code can be sent back, instead of a full response, telling the client that nothing has changed. Depending on the header, if the page has been modified or does not match the ETag sent by the client, a 412 status code (Precondition Failed) may be returned.

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.