Tôi đang thử nghiệm một ứng dụng Flask (Flask 0.9), và đặc biệt tôi có một phiên đấu giá mà tôi muốn chạy theo cách được ghi thành tài liệu, giống như thế này (như tôi hiểu nó):Đơn vị kiểm tra phiên Flask - không thể tạo lại lỗi với session_transaction
from flask import Flask, session
app = Flask(__name__)
@app.route('/', methods=['POST'])
def m():
logging.error(session) # expect {'x': 1}
return ""
with app.test_request_context() as trc:
with app.test_client() as c:
with c.session_transaction() as sess:
sess['x'] = 1
c.post()
này hoạt động như mong đợi, với sản lượng là một cái gì đó như thế này:
ERROR:root:<SecureCookieSession {'x': 1}>
Đáng tiếc là tôi đang gặp phải một kết quả bất ngờ nơi dữ liệu phiên không được thiết lập trong các thiết bị đầu cuối chức năng, tức là đầu ra là một cái gì đó như thế này:
ERROR:root:<SecureCookieSession {}>
Sự cố này chỉ hiển thị khi chạy từ khung kiểm tra đơn vị của tôi. Khi nó đứng, tôi không thể tái tạo vấn đề này với một trường hợp thoái hóa, mặc dù tôi đã thực hiện một nỗ lực khá đáng kể with a gist of some of this effort here. Các điểm nổi bật là tôi đã bao gồm itsdangerous
và Google App Engine testbed
, hy vọng có thể một trong số đó là nguyên nhân.
Trên hệ thống của riêng tôi, tôi đã đi xa hơn gist và gần như hoàn toàn nhân rộng khung thử nghiệm đơn vị của tôi đang cố gắng cách ly này. Tương tự như vậy, tôi đã xóa số lượng ngày càng tăng của mã có liên quan khỏi khuôn khổ thử nghiệm của mình. Đến mức này, tôi không thể nghĩ ra sự khác biệt giữa trường hợp thoái hóa và khuôn khổ bị loại bỏ của tôi có thể ảnh hưởng đến kết quả. Tôi đã vượt qua cuộc gọi c.post()
trong pdb để thử eek ra nguyên nhân của sự ác tính này, nhưng vẫn chưa thu thập bất kỳ thông tin chi tiết hữu ích nào.
Tất cả điều để nói, tôi sẽ biết ơn về một hướng hoặc gợi ý nhỏ về vấn đề có thể xảy ra. Điều gì có thể ảnh hưởng đến bối cảnh Werkzeug theo cách mà session_transaction
không được tôn trọng?
Tôi biết đã một năm rồi, nhưng bản thân tôi cũng gặp phải vấn đề này. Bạn đã bao giờ có thể hình dung ra điều này? Theo những gì tôi đã đọc trực tuyến và trong tài liệu, điều này sẽ hoạt động hoàn hảo. Nhưng nó không. –
@IanHunter Hãy xem câu trả lời của tôi, bên dưới. Nó sẽ giúp. –