SORU
21 Mayıs 2009, PERŞEMBE


Nasıl Django model bir modül&; manage.py shell&""); etkileşimli yorumlayıcı kullanarak yeniden musunuz?

Düzenli Python yorumlayıcısı bir oturum içinde düzenli bir Python modülü yeniden nasıl biliyorum. Bu oldukça iyi yapmak için nasıl belgeleri soru:

How do I unload (reload) a Python module?

Nedense, sorun Django "shell" tercüman oturum. manage.py içinde bunu yaşıyorum Benim sorunu yeniden oluşturmak için, temel Django öğretici buldum

Writing your first Django app, part 1

""Uygulama ve "Anket" sınıfı, "" ve "" app içine. anketler, ithalat manage.py kabuk üzerinden yorumlayıcı başlangıç anketler oluşturduktan sonra

import polls.models as pm

Yeni oluştur "Anket" nesne:

p = pm.Poll()

Ve şimdiye kadar iyi. Şimdi kaynağa geri dönmek ve eklemek rasgele herhangi bir yöntem veya öznitelik. Örneğin, ekledim:

def x(self):
    return 2 2

Artık tercümana dönüp "modülü yeniden yerleştirin

reload(pm)

Şimdi yeni yöntemi kullanın veya öznitelik deneyin:

p1 = pm.Poll()
p1.x()

Bu ileti alırsınız:

'Poll' object has no attribute 'x'

Ne veriyor? Ayrıca Al komutunu yeniden çalıştırmadan, modülü farklı bir sözdizimi kullanarak içe, tüm başvurular "" nesneleri veya "" sınıf. Ankete Anket için herhangi bir silme denedim Ayrıca düz Python (v2.hem İPython tercüman olan bu ve denedim 6) tercüman. Hiçbir şey iş gibi görünüyor.

Normal sözlü bir oturum keyfi Python modülü ile aynı teknikleri kullanarak mükemmel çalışıyor. Ben sadece "" oturumu. Shell'in içinde Django işe almak gibi olamaz

Eğer bir önemi varsa bu arada, Ubuntu 9.04 bir makinede yapıyorum.

CEVAP
24 Mayıs 2009, Pazar


Peki, bu cevap vermek zorunda olduğumu düşünüyorum. Sorun Django önbelleğe bir singleton modelleri (singleton gibi bir yapı) AppCache denir. Temelde, Django modelleri yeniden ilk ve yeniden ithal tüm model modülleri AppCache saklanan yeniden yükleyin. Sonra AppCache temizlemek gerekir. İşte bunun için kod:

import os
from django.db.models.loading import AppCache
cache = AppCache()

curdir = os.getcwd()

for app in cache.get_apps():
    f = app.__file__
    if f.startswith(curdir) and f.endswith('.pyc'):
        os.remove(f)
    __import__(app.__name__)
    reload(app)

from django.utils.datastructures import SortedDict
cache.app_store = SortedDict()
cache.app_models = SortedDict()
cache.app_errors = {}
cache.handled = {}
cache.loaded = False

Ayrı bir dosya Django sitemin kök dizininde reloadmodels.py denilen bütün bunları koydum. İPython çalıştırarak her şeyi yükleme yapabilirim kullanarak:

%run ~/mysite/reloadmodels.py

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Chanre Joubert

    Chanre Joube

    27 Temmuz 2012
  • Gigawipf

    Gigawipf

    18 ŞUBAT 2010
  • Michael Neal

    Michael Neal

    2 Mayıs 2009