Nếu chúng tôi kiểm tra tài liệu cho toàn cầu ứng dụng flask, flask.g
, nó nói:
Để chia sẻ dữ liệu chỉ hợp lệ cho một yêu cầu từ hàm này sang hàm khác, biến toàn cục không đủ tốt vì nó sẽ bị hỏng trong môi trường phân luồng. Flask cung cấp cho bạn một đối tượng đặc biệt điều đó đảm bảo rằng nó chỉ hợp lệ cho yêu cầu đang hoạt động và điều đó sẽ trả về các giá trị khác nhau cho mỗi yêu cầu.
Điều này đạt được bằng cách sử dụng proxy luồng cục bộ (trong flask/globals.py
):
g = LocalProxy(partial(_lookup_app_object, 'g'))
Một điều khác mà chúng ta nên ghi nhớ là Python đang thực thi truyền đầu tiên của trình trang trí của chúng ta trong giai đoạn "biên dịch", bên ngoài bất kỳ yêu cầu nào hoặc flask
ứng dụng. Điều đó có nghĩa là key
đối số được gán giá trị là 'shop_{}_style'.format(g.city.id)
khi ứng dụng của bạn khởi động (khi lớp của bạn đang được phân tích cú pháp / trang trí), bên ngoài flask
ngữ cảnh yêu cầu.
Nhưng chúng tôi có thể dễ dàng trì hoãn việc truy cập vào flask.g
bằng cách sử dụng một proxy lười biếng, chỉ tìm nạp giá trị khi được sử dụng, thông qua hàm gọi lại. Hãy sử dụng cái đã được đóng gói với flask
, werkzeug.local.LocalProxy
:
from werkzeug.local import LocalProxy
class ShopAreaAndStyleListAPI(Resource):
@redis_hash_shop_style(key=LocalProxy(lambda: 'shop_{}_style'.format(g.city.id)))
def get(self):
# if not found from redis, query from mysql
pass
Nói chung (cho non-flask
hoặc không phải werkzeug
ứng dụng), chúng tôi có thể sử dụng một LazyProxy
tương tự từ ProxyTypes
gói hàng.
Không liên quan đến điều này, bạn cũng sẽ muốn sửa redis_hash_shop_style
của mình trình trang trí để không chỉ tìm nạp từ redis
, nhưng cũng để cập nhật (hoặc tạo) giá trị nếu cũ (hoặc không tồn tại), bằng cách gọi f()
được bọc khi thích hợp.