Ionstraimíocht bunachar sonraíLink to this heading

Chun cabhrú leat na ceisteanna a eisíonn do chód a thuiscint agus a rialú, soláthraíonn Django crúca chun feidhmeanna fillte a shuiteáil timpeall ar fhiosruithe bunachar sonraí a fhorghní Mar shampla, is féidir le fillteoirí ceisteanna a chomhaireamh, fad na fiosrúcháin a thomhas, ceisteanna logála, nó fiú cosc a chur ar fhorghníomhú ceisteanna (m.sh. chun a chinntiú nach n-eisítear aon cheisteanna agus teimpléad á rindreáil le sonraí réamhf

Déantar na fillteáin a mhúnlú tar éis: doc: middleware - is glaonna iad a ghlac</topics/http/middleware> ann glaoch eile mar cheann dá n-argóintí. Glaonn siad ar an glaoch sin chun an cheist bunachar sonraí (fillte b'fhéidir) a ghairm, agus is féidir leo an méid a theastaíonn uathu a dhéanamh timpeall an ghlao sin. Cruthaítear agus suiteáiltear iad, áfach, le cód úsáideora, agus mar sin ní theastaíonn monarcha ar leithligh uathu mar a dhéanann middleware.

Déantar fillteán a shuiteáil i mbainisteoir comhthéacs - mar sin tá na fillteáin sealadach agus go sonrach le sreabhadh éigin i do chód.

Mar a luadh thuas, is sampla de fhillteán ná blocaire forghníomhaithe fiosrúcháin. D'fhéadfadh cuma seo a bheith air:

Code
def blocker(*args):
    raise Exception("No database access allowed here.")

Agus úsáidfí é d'fhonn ceisteanna ón teimpléad a bhac mar sin:

Code
from django.db import connection
from django.shortcuts import render


def my_view(request):
    context = {...}  # Code to generate context with all data.
    template_name = ...
    with connection.execute_wrapper(blocker):
        return render(request, template_name, context)

Is iad na paraiméadair a sheoltar chuig na fillteáin ná:

  • ``fhorghníomhach` - glaoch, ar chóir a ghairm leis an gcuid eile de na paraiméadair d'fhonn an cheist a fhorghníomhú.

  • sql - str`, an ceist SQL atá le seoladh chuig an mbunachar sonraí.

  • params - liosta/tiúpla de luachanna paraiméadar don ordú SQL, nó liosta/tiúpla de liosta/tuples más é `executemany () ``an glao fillte.

  • `many ``- `bool a thugann le fios an bhfuil executar ()` nó executemany () ``an glao a ghairmtear sa deireadh ()` (agus cibé an bhfuiltear ag súil go mbeidh params` ina seicheamh luachanna, nó seicheamh seicheamh luachanna).

  • context -- foclóir le sonraí breise faoi chomhthéacs an t-ionghairm. Áirítear leis seo an nasc agus an cúrsóir.

Ag baint úsáide as na paraiméadair, d'fhéadfadh leagan beagán níos casta den bhlocóir ainm an nasc sa teachtaireacht earráide a áireamh:

Code
def blocker(execute, sql, params, many, context):
    alias = context["connection"].alias
    raise Exception("Access to database '{}' blocked here".format(alias))

Le haghaidh sampla níos iomláine, d'fhéadfadh cuma seo a bheith ar logálaí ceisteanna:

Code
import time


class QueryLogger:
    def __init__(self):
        self.queries = []

    def __call__(self, execute, sql, params, many, context):
        current_query = {"sql": sql, "params": params, "many": many}
        start = time.monotonic()
        try:
            result = execute(sql, params, many, context)
        except Exception as e:
            current_query["status"] = "error"
            current_query["exception"] = e
            raise
        else:
            current_query["status"] = "ok"
            return result
        finally:
            duration = time.monotonic() - start
            current_query["duration"] = duration
            self.queries.append(current_query)

Chun é seo a úsáid, chruthófá réad logger agus é a shuiteáil mar fhilleadh:

Code
from django.db import connection

ql = QueryLogger()
with connection.execute_wrapper(ql):
    do_queries()
# Now we can print the log.
print(ql.queries)

``nascach.execute_wrapper () ``Link to this heading

execute_wrapper(wrapper)Link to this definition

Filleann bainisteoir comhthéacs ar ais a shuiteálann, nuair a chuirtear isteach é, timpeall forghníomhaithe fiosrúcháin bunachar sonraí, agus nuair a bhíonn sé amach, baineann sé an fillteán Tá an fillteán suiteáilte ar an réad nasc snáithe áitiúil.

wrapper is a callable taking five arguments. It is called for every query execution in the scope of the context manager, with arguments execute, sql, params, many, and context as described above. It's expected to call execute(sql, params, many, context) and return the return value of that call.