SORU
14 ŞUBAT 2011, PAZARTESİ


App engine varsayılan Django sürümü değiştirin

App engine 1.4.2 yayımlanan bu yana, benim üretim günlüklerinde bu gibi uyarılar alıyorum:

Varsayılan Django kullanıyor sürüm (0.96). Varsayılan Django sürüm App Motoru değişecek yakın gelecekte serbest bırakın. Lütfen use_library() çağrısı açıkça Django sürümünü seçin. Daha fazlası için bilgi gör http://code.google.com/appengine/docs/python/tools/libraries.html#Django

Bu Django şablon - aşağıdaki ile kullanıyorum her işleyicisi oluşur:

from google.appengine.ext.webapp import template

Yükseltmek için aşağıdaki bağlantıları bunu yapmak için tam olarak çok net görünmüyor ancak 1.2, (veya çalışıp çalışmadığını) etmek istiyorum:

Ortak iplik ekle Bu:

from google.appengine.dist import use_library
use_library('django', '1.2')

Ancak, ne dosya(lar) bu eklenmesi gereken:

  1. Appengine_config.py sadece?
  2. Her yer .from google.appengine.ext.webapp import template hangi dosya py?
  3. Her yer .proje dosyası py?
  4. (2 veya 3) yukarıdaki 1 ve ayrıca bu dosyalar için import appengine_config Ekle?
  5. 3 veya 4, ve ayrıca yerleşik appstats, uzak apı, veri yönetim, vb gibi fonksiyonları etrafında sarma Ekle?
  6. Başka bir şey mi?

Teşekkürler.

CEVAP
17 ŞUBAT 2011, PERŞEMBE


Olarak tarif tarafından Nick açıklamaları systempuntoout cevabı, ben eklenen bu use_library() kodu from here her işleyicisi ithalat django (doğrudan) google.appengine.ext.webapp.template hatta sadece django.utils.simplejson):

from google.appengine.dist import use_library
use_library('django', '1.2')

Nick önerdiği gibi, bu daha kolay işleyicileri uygulama tarafından başvurulan sayısını en aza indirmek için ilk çabasını tarafından yapıldı.yaml (yani, scenario 1 described here daha yakın).

Ancak, appstats yerleşik yapılandırılmış var, ve eğer ben önce bir yükleme işleminden sonra /_ah/appstats giderse, o zaman bu hata alıyorum:

&; 'google.lt appengine.dağıtım._library.UnacceptableVersionError'>: django 1.2 istendi, ama 0.96.4.Yok zaten kullanılıyor

Ayrıca appengine_config.py 19 *kod ekleyerek bunu düzeltmek için başardı.

appengine_config.py use_library() bir çağrı ekleyerek sonra artık benim işleyicileri tüm gerekli olduğunu fark ettim. Özellikle google.appengine.ext.webapp.template ithalat olanlar, webapp.template yükler appengine_config.py alma çünkü gerek yok. Bu appstats ithalatı bu sorunu tamir ediliyor webapp.template, UI.

Ancak, webapp.template ithal ama django.utils.simplejson ithalat yapma bazı işleyicileri (örn services json) vardı. Bu işleyicileri hala use_library() doğrudan bir çağrı gerektirir. Eğer bu işleyicileri önce yeni bir örneği olarak adlandırılır, aksi takdirde UnacceptableVersionError oluşur. appengine_config.py appstats yapılandırmak için kullanıyorum, ancak appengine_config.py anlam enstrüman için çağrılır tüm istekleri, sayfa yaşam döngüsü içinde çok geç düzgün Django doğru sürümünü yapılandırmak için adı alır.

Bu sorun ilk çalışmaya çıktı, ama daha sonra geriye dönük olarak kullanıyordum yeni Django 1.2 ve eski Django 0.96 arasında uyumsuzluk keşfettim. Proje benim yapısı böyle

root
 - admin
|   - page_admin.html
 - page_base.html

Django ile 0.96, page_admin.html aşağıdaki olması iyi çalıştı:

{% extends "../page_base.html" %}

1.2, Django ile bu hata var:

TemplateDoesNotExist: ../page_base.html

Django 1.2 değişim varsayılan olarak, Django orijinal şablonu dizin üstünde olan yükleme şablonları izin vermez gibi görünüyor.

Bu geçici bir çözüm şablonları şablonları bir alt dizininde olması gerekir gibi bu yaklaşım benim için işe yaramaz 74 ** ama tarif edilir.

Çözüm için bu kurmak settings.py dosya, set TEMPLATE_DIRS ayarı için proje kök dizini seçin ve sonra da Değiştir extends etiketi için başvuru "page_base.html", described here. Ancak, iki sorun bunu yapmak için çalışırken rastladım.

recommended code şablon, benim ıe işlemek için kullanıyordum:

template_values = { ... }
path = os.path.join(os.path.dirname(__file__), 'page_admin.html')
self.response.out.write(template.render(path, template_values))

İlk sorun template.render() TEMPLATE_DIRS ayar, şablon işlenmiş dizinine ayarlamak için geçersiz kılar. Bu çözüm aşağıdaki kodu

template_values = { ... }
path = os.path.join(os.path.dirname(__file__), 'page_admin.html')
template_file = open(path) 
compiled_template = template.Template(template_file.read()) 
template_file.close()  
self.response.out.write(compiled_template.render(template.Context(template_values))) 

Bu kod yok ise bu yaklaşımın bir dezavantajı olsa template.render() derlenmiş şablon önbelleğe olduğunu eklemek zor olmasa gerek, ancak).

TEMPLATE_DIRS ayarı yapılandırmak için bir projem için settings.py eklendi:

PROJECT_ROOT = os.path.dirname(__file__) 
TEMPLATE_DIRS = (PROJECT_ROOT,)

Ve sonra use_library() kodu daha önce benim işleyicileri,,DJANGO_SETTINGS_MODULE as described here ben set:

import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings' 

İkinci sorun, bu işe yaramadı oldu - ayarları dosyası sarhoş değildi, ve TEMPLATE_DIRS boştu.

Django ayarları settings.py belirtilen tembel, erişilen ilk kez yüklenir. Sorun webapp.template ithal django.conf.settings.configure() bazı ayarları ayarlamak için girişimi için çağırır. Bu nedenle eğer webapp.template ithal önce herhangi bir ayar erişilen, sonra settings.py hiçbir zaman dolu (olarak ayarlar erişimci bulur o ayarlar zaten mevcut ve gelmez girişimi için yük daha fazla).

Bu çözüm webapp.template ithal önce, ayarlara erişim, settings.py yük zorlamak için. webapp.template sonra alındığında, 59**, çağrı göz ardı edilir. Bu yüzden Django sürümünü aşağıdaki işleyicileri (appengine_config.py) kod Kur değişti:

import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings' 

from google.appengine.dist import use_library
use_library('django', '1.2')

from django.conf import settings
_ = settings.TEMPLATE_DIRS

Pratikte, aslında bir dosya setup_django_version.py denilen yukarıdaki tüm kodu koymak ve sonra benim işleyicileri tüm bu, her yerde bu kod 6 satır yinelemek yerine alın.

Ben o zaman page_admin.html benim bu şablonu (page_base.html TEMPLATE_DIRS ayarına göre yani belirtin) içerecek şekilde güncellendi:

{% extends "page_base.html" %}

Ve bu admin sayfa oluşturma ile sorun giderildi.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bart Baker

    Bart Baker

    1 Aralık 2006
  • ShayLoss

    ShayLoss

    5 Kasım 2009
  • YouChewBu

    YouChewBu

    26 Ocak 2009