ในฐานะที่เป็นภาคผนวกของข้อมูลในหัวข้อนี้: ฉันรู้สึกสับสนเล็กน้อยจากพฤติกรรมของflask.g
เช่นกัน แต่การทดสอบอย่างรวดเร็วบางอย่างได้ช่วยให้ฉันชี้แจง นี่คือสิ่งที่ฉันได้ลอง:
from flask import Flask, g
app = Flask(__name__)
with app.app_context():
print('in app context, before first request context')
print('setting g.foo to abc')
g.foo = 'abc'
print('g.foo should be abc, is: {0}'.format(g.foo))
with app.test_request_context():
print('in first request context')
print('g.foo should be abc, is: {0}'.format(g.foo))
print('setting g.foo to xyz')
g.foo = 'xyz'
print('g.foo should be xyz, is: {0}'.format(g.foo))
print('in app context, after first request context')
print('g.foo should be abc, is: {0}'.format(g.foo))
with app.test_request_context():
print('in second request context')
print('g.foo should be abc, is: {0}'.format(g.foo))
print('setting g.foo to pqr')
g.foo = 'pqr'
print('g.foo should be pqr, is: {0}'.format(g.foo))
print('in app context, after second request context')
print('g.foo should be abc, is: {0}'.format(g.foo))
และนี่คือผลลัพธ์ที่ได้จาก:
in app context, before first request context
setting g.foo to abc
g.foo should be abc, is: abc
in first request context
g.foo should be abc, is: abc
setting g.foo to xyz
g.foo should be xyz, is: xyz
in app context, after first request context
g.foo should be abc, is: xyz
in second request context
g.foo should be abc, is: xyz
setting g.foo to pqr
g.foo should be pqr, is: pqr
in app context, after second request context
g.foo should be abc, is: pqr
ดังที่ YKKman กล่าวไว้ข้างต้นว่า "ทุกคำขอจะมีบริบทของแอปพลิเคชันใหม่" และอย่างที่ Flask docs กล่าวว่าบริบทของแอปพลิเคชัน "จะไม่ถูกแชร์ระหว่างคำขอ" ตอนนี้สิ่งที่ยังไม่ได้รับการระบุไว้อย่างชัดเจน (แม้ว่าฉันคิดว่ามันเป็นนัยจากงบเหล่านี้) และสิ่งที่แสดงให้เห็นว่าการทดสอบอย่างชัดเจนของฉันคือคุณควรไม่ชัดเจนสร้างบริบทการร้องขอหลายซ้อนอยู่ภายในบริบทของโปรแกรมประยุกต์หนึ่งเพราะflask.g
(และร่วม) doesn' ไม่มีเวทย์มนตร์ใด ๆ ที่มันทำหน้าที่ใน "ระดับ" สองบริบทที่แตกต่างกันโดยมีสถานะแตกต่างกันอย่างอิสระที่ระดับแอปพลิเคชันและคำขอ
ความจริงก็คือ "บริบทการประยุกต์ใช้" อาจค่อนข้างชื่อที่ทำให้เข้าใจผิดเพราะapp.app_context()
เป็นบริบทต่อคำขอตรงเช่นเดียวกับ"บริบทคำขอ" คิดว่ามันเป็น "request context lite" จำเป็นเฉพาะในกรณีที่คุณต้องการตัวแปรบางตัวที่โดยปกติต้องใช้บริบทการร้องขอ แต่คุณไม่จำเป็นต้องเข้าถึงวัตถุคำขอใด ๆ (เช่นเมื่อเรียกใช้การดำเนินการ DB แบตช์ใน เชลล์สคริปต์) หากคุณลองและขยายบริบทแอปพลิเคชันเพื่อรวมบริบทคำขอมากกว่าหนึ่งรายการคุณกำลังถามถึงปัญหา ดังนั้นแทนที่จะทดสอบของฉันข้างต้นคุณควรเขียนโค้ดเช่นนี้ด้วยบริบทของ Flask:
from flask import Flask, g
app = Flask(__name__)
with app.app_context():
print('in app context, before first request context')
print('setting g.foo to abc')
g.foo = 'abc'
print('g.foo should be abc, is: {0}'.format(g.foo))
with app.test_request_context():
print('in first request context')
print('g.foo should be None, is: {0}'.format(g.get('foo')))
print('setting g.foo to xyz')
g.foo = 'xyz'
print('g.foo should be xyz, is: {0}'.format(g.foo))
with app.test_request_context():
print('in second request context')
print('g.foo should be None, is: {0}'.format(g.get('foo')))
print('setting g.foo to pqr')
g.foo = 'pqr'
print('g.foo should be pqr, is: {0}'.format(g.foo))
ซึ่งจะให้ผลลัพธ์ที่คาดหวัง:
in app context, before first request context
setting g.foo to abc
g.foo should be abc, is: abc
in first request context
g.foo should be None, is: None
setting g.foo to xyz
g.foo should be xyz, is: xyz
in second request context
g.foo should be None, is: None
setting g.foo to pqr
g.foo should be pqr, is: pqr
g
ใน 0.10 มิฉะนั้นดูเหมือนว่ารหัสจำนวนมากอาจเริ่มพัฒนาข้อบกพร่องที่คดเคี้ยว