2016-08-04 24 views
1

Flask Web Development sagt:Flask Kontexten (Anwendung und Anforderung) vs lokalen Thread-Variablen

from flask import request 
@app.route('/') 
def index(): 
    user_agent = request.headers.get('User-Agent') 
    return '<p>Your browser is %s</p>' % user_agent 

Beachten Sie, wie in dieser Ansicht Funktion request verwendet wird, als ob es sich um eine globale Variable war. In Wirklichkeit request kann keine globale Variable sein, wenn Sie berücksichtigen, dass in einem Multithread-Server die Threads auf verschiedenen Anforderungen von verschiedenen Clients gleichzeitig arbeiten, so muss jeder Thread ein anderes Objekt in Anforderung sehen. Kontexte aktivieren Flask, um bestimmte Variablen für einen Thread global zugänglich zu machen, ohne die anderen Threads zu stören.

Verständlich, aber warum nicht einfach request ein thread-local variable machen? Unter der Haube, was genau ist request, und wie unterscheidet es sich von einer Thread-lokalen Variable?

Antwort

1

Dies war einfach eine Designentscheidung von Armin (der Autor von Flask). Du könntest Flask tatsächlich umschreiben, um als Thread-Local zu funktionieren, aber das war nicht das, was er hier tun wollte.

Die Idee von Flask (im Allgemeinen) ist es, die Dinge so einfach wie möglich zu halten, und viele Gedanken weg zu abstrahieren. Aus diesem Grund werden viele Flask-Helfer als "globale Variablen" implementiert: Sie müssen nicht wirklich über die Bedeutung dahinter nachdenken, denn jeder Global ist an die eingehende Anfrage gebunden.

+0

Ich habe gerade festgestellt, ich verstehe nicht, wie 'Sitzung' funktioniert, wenn es Thread-lokal ist, also fragte ich es als [separate Frage] (http://stackoverflow.com/questions/38818350/does-flask-session -variable-pflege-status-über-threads – max