はじめに
PythonのWebアプリケーションdjangoで管理している時間・時刻をJSON形式でJavaScriptに渡したり,あるいはJavaScriptからAjaxを使ってJSON形式を介してサーバ側のdjangoに渡したりします.ここでは,年月日及び時分秒に加えミリ秒でのやりとりも行います.
サーバ側:データベースモデルの確認と準備
まず,バックエンドのデータベースシステムのDateTime型など時間型のフォーマットがミリ秒やマイクロ秒までサポートしているかどうか確認してください.MySQLでは5.6.4からマイクロ秒までをサポートしているようです.MySQL 5.6.4 and up expands fractional seconds support for
TIME
, DATETIME
, and TIMESTAMP
values, with up to microseconds (6 digits) precision(引用 2014年5月14日)ただ,ここではバックエンドのデータベースがミリ秒やマイクロ秒までをサポートしていない物として進めます.
そこで,DateTimeフィールドの他に,マイクロ秒を記録するフィールドを作成します.
# models.py from django.db import models class TimeSample(models.Model): ''' マイクロ秒を記録するために整数型フィールドのdatetime_microを設けます ''' datetime = models.DateTimeField() datetime_micro = models.IntegerField(default=0)
クライアント側: dateformat.jsの準備
JavaScriptで,サーバからString型の日時を受け取りDate型に変換する必要があります.変換にはdateformat.jsが便利です.dateformat.jsはMITライセンスで配布されていますので,以下からダウンロードしましょう.http://www.enjoyxstudy.com/javascript/dateformat/
いつもの通り,HTMLから読み込みます.
<script type="text/javascript" src="{{ static_url }}scripts/dateformat.js"></script>
クライアント側:jQueryとjQueryのJSONプラグインの準備
JavaScriptでサーバと通信したり,JSON形式を送信用に作成したり,受信時に解析したりするためにjQueryとそのプラグインを使います.以下からそれぞれダウンロードしましょう.jQuery本体 http://jquery.com/
jQueryのJSONプラグイン https://code.google.com/p/jquery-json/downloads/list
で,HTMLに追加;;
<script type="text/javascript" src="{{ static_url }}scripts/json-x.xx.x.js"></script> <script type="text/javascript" src="{{ static_url }}scripts/json.json-x.x.js"></script>
JavaScriptからPythonに時間を渡す(Ajax)
クライアント
クライアントからJavaScriptでサーバ側のdjango(python)に日時を渡します.jQueryの$.ajaxから非同期バックグラウンドで送信しましょう.(POSTで送る場合,CSRF関連があるかもしれませんが,個々では割愛します.)ここでは,送信時のDateフォーマットを""yyyy-MM-dd HH:mm:ss:SSS"とします.SSSはミリ秒です.
// JavaScript // 送信用フォーマットの日付を作成
var date = new Date(); var dateFormat = DateFormat("yyyy-MM-dd HH:mm:ss:SSS"); var dateStr = dateFormat.format(date); var sendData = {'datetime': dateStr}; // 送信 $.ajax({ url: "http://www.xxxx.com/", type: "POST", contentType: "application/json; charset=utf-8", datatype: "json", data: $.toJSON(sendData), success: function(data) { alert("送信成功"); }, error: function() { alert("失敗"); } });
サーバ側
クライアントからJSON形式で送られてきた日時の情報を取得し,データベースに記録します.# views.py from models import * from datetime import datetime from django.http import * import json as simplejson def requested_json_datetime(request): ''' リクエストされた日時をデータベースに記録します ''' data = simplejson.loads(request.body) time = datetime.strptime(data[u'datetime'], '%Y-%m-%d %H:%M:%S:%f') model = TimeSample(datetime=time, datetime_micro=time.microsecond) model.save() return HttpResponse("success")実際にはミリ秒ですがサーバ側ではマイクロ秒のオーダーで保存します.
PythonからJavaScriptに時間を渡す
今度はサーバ側からJavaScriptにJSONで時間を渡してみましょう.クライアント側
サーバに「時間くださいよ~!」ってリクエストしましょう.取得したJSONからDate型を作成します.
var dateFormat = new DateFormat("yyyy-MM-dd HH:mm:ss:SSS"); var date = dateFormat.parse(responsedData.datetime);
サーバ側
データベースを参照してDateTime型の値を取得します.strftime()関数でDateTimeを文字列型に変換できます.変換するときのフォーマットの指定方法はhttps://docs.python.org/2/library/datetime.html#strftime-strptime-behavior で紹介されています.例えば次のようにすると,送信時とほぼ同じフォーマットの文字列を作成できますが,%fはミリ秒ではなくマイクロ秒であるという違いがあります.
sample = TimeSample.objects.get(id=1) dt = sample.datetime dt = dt.replace(microsecond=sample.datetime_micro) str = dt.strftime("%Y-%m-%d %H:%M:%S:%f")
これではマイクロ秒でレスポンスしてしまいますので,ここでは手作業で変換しました.単純に1000で除算してマイクロ秒からミリ秒に変換しています.
sample = TimeSample.objects.get(id=1) dt = sample.datetime dt = dt.replace(microsecond=sample.datetime_micro) str = "%04d-%02d-%02d %02d:%02d:%02d:%03d" % ( dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond / 1000, )
ではstrをJSONにしてレスポンスしましょう.
data = {'datetime': str} json = simplejson.dumps(data) return HttpResponse(json)