title: Hue 3.8にアプリケーションを更新するための開発者ガイド author: Hue Team type: post date: 2015-04-10T00:31:22+00:00 url: /developer-guide-on-upgrading-apps-for-django-1-6-2/ sf_thumbnail_type:
| 近日公開される Hue 3.8 の内部では、パフォーマンス、堅牢性、およびセキュリティを向上させるためにいくつかのメジャーな更新を行っています。大きな変更はDjangoの1.4.5から1.6.10アップグレードに起因しており、大幅なパフォーマンスの向上、バグの修正、廃止された機能の削除がなされています。
この記事では、HueのSDKに対してビルドしているHueの開発者が、アプリケーションをHue 3.8で動作するように更新する方法について説明します。 categories:
Hue 3.8
Programming
近日公開される Hue 3.8 の内部では、パフォーマンス、堅牢性、およびセキュリティを向上させるためにいくつかのメジャーな更新を行っています。大きな変更はDjangoの1.4.5から1.6.10アップグレードに起因しており、大幅なパフォーマンスの向上、バグの修正、廃止された機能の削除がなされています。
この記事では、HueのSDKに対してビルドしているHueの開発者が、アプリケーションをHue 3.8で動作するように更新する方法について説明します。
現在Pythonの最低要件のバージョンは2.6.5になり、2.6.0は要件を満たしません 。
HueはDjango 1.4.5からDjango1.6.10にアップグレードされています。Django 1.5と1.6のリリースノートにアップグレード方法についての詳細がありますが、これらはHueのアップグレード中に私たちが遭遇した主な問題です。
私たちはJsonのレコードをシンプルに応答するために、Django 1.7のJsonResponseをバックポートしました。以下のように記述していたものが:
def view(request):
value = { “x”: “y” }
HttpResponse(json.dumps(value))
今はこのように記述することができます:
def view(request):
value = { “x”: “y” }
return JsonResponse(value)
もうひとつ注意すべきなのは、辞書でないものがシリアライズされている場合、Djangoはデフォルトでエラーを発生させるということです。これは古いブラウザへの攻撃 に対する防御です。これは、このエラーを無効にする方法です:
def view(request):
value = [“x”, “y”]
return JsonResponse(value, safe=False)
私たちは、開発者はオブジェクトを返すように移行することをお勧めします。Hueも3.8.0に完全に移行されている必要があります。
Djangoのdjango.core.urlresolvers.reverse(およびmakoスクリプトの url関数)は自動的に引数をエスケープします。従って、これらの関数の使用は、以下から:
<a href="${ url('useradmin:useradmin.views.edit_user', username=urllib.quote(user.username)) }">...</a>
下記のように更新します:
<a href="${ url('useradmin:useradmin.views.edit_user', username=user.username) }">...</a>
ビューからジェネレータを返すために、今はStreamingHttpResponse を使用する必要があります。テストするときは、以下のような記述から:
csv_response = self.c.post(reverse('search:download'), {
'csv': True,
'collection': json.dumps(self._get_collection_param(self.collection)),
'query': json.dumps(QUERY)
})
csv_response_content = csv_response.content
下記のように変更します:
csv_response = self.c.post(reverse('search:download'), {
'csv': True,
'collection': json.dumps(self._get_collection_param(self.collection)),
'query': json.dumps(QUERY)
})
csv_response_content = ''.join(csv_response.streaming_content)
NGINXの記事 で説明したように、Hueは現在、NGINXのような独立したウェブサーバで静的ファイルを提供することができます。これは、Hueのフロントエンドがページをレンダリングするために実行する必要がある要求の数を減らすことができます。
|
|
この変更は、静的なファイルを提供する古い方法を使用しているアプリケーションを動かなくします。また、Hue 3.8.0 とそれ以前のバージョンのHueからの静的ファイルにあてた、ユーザーがバックポートしているパッチとの競合も発生します。
移行をするには以下を行います:
/apps/$name/static からの静的なファイルを/apps/$name/src/$name/staticに移動する以下からのファイルを:
<link rel=”stylesheet” href=”/metastore/static/css/metastore.css”>
下記に変更するために、.mako</ code>を更新する:
<link rel=”stylesheet” href=”${ static(‘metastore/css/metastore.css’) }”>apps/$name/src/help/settings.py の”ICON”を、以下から:
ICON = “/help/static/art/icon_help_24.png”
下記のように更新する:
ICON = “help/art/icon_help_24.png”
PythonのすべてのPythonテンプレートを、以下から:
def view(request):
data = {‘image’: “/help/static/art/icon_help_24.png”}
return render(“template.mako”, request, data)
下記のように更新する:
from django.contrib.staticfiles.storage import staticfiles_storage…
def view(request):
data = {‘image’: staticfiles_storage.url(“/help/static/art/icon_help_24.png”) }
return render(“template.mako”, request, data)
最後に、Hueをdebug=Falseで実行するには、全てのファイルをbuild/staticディレクトリに収集するため、最初にmake appsあるいは./build/env/bin/hue collectstaticのいずれを実行する必要があります。これはdebug=Trueでは必要がなく、Hueは/apps/$name/src/$name/staticディレクトリから静的ファイルを直接提供します。
今月、Django 1.8がリリースされました!これは2番目のLTSリリースであり、1.4のサポートは6ヶ月で終了します。1.8の主な依存関係はPython 2.7が必要になることで、これはまだ現在使用されている古いLTS OSのデフォルトのPythonのバージョンではないということです。