Files
khatibi/admin_panel/apps.py
T
2026-10-10 14:21:04 +03:30

40 lines
2.0 KiB
Python

import sys
from django.apps import AppConfig
def make_std_streams_unicode_safe():
"""استریم‌های استاندارد را در برابر متن غیر-ASCII مقاوم می‌کند.
کنسول ویندوز با کدپیج cp1252 کار می‌کند و نوشتن متن فارسی روی آن
``UnicodeEncodeError`` می‌دهد (پیام خطا: ``'charmap' codec can't encode ...``).
رخداد واقعی که این تابع برایش نوشته شد: ``print`` متن فارسی داخل provider کنسولِ
پیامک استثنا می‌داد، worker آن را به‌عنوان «ارسال ناموفق» ثبت می‌کرد و پیامک در صف
``failed`` می‌ماند — در حالی که ارسال هیچ مشکلی نداشت. یک استثنای صرفاً نمایشی
نباید هرگز نتیجهٔ یک عملیات کسب‌وکار را عوض کند.
پس اینجا یک‌بار برای همیشه استریم‌ها به UTF-8 با ``errors='replace'`` تنظیم می‌شوند:
هیچ چاپ فارسی‌ای پروسه را نمی‌شکند و فایل‌های لاگ هم فارسی را درست نگه می‌دارند.
"""
for stream in (sys.stdout, sys.stderr):
reconfigure = getattr(stream, "reconfigure", None)
if reconfigure is None:
continue
try:
reconfigure(encoding="utf-8", errors="replace")
except Exception:
# جریان‌های جایگزین (مثلاً test runner یا jupyter) ممکن است پشتیبانی نکنند.
pass
class AdminPanelConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'admin_panel'
def ready(self):
# پیش از هر کامند/سیگنال: چاپ امن متن فارسی روی کنسول ویندوز.
make_std_streams_unicode_safe()
# ثبت سیگنال‌ها (busy_timeout برای SQLite).
from . import signals # noqa: F401