Redis
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> Redis

python flask cách truyền một tham số động cho trình trang trí

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.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. lấy chìa khóa đã chèn trong redis

  2. Lỗi 99 khi kết nối với localhost:6379. Không thể gán địa chỉ yêu cầu

  3. Redis và Memcached - 2021 So sánh

  4. django:redis:CommandError:Bạn chưa đặt ASGI_APPLICATION, cần thiết để chạy máy chủ

  5. Cách nhanh nhất để lưu trữ một mảng numpy trong redis