スキップしてメイン コンテンツに移動

インターン(その12)

MNUにてインターンをさせていただいています、
豊橋技術科学大学の近藤です。

現在作成中のアプリケーションで行った作業の一部をまとめてみました。

Adminサイトの表示変更

AdminサイトのChangeListをいじっている際に、
1つのインスタンスにつき2行を割り当てて、
2行目の表示、非表示を切り替えるようにするため、
無理やりコーディングしてみました。
def detail(self, obj):
  pre = u'<pre>%s</pre>' % obj.message
  span = len(self.list_display) - 1
  msg = u'<th >Message</th><td colspan="%s">%s'
             % (span, pre if obj.message != '' else '')
  detail = u'<button class="btn btn-info toggler_row_btn" id="%s" type="button
             詳細</button>' % (obj.pk)
  button = u'<div class="btn-group btn-group-sm" role="group">%s</div>' % (detail)
  return u'%s</td></tr><tr class="toggler_row" id="%s"><td></td>%s'
             % (button, obj.pk, msg)
detail.allow_tags = True
単純に、行を閉じて新しい行を開いてpreタグで
くくったメッセージを表示させているだけです。
後はdjango.contrib.admin.template.change_list.htmlを
オーバーライドして、javascriptを追加するだけで動作はしますが、
このHTMLをpythonのコードとして記述するのは気持ち悪い。
よく考えたらTemplateに記述して読み込めばよいと気付きました。
  <button class="btn btn-info toggler_row_btn" id="{{ object.pk }}" type="button">
    <span class="glyphicon glyphicon-chevron-down"></span> 削除
  </button>
</td></tr>
<tr class="toggler_row" id={{ object.pk }}>
  <td></td> {# CheckBoxの分 #}
  <th>Message</th>
  <td colspan="{{ colspan }}">
    {% if object.message %}<pre>{{ object.message }}</pre>{% endif %}
  </td>
</tr>
最初はTemplateをだして、Render呼んで...としていましたが、
render_to_stringなる便利なものがあるのでそちらを利用。
  from django.template import Context
  from django.template.loader import render_to_string
  from django.template import TemplateDoesNotExist
  span = len(self.list_display) - 1
  try:
    cont = Context({'object': obj, 'colspan': span})
    return render_to_string(
             'hoger/admin/change_list_detail.html', cont)
  except TemplateDoesNotExist:
    return ''
    detail.allow_tags = True
これで、可読性が上がったと思います。

Templateのインクルードを別変数で

Template内で別のテンプレートを呼び出す際には、includeタグを使う。
forタグを使って、何度もincludeできるが、
別の名前の変数を使ってincludeして出力を行いたい場合に遭遇。
リファレンスによるとwithタグを使うと可能。
{% if object2 %}
  {% with object=object2 %}
    {% include "hoge/detail.html" %}
  {% endwith %}
{% endif %}
ただ、一回の呼び出しに3行使うのは気持ち悪いので他の方法を
探していたら、別の記述方法があった。includeタグ内にwithを記述できる。
{% if object2 %}
  {% include "hoge/detail.html" with object=object2 %}
{% endif %}

Celeryの同時実行数

 VirtualBox内のLinux上でceleryを使ってるが、ジョブの消費がシリアルだった。
celeryはCPUのコア数に応じて同時に処理する数を設定しているのが原因。

django-celeryで固定値で設定するには、settings.pyに
CELERYD_CONCURRENCY = 16
とする。
celery実行時に -c オプションで設定もできる。
設定すると、起動時のアスキーアートの横の設定値が
 -------------- celery@localhost.localdomain v3.1.17 (Cipater)
---- **** ----- 
--- * ***  * -- Linux-3.17.4-301.fc21.x86_64-x86_64-with-fedora-21-Twenty_One
-- * - **** --- 
- ** ---------- [config]
- ** ---------- .> app:         default:0x7f741e46d310 (djcelery.loaders.DjangoLoader)
- ** ---------- .> transport:   redis://127.0.0.1:6379//
- ** ---------- .> results:     djcelery.backends.database.DatabaseBackend
- *** --- * --- .> concurrency: 16 (prefork)
-- ******* ---- 
--- ***** ----- [queues]
 -------------- .> celery           exchange=celery(direct) key=celery
となり、concurrencyの値で確認できる。

コメント

このブログの人気の投稿

INTEROP Tokyo2015

6月11日(木)Interop Tokyoへ行ってきました。 私の目当ては、CITRIX社 ブース会場で行われた クラウド・エバンジェリストの北瀬公彦さんと常田秀明さんの講演です CITRIX社のロードバランサーであるネットスケーラーの活用事例を IBM社のクラウドサービスSoftLayerを例に説明されていました。 CITRIX社は、IBM社のグローバル提携企業だから、 CITRIX社のロードバランサーであるネットスケーラーと SoftLayer は、セットで説明されていました。 SoftLayer は、データセンターをプライベートにつなぐネットワークだっていう話でしたので、 IBM社のSoftLayer の物理サーバーを使えば、 データセンターをクラウド化ができる。 (オンプレミスの環境をそのまあ維持してデータセンターへ移行できる) 従来のオンプレミスユーザー最適だってことでした。 そのため、仮想化とか、クラウドがどうかとか説明必要ないということになり、 企業の情報システム担当者は、安心して使えるし、経営者にも説明しやすいと思いました。 自前で仮想化システム研究できる余裕はなく、 PaaSは不安という感じがあれば、 SoftLayerのIaaSサービスって、選択しやすいし、わかりやすい。 最適なクラウド基盤を選択できるっていいなと思いました。

はじめまして!

はじめまして! 株式会社MNUで新しくブログを始めます。 主に、プログラムに関する技術的なことを中心に社員が持ち回りで書いていきます。 皆様のお役に立てれば幸いです。 どうぞ、これからよろしくお願いします。 ここから下はコードを表示するサンプルです。 int x = foo(); /* This is a comment This is not code Continuation of comment */ int y = bar(); // This is line 4. foo(); bar(); baz(); boo(); far(); faz(); sh for target do WORKDIR=$(mktemp -d "$EXTRACTHOMEDIR"/XXXXXX) case "$target" in *.[Tt][Gg][Zz]|*.[Tt][Aa][Rr].[Gg][Zz]|*.[Tt][Aa][Rr].[Zz]) tar vzxf "$target" -C "$WORKDIR" move_to_currentpath "$WORKDIR" "$target" ;; *.[Tt][Bb][Zz]|*.[Tt][Aa][Rr].[Bb][Zz]2) tar vjxf "$target" -C "$WORKDIR" move_to_currentpath "$WORKDIR" "$target" ;; *.[Gg][Zz]) gzip -d "$target" move_to_currentpath "$WORKDIR" "$target" ;; *.[Zz][Ii][Pp]|*.[JjWw][Aa][Rr]) check_required_pro