Question

Dans mod_wsgi j'envoyer les en-têtes en exécutant la fonction start_response (), mais tout le contenu de la page est transmise par le rendement / rendement. Y at-il un moyen de transmettre le contenu de la page de la même manière que start_response ()? Utilisation de l'instruction return.yield est très restrictive en matière de travail avec les données chunked.

par exemple.

def Application():

    b = buffer()

    [... page code ...]

    while True:
        out = b.flush()    
        if out:
            yield out

class buffer:

    def __init__(self):        
        b = ['']
        l = 0

    def add(self, s):
        s = str(s)
        l += len(s)
        b.append(s)

    def flush(self):

        if self.l > 1000:
            out = ''.join(b)
            self.__init__()
            return out

Je veux avoir la mémoire tampon en sortie le contenu que la page se charge, mais seulement le contenu des sorties une fois qu'il ne soit suffisamment empilé (par exemple dans ce. 1000 octets).

Était-ce utile?

La solution

Non; Mais je ne pense pas que ce soit restrictive. Peut-être que vous voulez coller un exemple de code où vous décrivez votre restriction et nous pouvons vous aider.

Pour travailler avec des données de morceau que vous venez yield les morceaux:

def application(environ, start_response):
    start_response('200 OK', [('Content-type', 'text/plain')]
    yield 'Chunk 1\n'    
    yield 'Chunk 2\n'    
    yield 'Chunk 3\n'
    for chunk in chunk_data_generator():
        yield chunk

def chunk_data_generator()
    yield 'Chunk 4\n'
    yield 'Chunk 5\n'

EDIT : D'après les commentaires que vous avez données, un exemple d'empiler des données jusqu'à une certaine longueur avant de l'envoyer vers l'avant:

BUFFER_SIZE = 10 # 10 bytes for testing. Use something bigger
def application(environ, start_response):
    start_response('200 OK', [('Content-type', 'text/plain')]
    buffer = []
    size = 0
    for chunk in chunk_generator():
        buffer.append(chunk)
        size += len(chunk)
        if size > BUFFER_SIZE:
            for buf in buffer:
                yield buf
            buffer = []
            size = 0

def chunk_data_generator()
    yield 'Chunk 1\n'    
    yield 'Chunk 2\n'    
    yield 'Chunk 3\n'
    yield 'Chunk 4\n'
    yield 'Chunk 5\n'

Autres conseils

Il est possible pour votre application aux données "push" sur le serveur WSGI:

  

Certaines API cadres d'application existants prennent en charge la production unbuffered d'une manière différente de celle WSGI. Plus précisément, ils assurent une fonction « d'écriture » ou une méthode quelconque pour écrire un bloc de données non tamponnée, ou bien ils fournissent une fonction tampon « d'écriture » et un mécanisme de « chasse d'eau » pour vider le tampon.

     

Malheureusement, ces API ne peuvent pas être mises en œuvre en termes de valeur de retour de l'application « itérables » de WSGI, à moins que les discussions ou d'autres mécanismes spéciaux sont utilisés.

     

Par conséquent, pour permettre à ces cadres de continuer à utiliser une API impératif, WSGI comprend un write() spécial appelable, retourné par la start_response appelable.

     

De nouvelles applications et les cadres WSGI ne devrait pas : utilisez la write() appelable s'il est possible d'éviter de le faire.

     

http://www.python.org/ dev / EPEP / pep-0333 / # callable-écriture

Mais il est pas recommandé.

  

D'une manière générale, les applications obtenir le meilleur débit en tamponnant leur (taille modeste) la production et de l'envoyer à la fois. Ceci est une approche commune dans les cadres existants tels que Zope:. La sortie est mise en tampon dans un StringIO ou un objet similaire, puis transmis à la fois, ainsi que les en-têtes de réponse

     

L'approche correspondante est WSGI pour l'application de retourner simplement un seul élément iterable (par exemple une liste) contenant le corps de la réponse en une seule chaîne. Telle est l'approche recommandée pour la grande majorité des fonctions d'application, qui rendent les pages HTML dont le texte se glisse facilement dans la mémoire.

     

http://www.python.org/ dev / EPEP / pep-0333 / # tampon et streaming

Si vous ne voulez pas changer votre application WSGI lui-même pour tampon partiellement les données de réponse avant de l'envoyer, puis mettre en œuvre un middleware WSGI qui enveloppe votre application WSGI et qui effectue cette tâche.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top