風柳メモ

ソフトウェア・プログラミング関連の覚書が中心。

GAEで使用するDjangoのバージョンを指定しているつもりなのに警告が出る(続き)

【追記】
このコメントにより、ひとまず解決した。

appengine_config.py
というファイルを作り、そのファイルに下記の 1 行を入れてみてはいかがでしょうか。少なくとも SDK 1.5.0 の prerelease では警告は消えています。
webapp_django_version = '0.96'

このとおり、アプリのディレクトリ直下に appengine_config.py というファイルを作って

webapp_django_version = '0.96'
#webapp_django_version = '1.2' # 1.2 を使用する場合

の形で、Djangoのバージョンを記述しておけば、アプリそのもののソースには特に(use_library()等を)記述しなくても、指定したバージョンが使用されるようになり、警告も出なくなった。


GAEで使用するDjangoのバージョンを指定しているつもりなのに警告が出る - 風柳メモ

の続き。
関連:Google グループ

概要

Djangoのバージョンを表示するだけのシンプルなアプリを用意して試してみた。
結果としては、

  • use_library()で1.2を指定した場合、正常に切り替わっている。
  • use_library()でバージョンを明示する/しないに関わりなく、0.96を使用する限り警告が出る。

となった。

気になるのは、近い将来デフォルトバージョンが切り替わった際、use_library('django','0.96')が正常に効いてくれる(バージョン0.96が使用される)かどうかということ。
余計な不安をあおらないためにも、use_library()を使っていたら、警告は表示しないようにして欲しい。

テスト内容

[1]バージョンを明示しない場合

use_library()を使わないケース。

[2]バージョン1.2を明示した場合
from google.appengine.dist import use_library
use_library('django', '1.2')
[3]バージョン0.96を明示した場合
from google.appengine.dist import use_library
use_library('django', '0.96')

結果

[1]バージョンを明示しない場合
  • Django version: 0.96.400000000000006
  • アプリの初回起動時のログには警告が表示される。
[2]バージョン1.2を明示した場合
  • Django version: 1.2.5
  • 警告は表示されない。
[3]バージョン0.96を明示した場合
  • Django version: 0.96.400000000000006
  • アプリの初回起動時のログには警告が表示される。

結局、バージョン0.96だとどちらにしても

You are using the default Django version (0.96). The default Django version will change in an App Engine release in the near future. Please call use_library() to explicitly select a Django version. For more information see http://code.google.com/appengine/docs/python/tools/libraries.html#Django

という警告は表示されてしまうようだ。

テストの為に用意したアプリ

app.yaml
application: appid
version: 1
runtime: python
api_version: 1

handlers:
- url: .*
  script: main.py
main.py
# -*- coding: utf-8 -*-

import os

# ■【この位置を書き換える】

from google.appengine.ext.webapp import template
from google.appengine.ext import webapp
from google.appengine.ext.webapp import util

import django
if getattr(django,'get_version',None):
  def django_get_version():
    return django.get_version()
else:
  def django_get_version():
    ver_tuple = django.VERSION
    ver_str = u'%d' % (ver_tuple[0])
    for _v in ver_tuple[1:]:
      if isinstance(_v, (int,long)):
        fmt = u'%s.%d'
      elif isinstance(_v, float):
        fmt = u'%s.%.15f'
      elif isinstance(_v, basestring):
        fmt = u'%s %s'
      else:
        continue
      ver_str = fmt % (ver_str, _v)
    return ver_str
  
  DJANGO_VERSION=django_get_version()
  
  def django_get_version():
    return DJANGO_VERSION

class MainHandler(webapp.RequestHandler):
  def get(self):
      
    template_values = {
      'text': u'Django version: '+django_get_version()
    }
    path = os.path.join(os.path.dirname(__file__), 'index.html')
    self.response.out.write(template.render(path, template_values))

def main():
  application = webapp.WSGIApplication([('/', MainHandler)], debug=True)
  util.run_wsgi_app(application)

if __name__ == '__main__':
  main()
index.html
<html>
  <head><title>{{text}}</title></head>
  <body>{{text}}</body>
</html>