--- 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: - none sf_thumbnail_link_type: - link_to_post sf_detail_type: - none sf_page_title: - 1 sf_page_title_style: - standard sf_no_breadcrumbs: - 1 sf_page_title_bg: - none sf_page_title_text_style: - light sf_background_image_size: - cover sf_social_sharing: - 1 sf_sidebar_config: - left-sidebar sf_left_sidebar: - Sidebar-2 sf_right_sidebar: - Sidebar-1 sf_caption_position: - caption-right sf_remove_promo_bar: - 1 sf_custom_excerpt: - | 近日公開される 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]の1.4.5から1.6.10アップグレードに起因しており、大幅なパフォーマンスの向上、バグの修正、廃止された機能の削除がなされています。 この記事では、HueのSDKに対してビルドしているHueの開発者が、アプリケーションをHue 3.8で動作するように更新する方法について説明します。 [django-logo-positive][2] # Pythonのバージョン 現在Pythonの最低要件のバージョンは2.6.5になり、2.6.0は[要件を満たしません][3] 。 # Djangoのアップグレード HueはDjango 1.4.5からDjango1.6.10にアップグレードされています。Django 1.5と[1.6][4]のリリースノートにアップグレード方法についての詳細がありますが、これらは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はデフォルトでエラーを発生させるということです。これは[古いブラウザへの攻撃][5] に対する防御です。これは、このエラーを無効にする方法です:
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の記事][6] で説明したように、Hueは現在、NGINXのような独立したウェブサーバで静的ファイルを提供することができます。これは、Hueのフロントエンドがページをレンダリングするために実行する必要がある要求の数を減らすことができます。
without-nginx with-nginx
この変更は、静的なファイルを提供する古い方法を使用しているアプリケーションを動かなくします。また、Hue 3.8.0 とそれ以前のバージョンのHueからの静的ファイルにあてた、ユーザーがバックポートしているパッチとの競合も発生します。 移行をするには以下を行います: * /apps/$name/static からの静的なファイルを/apps/$name/src/$name/staticに移動する * 以下からのファイルを:
<link rel=”stylesheet” href=”/metastore/static/css/metastore.css”>
下記に変更するために、.makoを更新する:
<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が][7]リリースされました!これは2番目のLTSリリースであり、1.4のサポートは6ヶ月で終了します。1.8の主な依存関係はPython 2.7が必要になることで、これはまだ現在使用されている古いLTS OSのデフォルトのPythonのバージョンではないということです。   いつものように、コメントとフィードバックは [hue-user][8] メーリングリストや[@gethue][9]までお気軽に! [1]: https://www.djangoproject.com/ [2]: https://cdn.gethue.com/uploads/2015/03/django-logo-positive.png [3]: http://stackoverflow.com/questions/19365230/django-init-keywords-must-be-strings-error-while-running-runserver [4]: https://docs.djangoproject.com/en/1.7/releases/1.6/ [5]: https://docs.djangoproject.com/en/1.7/ref/request-response/#serializing-non-dictionary-objects [6]: https://gethue.com/developer-guide-on-upgrading-apps-for-django-1-6/# [7]: https://docs.djangoproject.com/en/1.8/releases/1.8/ [8]: http://groups.google.com/a/cloudera.org/group/hue-user [9]: https://twitter.com/gethue