【Python】FullCalendar を使ったWEBページを作ってみる

2018年6月18日Javascript,Python,開発

おはようございます。

ちょっと前に、JQueryプラグインの「FullCalendar.js」を使って
カレンダーを表示するサンプルを作ってみましたが、
今回は PythonでWEBサーバーを立てて、実際にサーバーとやりとりするサンプルを作ってみました。

FullCalendarの記事はこちら。

スポンサーリンク

プロジェクトの作成

PyCharmを利用していきます。
プロジェクトの作成方法は次の記事を参考にしていただければ。

プロジェクトの構成は次の通り。

CalendarSample
│ Main.py

├─static
│ ├─css
│ │ fullcalendar.min.css
│ │ fullcalendar.print.min.css
│ │ style.css
│ │
│ ├─js
│ │ fullcalendar.min.js
│ │ moment.min.js
│ │
│ └─lang
│ ja.js

└─templates
index.html

パッケージの追加

Tornadoを利用します。

次の記事を参考にパッケージを追加してください。

プログラム

画面

index.html

<!DOCTYPE html>
<html>
	<head>
		<title>カレンダーサンプル</title>
		<link rel="stylesheet" href="{{ static_url('css/fullcalendar.min.css') }}"/>
		<link rel="stylesheet" href="{{ static_url('css/style.css') }}"/>
		<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
		<script type="text/javascript" src="{{ static_url('js/moment.min.js') }}"></script>
		<script type="text/javascript" src="{{ static_url('js/fullcalendar.min.js') }}"></script>
		<script type="text/javascript" src="{{ static_url('lang/ja.js') }}"></script>
		<script>
			// ページ読み込み時の処理
			$(document).ready(function () {

			// カレンダーの設定
			$('#calendar').fullCalendar({
				height: 550,
				lang: "ja",
				header: {
					left: 'prev,next today',
					center: 'title',
					right: 'month,basicWeek,basicDay'
				},
				selectable: true,
				selectHelper: true,
				navLinks: true,
				events: {
					url: 'http://localhost:8080/getCalendar',
					error: function() {
						$('#script-warning').show();
					}
				},
				select: function(start, end) {
					var title = prompt("予定タイトル:");
					var eventData;
					if (title) {
							eventData = {
							title: title,
							start: start,
							end: end
						};
						$('#calendar').fullCalendar('renderEvent', eventData, true);
					}
					$('#calendar').fullCalendar('unselect');
					},
					editable: true,
					eventLimit: true,
				});
			});
		</script>
	</head>
	<body>
		<div id='calendar'></div>
	</body>
</html>

style.css

body {
	margin: 40px 10px;
	padding: 0;
	font-family: "Lucida Grande",Helvetica,Arial,Verdana,sans-serif;
	font-size: 14px;
}
#calendar {
	max-width: 900px;
	margin: 0 auto;
}		

html > body {
	font-family: 'Noto Sans Japanese','Segoe UI','Verdana','Helvetica','Arial', sans-serif;
}
.fc-left h2 {
	font-weight: normal;
}
.fc-widget-header th {
	background-color: #f8dbc6;
}
th.fc-day-header, th.fc-widget-header {
	color: #550000;
	font-size: 14px;
	font-weight: normal;
}
.fc-sun > span {
	color: #cd384b;
}
.fc-sat > span {
	color: #415ea6;
}
td.fc-sun {
	background-color: #fae6e3;
}
td.fc-sat {
	background-color: #dceef7;
}
.fc-unthemed .fc-content, 
.fc-unthemed .fc-divider, 
.fc-unthemed .fc-list-heading td, 
.fc-unthemed .fc-list-view, 
.fc-unthemed .fc-popover, 
.fc-unthemed .fc-row, 
.fc-unthemed tbody, 
.fc-unthemed td, 
.fc-unthemed th, 
.fc-unthemed thead {
	border-color: #d1ccd9;
}

.fc-ltr .fc-basic-view .fc-day-top .fc-day-number {
	float: left;
}

サーバー側

とりあえずデータはべた書きですが。

Main.py

import json
import logging
import os
import tornado.ioloop

from tornado.web import RequestHandler
from tornado.options import options

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("index.html")


class GetCalendar(RequestHandler):
    """
    カレンダー取得
    """

    def initialize(self):
        logging.info("GetCalendar [initialize]")

    def get(self):
        logging.info("GetCalendar [get]")
        data = [
            {
                "title": "All Day Event",
                "start": "2018-06-01"
            },
            {
                "title": "Long Event",
                "start": "2018-06-07",
                "end": "2018-06-10"
            },
            {
                "id": "999",
                "title": "Repeating Event",
                "start": "2018-06-09T16:00:00-05:00"
            },
            {
                "id": "999",
                "title": "Repeating Event",
                "start": "2018-06-16T16:00:00-05:00"
            },
            {
                "title": "Conference",
                "start": "2018-06-11",
                "end": "2018-06-13"
            },
            {
                "title": "Meeting",
                "start": "2018-06-12T10:30:00-05:00",
                "end": "2018-06-12T12:30:00-05:00"
            },
            {
                "title": "Lunch",
                "start": "2018-06-12T12:00:00-05:00"
            },
            {
                "title": "Meeting",
                "start": "2018-06-12T14:30:00-05:00"
            },
            {
                "title": "Happy Hour",
                "start": "2018-06-12T17:30:00-05:00"
            },
            {
                "title": "Dinner",
                "start": "2018-06-12T20:00:00"
            },
            {
                "title": "Birthday Party",
                "start": "2018-06-13T07:00:00-05:00"
            },
            {
                "title": "Click for Google",
                "url": "http://google.com/",
                "start": "2018-06-28"
            }
        ]

        self.write(json.dumps(data))

app = tornado.web.Application([
    (r"/", MainHandler),
    (r"/getCalendar", GetCalendar),
],
    template_path=os.path.join(os.getcwd(), "templates"),
    static_path=os.path.join(os.getcwd(), "static"),
)

if __name__ == "__main__":
    options.parse_command_line()
    app.listen(8080)
    logging.info("server started")
    tornado.ioloop.IOLoop.instance().start()

起動してみる

月間表示

前回のサンプルは月間のみでしたが、週表示、日表示もついでにやってみました。

週表示
日表示

まとめ

ひとまずこれでサーバー側とのやり取りができるようになりました。
次回は実際にデータベースを用いてデータの登録までやりたいと思います。

ではでは。

 

スポンサーリンク


関連するコンテンツ

2018年6月18日Javascript,Python,開発FullCalendar,JQuery,プログラミング

Posted by doradora