پرش به محتویات

workerها و websocketها

مجوزها و قانون‌های یک شخص یک بار خوانده می‌شوند و روی شیء کاربر نگه داشته می‌شوند، همان‌طور که Django مجوزهای یک شخص را نگه می‌دارد - پس یک درخواست، هر چند فهرست که نشان دهد، تعداد ثابتی بار از پایگاه داده می‌پرسد.

درخواست تمام می‌شود، و شیء کاربر همراهش. پردازه‌ای که از یک درخواست بیشتر عمر می‌کند - یک worker در Celery، یک consumer در websocket، یک دستور مدیریتی طولانی - شیء کاربر را هر چقدر بخواهد نگه می‌دارد، و همراهش آنچه شخص موقع خوانده شدن داشت.

شخص را دوباره بخوانید

جایی که دسترسی ممکن است از آن موقع تغییر کرده باشد، درباره‌ی یک شیء کاربر تازه بپرسید:

user = User.objects.get(pk=user_id)
orders = Order.objects.visible_to(user)

یا آنچه نگه داشته شده را فراموش کنید، تا پرسش بعدی دوباره بخواندش:

from clearance.grants import forget_grants

forget_grants(user)

forget_grants مجوزهای نگه‌داشته‌ی کتابخانه و cacheهای مجوز خود Django را با هم فراموش می‌کند، پس has_perm هم دوباره می‌خواند.

کاری که به جای کسی اجرا می‌شود

کلید شخص را بفرستید، نه خود شخص را:

@shared_task
def export_orders(user_id):
    user = User.objects.get(pk=user_id)
    rows = Order.objects.visible_to(user)
    ...

کاری که یک ساعت پیش در صف گذاشته شده، با آنچه شخص الان دارد اجرا می‌شود - مجوزی که گرفته شده، برای آن کار هم گرفته شده است.