ローカルでも動くPython3+Djangoを使ったアップローダーなんかを作ってみる 2

ローカルでも動くPython3+Djangoを使ったアップローダーなんかを作ってみる 1 の続き。

※8/20 よりDJangoで作成するプロジェクト名を uploader から sites_project に変更

まだ小生もおぼつかないところが多いため、冗長な点、不足な点が多いと思うので、コメント等いただけたら幸いです。

[amazonjs asin="B00P8DQZY4″ locale="JP" title="Lightweight Django"]

setting.pyを編集

Djangoではプロジェクト内に共通して設定するものは sites/sites_project/sites_project/settings.py に設定されている。
現段階では触らなくてもよい項目も多いため、はじめに最小限に設定する項目を編集、追記していく。

[python title="settings.pyの内容"]

・・・・・

# 日本語の場合は jp ではなく ja に。
LANGUAGE_CODE = 'ja’

# タイムゾーンを設定。
TIME_ZONE = 'Asia/Tokyo’

# slashなしのURLをslashありにリダイレクトする設定を追記。
APPEND_SLASH = True

・・・・・

STATIC_URL = '/static/’

# 静的ファイル(css、js、img等)をsites/staticディレクトリにおく設定を追記。
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"),
)

[/python]

 

データベースをmigrate

まだデータベースを利用していないが、予めmigrateしておく。
ここらへんはデータベースを扱うようになってから分かる範囲で解説を入れる。

[shell]
$ python manage.py migrate
[/shell]

 

https://localhost:8082/admin にアクセスした際にログインする管理者ユーザーを作成する。

 

管理者ユーザーの作成

[shell]
$ python manage.py createsuperuser
Username (leave blank to use 'username’):
Email address:
Password:
Password (again):
Superuser created successfully.
[/shell]

 

アプリケーションを作成

uploader というアプリケーションを作成する。
アプリケーションの作成は sites/sites_project/manage.pyを使う。

[shell]
$ python manage.py startapp uploader
[/shell]

忘れがちだが、アプリケーションを作成したらアプリケーションがあることをsettings.pyを通じてDjangoに教える必要がある。sites/sites_project/sites_project/settings.pyのINSTALLEDD_APPSに追加しておく。

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'uploader',
)

 

views.pyの編集

作成したアプリケーションのディレクトリの中にviews.pyというファイルがある。(sites/sites_project/uploader/views.py)
これは、GETやPOSTなどのリクエストとテンプレートに渡したり、どのHTMLテンプレートファイルを使用するかを指定するなど、表示に関わるところをカバーする。

今回はとりあえずトップページだけ作成する想定で、次のように編集した。

[shell]
sites/uploader/views.py

# -*- coding: utf-8 -*-
from django.shortcuts import render
from django.http import HttpResponse
from django.shortcuts import render_to_response
from django.template import RequestContext

def top_page(request):
"’トップページ"’

return render_to_response('uploader/top_page.html’, # 使用するテンプレートを指定
{}, # テンプレートにデータを渡すときに辞書式で指定。
context_instance=RequestContext(request)) # その他標準のコンテキスト

[/shell]

よくわからない場合は、現段階ではなんとなくコードを書くだけでいい。
簡単に解説すると、後のほうでurls.pyというところであるURLにアクセスが来た際に、views.pyの中に定義した関数を呼び出すようにする。
たとえば、https://localhost:8082/uploader/top にアクセスが来たらtop_page関数が呼び出される。
呼び出されたら、top_page.htmlテンプレートを開くんだなぁ、くらいにとらえておいてもらえれば十分。

 

URLディスパッチャー

今回は、https://localhost:8082/uploader というURLを作成してツールを公開したいとする。
DjangoにはURLディスパッチャーという、https://localhost:8082/配下に https://localhost:8082/admin や https://localhost:8082/uploader などのアプリケーションごとにURLを割り振ったり、
更にそのアプリケーションごとに、例えばhttps://localhost:8082/uploader/top や https://localhost:8082/uploader/uploadなどのURLを割り振るための機能がある。

sites/sites_project/sites_project/urls.pyは上の例では前者のアプリケーション単位でのURLを割り振る設定ファイルで、
後者の各アプリケーション事のurls.pyは、各アプリケーションごとに自分で作成する必要がある。

具体的には以下のように設定していく。

まずsites/sites_project/sites_prject/urls.py には、 uploader/ にアクセスが来た場合は uploader/urls.pyに記述されているようにディスパッチすると記述する。(追記の部分)

[shell title="sites/sites_project/sites_prject/urls.pyの内容"]
urlpatterns = [
url(r’^admin/’, include(admin.site.urls)),
url(r’^uploader/’, include('uploader.urls’, namespace=’uploader’)), # 追加

]
[/shell]

今回は更にuploader/top のようにURLを作成したいため、
url()関数の2つ目の引数で、uploader/ へアクセスが来た場合はsites/sites_project/uploader/urls.pyを参照するように指定している。

sites/sites_project/uploader/urls.py

# -*- coding: utf-8 -*-
from django.conf.urls import patterns, url
from uploader import views

urlpatterns = patterns('',

    url(r'^/top$', views.top_page, name='top_page'),   
)

/top にアクセスが来ると、上でviews.pyに定義したtop_page関数が実行される。

 

テンプレートファイルの作成

views.pyでtop_page.htmlテンプレートファイルを使うと宣言しておいてまだ作っていないので作成する。
その前に、今後いま作成中のツールは複数ページにまたがって作成されることを考慮して、ベースのテンプレートファイルを用意しておき、各ページを作成する際にはそのベースファイルを基にページを構成していくようにすると製作コストが下がる。

sites/uploader/templates/にbase.htmlを作成する。

テンプレートファイルの書き方もあとでそれほどの分量ではないけどまとめる。
まず以下のように作成しておく。

[html title="sites/uploader/templates/base.htmlの内容"]
{# staticfiles(js,css, imgなど)を使えるように宣言 #}
{% load staticfiles %}

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
{# 各ページごとにタイトルを入れたい場合用 #}
<title>アプロダ {% block title %}{{ title }}{% endblock %}</title>
<link rel="stylesheet" href="">
{# 各ページごとにヘッダ情報を入れたい場合用 #}
{% block header %}
{{ header }}
{% endblock %}
</head>
<body>

</body>
</html>

</head>
<body>
<div class="container">
{% block content %}
{{ content }}
{% endblock %}
</div>
</body>
</html>
[/html]

さて、いよいよトップページを作成する。
sites/uploader/templates/uploader/ に top_page.html を作成する。

[html title="sites/uploader/templates/uploader/top_page.html"]

{# base.htmlを使うことを宣言 #}
{% extends "base.html" %}

{% block title %}トップページ{% endblock title %}

{% block extrahead %}
{% endblock %}

{% block content %}
<div>
テスト
</div>
{% endblock content %}
[/html]

さて、動くかどうか確かめる。
magnage.pyを使ってサーバーを起動する。

[shell]
(sites) $ cd ~/sites
(sites) $ python manage.py runserver localhost:8082

[/shell]

ブラウザで https://localhost:8082/uploader/top にアクセスする。

スクリーンショット 2015-08-20 17.57.17

表示された!!!
うまくいかない場合は、

・urls.pyの設定に不備
・views.pyの記述に不備
・テンプレートファイルの記述に不備

あたりが考えられる。
どうしてもわかれなければエラー内容を貼り付けてコメントください。

次回、それらしいサイトになるようにBootstrap と jQuery を導入。