Bu sayfa masaüstü istemcinin sunucu API'sine nasıl ulaştığını açıklar. src/cluster_erp/desktop/ altındaki core/api_client.py (ApiClient ve hata sınıfları), core/api_worker.py (ApiWorker, ApiMixin, format_api_error), core/generic_api.py (GenericApi) ve core/core_api.py (not, ek ve e-posta sarmalayıcıları) dosyalarını kapsar. Değişikliklerin yaydığı sinyaller sinyal veri yolu ve watch_entity sayfasında açıklanır.
Kısaca¶
- Tek bir
ApiClient, 30 saniyelik zaman aşımı, bir temel adres ve birAccept-Languagebaşlığı olan tek birhttpx.Clientsarar (src/cluster_erp/desktop/core/api_client.py:80-96). - Ekranlar çağrıları
ApiMixin.call_apiüzerinden birQThreadolanApiWorkeriçinde yürütür. Sonuçlar ve hatalar Qt sinyalleri olarak döner (src/cluster_erp/desktop/core/api_worker.py:28-65,src/cluster_erp/desktop/core/api_worker.py:187-259). - Bir
entitytanımlayıcısıyla çağrılan değişiklik, sunucu yanıt verdikten sonra bir değişiklik sinyali yayar (src/cluster_erp/desktop/core/api_client.py:223-294). - HTTP hataları türlü istisnalara dönüşür ve
format_api_errorbunları kullanıcının dilinde bir iletiye çevirir (src/cluster_erp/desktop/core/api_client.py:55-77,src/cluster_erp/desktop/core/api_worker.py:108-176). GenericApiher varlık yolunu metadata'daki uç bildirimlerinden kurar (src/cluster_erp/desktop/core/generic_api.py:24-31).
Nasıl çalışır¶
API istemcisi¶
ApiClient.__init__, httpx.Client nesnesini temel adresle, 30 saniyelik zaman aşımıyla, yönlendirmeleri izleyecek biçimde ve Accept-Language değeri en olarak oluşturur (src/cluster_erp/desktop/core/api_client.py:81-91). Ardından main() çevirmenin dilini ayarlar ve her dil değişikliği başlığı günceller (src/cluster_erp/desktop/main.py:169-172, src/cluster_erp/desktop/core/api_client.py:110-112). set_base_url, httpx.Client nesnesini değiştirir ve başlıklarını korur (src/cluster_erp/desktop/core/api_client.py:98-108).
login, kullanıcı adını ve parolayı /auth/login ucuna gönderir. Başarı durumunda erişim belirtecini, yenileme belirtecini, kullanıcıyı ve izin listesini bellekte tutar ve erişim belirtecini sonraki her isteğe ekler (src/cluster_erp/desktop/core/api_client.py:134-163). Belirteçler ayar deposuna yazılmaz: istemcinin yazdığı ayar anahtarlarının tamamı diller, temalar ve erişilebilirlik sayfasında listelenir. logout dördünü de bellekte temizler (src/cluster_erp/desktop/core/api_client.py:165-171). Sunucudaki belirteç işleme kimlik doğrulama ve oturumlar sayfasında açıklanır.
_request tek bir istek gönderir. Yanıt 401 olduğunda _try_refresh_token işlevini bir kez çağırır ve yenileme başarılıysa isteği bir kez yineler (src/cluster_erp/desktop/core/api_client.py:335-349). Başarısız bir yenileme belirteçleri temizler ve sinyal veri yolunda session_expired yayar (src/cluster_erp/desktop/core/api_client.py:173-211). 204 yanıtı None döndürür; diğer her başarı ayrıştırılmış JSON döndürür (src/cluster_erp/desktop/core/api_client.py:350-353). download aynı yenileme kuralını izler ve baytları, içerik türünü ve dosya adını döndürür (src/cluster_erp/desktop/core/api_client.py:296-324).
ApiClient içindeki kilit tüm gidiş-dönüş boyunca değil, yalnızca geçerli httpx.Client okunurken ve bir belirteç yenilemesi sırasında tutulur. Yorum, aksi halde yavaş bir arka plan isteğinin GUI iş parçacığından gelen çağrıları donduracağını belirtir (src/cluster_erp/desktop/core/api_client.py:336-341).
Hata sınıfları¶
_parse_error_response durum kodunu bir istisna sınıfına eşler ve sunucunun hata gövdesini okur. error nesnesi olan bir gövde message, code, trace_id ve details alanlarını doldurur; başka bir gövde yalnızca detail alanından iletiyi doldurur (src/cluster_erp/desktop/core/api_client.py:64-77). Bir aktarım hatası durum 0 ve CONNECTION_ERROR koduyla ApiError fırlatır (src/cluster_erp/desktop/core/api_client.py:359-364).
| Durum | İstisna | Kaynak |
|---|---|---|
| 401 | AuthenticationError |
src/cluster_erp/desktop/core/api_client.py:56 |
| 403 | ForbiddenError |
src/cluster_erp/desktop/core/api_client.py:57 |
| 404 | NotFoundError |
src/cluster_erp/desktop/core/api_client.py:58 |
| 409 | ConflictError |
src/cluster_erp/desktop/core/api_client.py:59 |
| 422 | ValidationError |
src/cluster_erp/desktop/core/api_client.py:60 |
| diğer her hata durumu | ServerError |
src/cluster_erp/desktop/core/api_client.py:65 |
| HTTP yanıtı yok | CONNECTION_ERROR kodlu ApiError |
src/cluster_erp/desktop/core/api_client.py:359-364 |
Sunucunun hata kodları hatalar ve istisnalar sayfasında listelenir.
Çalışan iş parçacığı modeli¶
Diyagram, ApiMixin karıştıran bir ekrandan yapılan tek bir çağrıyı gösterir.
sequenceDiagram participant V as ApiMixin içeren ekran participant W as ApiWorker QThread participant A as ApiClient participant S as Sunucu V->>W: call_api(func, args, on_success, on_error) V->>W: start W->>A: func(args) A->>S: HTTP isteği S-->>A: yanıt A-->>W: sonuç veya ApiError W-->>V: finished(result) veya error(msg, status, code, details, trace_id) V->>V: canlılık denetimi, sonra on_success veya on_error veya bildirim V->>V: çalışanı listeden çıkar
Sözcüklerle:
call_api, işlev ve bağımsız değişkenleriyle birApiWorkeroluşturur, geri çağrıları bağlar, çalışanı ekranın listesine ekler ve başlatır (src/cluster_erp/desktop/core/api_worker.py:187-259).ApiWorker.runişlevi çalışan iş parçacığında çağırır. Sonuçlafinishedya da ileti, durum, kod, ayrıntılar ve iz kimliğiyleerroryayar (src/cluster_erp/desktop/core/api_worker.py:43-65).- Her geri çağrı önce ekranın Qt nesnesinin hâlâ var olduğunu denetler. Yorum, aksi halde kapatılmış bir sekmenin silinmiş nesne hatası vereceğini belirtir (
src/cluster_erp/desktop/core/api_worker.py:197-209). - Hata durumunda
format_api_erroryerelleştirilmiş bir ileti kurar. Ekranon_errorvermediyse ileti bir hata bildirimi olarak görünür (src/cluster_erp/desktop/core/api_worker.py:219-249). - Ekran yok edildiğinde
_stop_all_workersçalışan her çalışan için en çok 5.000 ms bekler ve hiçbirini zorla sonlandırmaz (src/cluster_erp/desktop/core/api_worker.py:25,src/cluster_erp/desktop/core/api_worker.py:265-289).
src/cluster_erp/desktop/ altında otuz üç sınıf ApiMixin karıştırır; sayı, ApiMixin adını taşıyan sınıf tanımları aranarak çıkarıldı. İki yer ApiWorker nesnesini doğrudan oluşturur: giriş iletişim kutusu ve durum çubuğu (src/cluster_erp/desktop/widgets/login_dialog.py:306, src/cluster_erp/desktop/widgets/status_bar.py:57).
Yerelleştirilmiş hata iletileri¶
format_api_error iletiyi şu sırayla seçer (src/cluster_erp/desktop/core/api_worker.py:108-176):
fieldslistesi olanVALIDATION_ERRORiçin alan başına bir satır; alan etiketifield.<ad>anahtarından, neden_REASON_KEYSüzerinden eşlenir (src/cluster_erp/desktop/core/api_worker.py:85-105,src/cluster_erp/desktop/core/api_worker.py:123-132).details.missinglistesi için eksik öğe başına bir satır, etiket geçerli dilde (src/cluster_erp/desktop/core/api_worker.py:134-146).- Skaler ayrıntılarla doldurulmuş
error.<code>çevirisi. Birresourceayrıntısıresource.<ad>üzerinden çevrilir (src/cluster_erp/desktop/core/api_worker.py:148-165). error.unknownçevirisi (src/cluster_erp/desktop/core/api_worker.py:167-168).
Varsa iz kimliği ayrı bir satır olarak eklenir (src/cluster_erp/desktop/core/api_worker.py:170-174).
GenericApi sınıfı¶
GenericApi(client, module_name, entity_meta) her yolun başına /<module> ekler ve {id}, {parent_id}, {scope_id} yer tutucularını değiştirir. Metadata'nın bildirmediği bir uç anahtarı ValueError fırlatır (src/cluster_erp/desktop/core/generic_api.py:10-31).
| Yöntem | HTTP çağrısı | Değişiklik sinyali | Kaynak |
|---|---|---|---|
list |
Seçilen liste ucuna GET; search, liste görünümü sayfalıysa limit ve offset, üst ve kapsam süzgeçleri ve ek süzgeçlerle |
yok | src/cluster_erp/desktop/core/generic_api.py:33-61 |
get |
get ucuna GET |
yok | src/cluster_erp/desktop/core/generic_api.py:63-65 |
create |
create ucuna POST |
entity_created |
src/cluster_erp/desktop/core/generic_api.py:67-73 |
update |
update ucu bildiriyorsa PATCH, yoksa PUT |
entity_updated |
src/cluster_erp/desktop/core/generic_api.py:75-84 |
delete |
delete ucuna DELETE |
entity_deleted |
src/cluster_erp/desktop/core/generic_api.py:86-88 |
bulk_delete |
{ids} ile bulk_delete ucuna POST |
entity_created |
src/cluster_erp/desktop/core/generic_api.py:92-99 |
execute_action |
Bir aksiyon ucuna POST veya GET |
POST için entity_created |
src/cluster_erp/desktop/core/generic_api.py:101-122 |
Sunucu tarafında silme bir kullanımdan kaldırmadır; bkz. yumuşak silme ve kullanımdan kaldırma. GenericApi.delete kullanımdan kaldırma nedeni göndermez.
Ortak sarmalayıcılar¶
core_api.py, ekranların kesişen özellikler için kullandığı üç sarmalayıcıyı içerir.
| Sınıf | Çağrılar | Kaynak |
|---|---|---|
NotesApi |
/notes/{entity_type}/{entity_id}, /notes/count/..., POST /notes/, PUT ve DELETE /notes/{id}, POST /notes/bulk-delete |
src/cluster_erp/desktop/core/core_api.py:9-42 |
AttachmentsApi |
/attachments/ altında listeleme, sayma, çok parçalı yükleme, indirme, üst bilgi güncelleme, dosya değiştirme, silme, toplu silme |
src/cluster_erp/desktop/core/core_api.py:45-107 |
EmailApi |
POST /email/resolve, POST /email/send-records, POST /email/send |
src/cluster_erp/desktop/core/core_api.py:110-174 |
Notların ve eklerin sunucu tarafı ekler, notlar ve depolama sayfasındadır. E-posta rotaları PDF ve sistem postası sayfasındadır.
Neden böyle kurulmuştur¶
- Olay döngüsü yerine çalışan iş parçacıkları: projenin yazılı mühendislik kuralları, istemcinin
QThreadçalışanlarıyla eşzamanlı birhttpxistemcisi kullandığını ve karmaşıklıktan kaçınmak için eşzamansız olay döngüsünden uzak durduğunu belirtir. - Çalışanı zorla sonlandırmama:
src/cluster_erp/desktop/core/api_worker.py:277-283içindeki yorum, engellenmiş bir çalışanı sonlandırmanın istemci kilidini tutulu bırakacağını ve sonraki her çağrıyı engelleyeceğini belirtir. - Güncelleme fiilinin metadata'dan gelmesi:
src/cluster_erp/desktop/core/generic_api.py:77-78içindeki yorum, web istemcisinin aynı bildirimi okuduğunu belirtir.
Kurallar ve sınırlar¶
- Metadata güdümlü varlıkların yolları metadata'dan gelir.
GenericApi._pathbildirilmemiş bir uç anahtarını reddeder (src/cluster_erp/desktop/core/generic_api.py:24-28). - İstemcideki izin denetimleri görüntü yardımcısıdır.
has_permissiongirişte dönen listeden yanıt verir (src/cluster_erp/desktop/core/api_client.py:131-132); her izni sunucu uygular, bkz. roller ve izinler.
Diğer parçalarla etkileşim¶
- Metadata'dan kurulan her ekran
GenericApikullanır; bkz. genel bileşenler. FkCache, seçenek listelerini yüklemek içinApiClient.getişlevini doğrudan çağırır; bkz. metadata deposu ve yabancı anahtar önbelleği.- Elle yazılmış ekranlar
ApiClientnesnesini doğrudan, çoğunluklacall_apiüzerinden çağırır; bkz. modül ekranları.
Sınırlar ve açık noktalar¶
- Bazı çağrılar çalışan olmadan GUI iş parçacığında yürür: açılıştaki metadata yüklemesi (
src/cluster_erp/desktop/main.py:196-200), yabancı anahtar seçenek yüklemeleri (src/cluster_erp/desktop/widgets/generic/generic_form.py:328-343) ve sohbet bileşeninin liste ve sayı sorguları (src/cluster_erp/desktop/widgets/chat/chat_widget.py:1651,src/cluster_erp/desktop/widgets/chat/chat_widget.py:1758). bulk_delete, çağrıdan sonra her kimlik için bir kezentity_deletedyayar;POSTileexecute_actionbir kayıt aksiyonundaentity_updated, hedefsiz bir aksiyondaentity_createdyayar; ikisi deemit_entity_changeişlevini kendisi çağırır (src/cluster_erp/desktop/core/generic_api.py:92-99,src/cluster_erp/desktop/core/generic_api.py:101-121).execute_action,POSTdışındaki her yöntem içinGETgönderir (src/cluster_erp/desktop/core/generic_api.py:113-122). Liste ekranlarıPUTde işleyen kendi aksiyon yardımcılarını kullanır (src/cluster_erp/desktop/widgets/generic/generic_list_view.py:774-787).src/cluster_erp/desktop/core/api_worker.py:277-280içindeki yorum, engellenmiş bir çalışanın istemci kilidini tüm istek boyunca tuttuğunu söyler._requestkilidi yalnızca istemci okunurken ve bir yenileme sırasında tutar (src/cluster_erp/desktop/core/api_client.py:336-347).
Tanıtılan terimler¶
| Terim | Kod tanımlayıcısı | Tanım | Türkçe terim | Kaynak |
|---|---|---|---|---|
| API client | ApiClient |
Her HTTP isteğini gönderen, oturumu bellekte tutan ve değişiklik sinyallerini yayan masaüstü nesnesi. | API istemcisi | src/cluster_erp/desktop/core/api_client.py:80 |
| API worker | ApiWorker |
Tek bir API çağrısını yürüten ve sonucu ya da hatayı sinyal olarak bildiren QThread. |
API çalışanı | src/cluster_erp/desktop/core/api_worker.py:28 |
| API mixin | ApiMixin |
Bir bileşene call_api veren ve bileşen yok edildiğinde çalışanlarını durduran karışım sınıfı. |
API karışımı | src/cluster_erp/desktop/core/api_worker.py:179 |
| entity descriptor | EntityDescriptor |
Bir değişiklik sinyalinin konusunu adlandıran, modül adı ve varlık türünden oluşan dondurulmuş çift. | varlık tanımlayıcı | src/cluster_erp/desktop/core/entity_types.py:7 |
| generic API (desktop) | GenericApi |
Varlık çağrılarını metadata uç bildirimlerinden kuran masaüstü sınıfı. | genel API | src/cluster_erp/desktop/core/generic_api.py:10 |
İlgili sayfalar¶
- Masaüstü istemci
- Sinyal veri yolu ve watch_entity
- Genel bileşenler
- Açılış, oturum ve API çağrıları
- Hatalar ve istisnalar
92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.