Jika kita memeriksa dokumen untuk aplikasi flask global, flask.g
, katanya:
Untuk berbagi data yang valid untuk satu permintaan hanya dari satu fungsi ke fungsi lainnya, variabel global tidak cukup baik karena akan rusak di lingkungan berulir. Flask memberi Anda objek khusus yang memastikannya hanya valid untuk permintaan aktif dan itu akan mengembalikan nilai yang berbeda untuk setiap permintaan.
Ini dicapai dengan menggunakan proxy thread-local (di flask/globals.py
):
g = LocalProxy(partial(_lookup_app_object, 'g'))
Hal lain yang harus kita ingat adalah bahwa Python mengeksekusi pass pertama dari dekorator kita selama fase "kompilasi", di luar permintaan apa pun, atau flask
aplikasi. Itu artinya key
argumen mendapatkan nilai 'shop_{}_style'.format(g.city.id)
ketika aplikasi Anda dimulai (ketika kelas Anda sedang diurai/dihias), di luar flask
konteks permintaan.
Tetapi kita dapat dengan mudah menunda akses ke flask.g
dengan menggunakan proxy malas, yang mengambil nilai hanya saat digunakan, melalui fungsi panggilan balik. Mari kita gunakan yang sudah dibundel dengan 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
Secara umum (untuk non-flask
atau non-werkzeug
apps), kita dapat menggunakan LazyProxy
yang serupa dari ProxyTypes
paket.
Tidak terkait dengan ini, Anda juga ingin memperbaiki redis_hash_shop_style
Anda dekorator untuk tidak hanya mengambil dari redis
, tetapi juga memperbarui (atau membuat) nilai jika basi (atau tidak ada), dengan memanggil f()
yang dibungkus bila perlu.