近日公開される Hue 3.8 の内部では、パフォーマンス、堅牢性、およびセキュリティを向上させるためにいくつかのメジャーな更新を行っています。大きな変更はDjangoの1.4.5から1.6.10アップグレードに起因しており、大幅なパフォーマンスの向上、バグの修正、廃止された機能の削除がなされています。
この記事では、HueのSDKに対してビルドしているHueの開発者が、アプリケーションをHue 3.8で動作するように更新する方法について説明します。
Pythonのバージョン
現在Pythonの最低要件のバージョンは2.6.5になり、2.6.0は要件を満たしません 。
Djangoのアップグレード
HueはDjango 1.4.5からDjango1.6.10にアップグレードされています。Django 1.5と1.6のリリースノートにアップグレード方法についての詳細がありますが、これらはHueのアップグレード中に私たちが遭遇した主な問題です。
Json
私たちは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に完全に移行されている必要があります。
Url と Reverse
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
ビューからジェネレータを返すために、今は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
ディレクトリから静的ファイルを直接提供します。
Next!
今月、Django 1.8がリリースされました!これは2番目のLTSリリースであり、1.4のサポートは6ヶ月で終了します。1.8の主な依存関係はPython 2.7が必要になることで、これはまだ現在使用されている古いLTS OSのデフォルトのPythonのバージョンではないということです。