Vra

Op die oomblik het ek 'n mod_wsgi script wat so gestruktureer is..

def application(environ, start_response):
    status = '200 OK'
    output = 'Hello World!'

    response_headers = [('Content-type', 'text/plain'),
                    ('Content-Length', str(len(output)))]
    start_response(status, response_headers)

    return [output]

Ek het gewonder of iemand weet van 'n manier om dit te verander om op 'n te werk yield basis in plaas van return, op hierdie manier kan ek die bladsy stuur soos dit gegenereer word en nie net sodra dit voltooi is nie, sodat die bladsy laai vinniger vir die gebruiker kan gaan.

Wanneer ek egter die uitvoer vir 'n lys ruil en dit in die toepassing (), gooi dit 'n fout:

TypeError: sequence of string values expected, value of type list found
Was dit nuttig?

Oplossing

def application(environ, start_response):
    status = '200 OK'
    output = 'Hello World!'

    response_headers = [('Content-type', 'text/plain'),
                    ('Content-Length', str(len(output)))]
    start_response(status, response_headers)

    yield output
  

"Maar wanneer ek ruil die uitset vir 'n lys en gee dit in die aansoek (), dit gooi 'n fout:"

Wel, moenie die lys oplewer. Lewer elke element in plaas:

for part in mylist:
    yield part

of as die lys is die hele inhoud, net:

return mylist

As gevolg van die lys is reeds 'n iterator en kan oplewer op sigself.

Ander wenke

Let daarop dat 'opbrengs' vermy moet word tensy dit absoluut noodsaaklik is.Veral 'opbrengs' sal ondoeltreffend wees as dit baie klein stringe lewer.Dit is omdat die WSGI-spesifikasie vereis dat na elke string wat opgelewer is, die reaksie gespoel moet word.Vir Apache/mod_wsgi beteken spoel dat elke tou deur die Apache-uitsetemmerbrigade en filterstelsel en op die sok gedwing word.Om die oorhoofse koste van die Apache-uitsetfilterstelsel te ignoreer, om baie klein stringe op 'n sok te skryf, is eenvoudig net sleg om mee te begin.

Hierdie probleem bestaan ​​ook waar 'n reeks stringe van 'n toepassing teruggestuur word, aangesien 'n spoel ook tussen elke string in die skikking uitgevoer moet word.Dit is omdat die string as 'n herhaalbare en nie 'n lys hanteer word nie.Dus vir 'n vooraf gevormde lys stringe, is dit baie beter om die individuele stringe in een groot string te voeg en 'n lys terug te gee wat net daardie een string bevat.Deur dit te doen, kan 'n WSGI-implementering ook outomaties 'n inhoudslengte vir die reaksie genereer as een nie uitdruklik verskaf is nie.

Maak net seker dat wanneer al die stringe in 'n lys in een saamgevoeg word, die resultaat in 'n lys teruggestuur word.As dit nie gedoen word nie en in plaas daarvan word die string teruggestuur, word daardie string as 'n herhaalbare behandel, waar elke element in die string 'n enkele karakterstring is.Dit lei daartoe dat 'n spoel na elke karakter gedoen word, wat selfs erger gaan wees as as die snare nie saamgevoeg is nie.

Moenie stuur die inhoud lengte en stuur die uitset as jy dit af te lei. Jy hoef nie na die grootte van die uitset weet indien jy dit eenvoudig doen nie stuur die inhoud-lengte kop. Op dié manier kan deel van die reaksie te stuur voordat jy die res van dit bereken.

def application(environ, start_response):
    status = '200 OK'
    output = 'Hello World!'

    response_headers = [('Content-type', 'text/html')]
    start_response(status, response_headers)

    yield head()
    yield part1()
    yield part2()
    yield part3()
    yield "<!-- bye now! -->"

Anders sal jy geen voordeel kry uit die stuur in stukke, aangesien die berekening van die produksie is waarskynlik die stadige deel en die internet protokol sal die uitset in stukke in elk geval te stuur.

Ongelukkig is dit nie werk nie in die geval waar, byvoorbeeld, die berekening van part2 () besluit wat jy regtig nodig het om 'n kop (soos 'n koekie) te verander of moet ander bladsy-globale datastrukture te bou - as dit ooit gebeur, moet jy die hele produksie te bereken voordat stuur die kop, en kan net so goed gebruik 'n return [output]

Byvoorbeeld http://aaron.oirt.rutgers.edu/myapp/ docs / W1200_1200.config_template Moet 'n bladsy globale data struktuur te bou vir die skakels na onderafdelings dat show by die top van die bladsy - so die laaste subartikel moet gelewer voor die eerste stuk van uitset word aan die kliënt.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top