2009-11-28 21 views
5

Oldukça büyük bir proje yapıyorum, bu temelde şunlardan oluşur:Django, modelsiz bir yönetici paneli nasıl oluşturulur?

Sunucu 1: Buz tabanlı hizmetler. Oturum yönetimi için Glacier2. Glacier2'ye erişim sağlayan güvenlik duvarı.

Sunucu 2: Glacier2 üzerinden Ice hizmetleri için Web arabirimi (okuyun, genel). Buz servisleri aracılığıyla Buz servisleri için yönetici arabirimi 2.

İlgilendiğim nokta web arabirimidir. Ben Django kullanmak istiyorum, çünkü her ikisi de python ile yazılmış ve bu inanılmaz kullanışlı otomatik yönetici paneli üreteci var.

Web arabirimi herhangi bir veritabanına erişmiyor. Glacier2 yönlendiricisi üzerinden Sunucu # 1 üzerindeki bir Ice servisine bağlanır ve verileri yönetmek için bu servislerin maruz kaldığı API'yi kullanır.

Ve muhtemelen bildiğiniz gibi, Django'daki yönetici üretimi Django'nun ORM'inin kullanımına bağlıdır; Kullanmayacağım veritabanım olmadığı için kullanmıyorum.

Bu nedenle yönetici panelini oluşturmam gerekiyor, ancak normalde ORM gibi standart bir veri erişimine sahip olmak yerine, herhangi bir "db-access" çağrısını engellemeli ve bunları Ice servis çağrılarına dönüştürmem gerekir. Hizmetin çıktısı (varsa), ORM'in normal olarak geri döndüğü ve Django'ya dönüş kontrolüne dönüştürdüğü dönüştürülür.

Bunu nasıl yapabileceğimi herkes biliyor mu? alt sınıfa ne ihtiyacım olurdu? Herhangi bir fikrin var mı?

Zaman ayırdığınız için teşekkür ederiz.

cevap

7

İstediğin yönetici entegrasyonunu almak için özel ORMs yazma daha basit bir yolu var olabileceğini düşünüyorum uyumlu malzeme django.model çok yapmak gerekir. Webfaction e-posta hesaplarını Kontrol Paneli API'sı aracılığıyla yönetmeye izin veren bir uygulamada kullandım.

models.py, admin.py ve url'ye bir göz atın.Burada py: django-webfaction

kullanmak başarmış bir kukla modeli = yönetici endeksi sayfasında bir girişi oluşturmak için Yanlış

yönetici ile bu modeli kaydedin.

Daha sonra yönetici URL'lerini engelleyebilir ve bunları kendi görünümlerinize yönlendirebilirsiniz.

Bu, yönetici/kullanıcı ekleme/silme eylemleri uygulamanız için anlamlılık sağlaması durumunda mantıklıdır. Aksi takdirde, kendi özel eylemlerinizi eklemek için yönetici dizinini veya değişiklik listelerini geçersiz kılmaktan daha iyi davranırsınız.

+0

Uygulamanızı indirdim ve genel uygulamayı seviyorum. Hizmetlerin gerçekte ne yaptığıyla ilgili olarak, zaten tasarladığım çekirdek olanlar, aşağıya doğru gelir: Hesaplar (kimlik doğrulama, kullanıcılar, gruplar, izinler), Ayarlar (her hizmet ve hatta web arayüzü için), Günlük ('Son İşlemler' yönetici paneli ile aynı değil, tüm kullanıcılar tarafından eylemler kaydeder, İşler (diğer hizmetler için sıra) ve henüz tasarlanmamış olan ilginç şeyler yapan gerçek hizmetler. Yani, 9/10, ekleme/düzenleme/sil eylem kümesi bekler. Bu 1/10 için, uygulamanızın yaptığı gibi her zaman kendi özelleştirilmiş sayfalarımı oluşturabilirim. 'Managed = False' önerisi için – user168833

+0

+1 – Don

0

django ORM'in takılabilir bir arkası vardır, bu da RDBMSes olmayan şeyler için arka plan yazabilirsiniz anlamına gelir. Muhtemelen oldukça büyük bir görevdir, ancak başlamak için iyi bir yer Malcolm Tredinnick'in DjangoCon 2008, Inside the ORM'dan yaptığı konuşmadır.

Aksi takdirde, ORM'yi tamamen atlayabilir ve ihtiyacınız olan erişim için formları el ile yazabilirsiniz.

3

contrib.admin dosyasının gerçek gücü django Forms. Özünde, yönetici aracı temelde, bir modele ufacık bir urls.py yönlendirme ile bir Form uyacak şekilde otomatik olarak oluşturuyor. Sonunda, yönetim aracından ayrı olarak django Forms kullanmak daha kolay olurdu. Bir model gibi görünmek ama bu sizin API'larla

F. E. vekil yapar

+0

+1. Sağladığınız URL'den örnek kodu almalı, o işi almalı, sonra da kendi amaçlarına göre uyarlamalıdır. – steveha

+0

Bağladığınız belgeleri kontrol edeceğim. – user168833

1

yapabilirsiniz "sahte" Bazı sınıf yüzden

class QuerysetMock(object): 
    def all(): 
     return call_to_your_api() 
    [...] 


class MetaMock(object): 
    def fields(): 
     return fields_mock_objects.. 
    verbose_name = '' 
    [...] 

class ModelMock(object): 
    _meta = MetaMock() 
    objects = QuerysetMock() 

admin.site.register(ModelMock) 

Bu işe yarayabilir .. ama