デプロイ処理を追加するまでの内容のアプリケーションをクラウドサービスにデプロイ、またはWindows Azureエミュレータで実行してDjango管理サイトにアクセスすると、スタイルシートの適用や画像の表示を伴わない淡白な画面表示となってしまいます。
Djangoアプリケーション作成の経験がある方はご存知の通り、Django標準の開発サーバではなく実際のWebサーバ上でDjangoアプリケーションを運用する場合は、アプリケーションで使用される画像やスタイルシート、JavaScriptなどの静的ファイルを、Webサーバ上の適切なロケーションにまとめて配置しておくことが必要です。以下ではその方法について説明します。
クラウドサービス上のDjangoアプリケーションから静的ファイルを供給する場合は、予め静的ファイルの収集を行った状態でアプリケーションをパッケージングしてデプロイする必要があります。静的ファイルの収集に関する手順は一般のDjangoアプリケーション開発の場合と同様です。
ここでは、クラウドサービスパッケージ内のDjangoプロジェクトの中に新しいフォルダ(azure-python/mysite/mysite/staitc)を作成し、そこに静的ファイルを収集することにします。
上記のフォルダを作成後、Djangoプロジェクト内のsettings.pyをエディタで開き、STATIC_ROOTおよびSTATIC_URLの設定値を以下のように変更してください。
# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/home/media/media.lawrence.com/static/"
import os
STATIC_ROOT = os.path.join(os.path.dirname(os.path.abspath(__file__)),
os.pardir,
'static')
# URL prefix for static files.
# Example: "http://media.lawrence.com/static/"
STATIC_URL = '/mysite/static/'
次にコマンドプロンプトでDjangoプロジェクトのフォルダに移動して以下のコマンドを入力します。
> python manage.py collectstatic
コマンドの実行が完了したら、作成した上記のフォルダ内にadminアプリケーションで使用される各種の静的ファイルが収集されていることを確認してください。
デプロイ処理を追加するではデフォルトのデプロイ処理モジュールの処理内容について説明しましたが、このモジュールにより行われるFastCGI設定では、静的ファイルを含む全てのリクエストがDjangoアプリケーションを実行するPythonプロセスに転送されるように設定されます。ですが静的ファイルのリクエストについてはアプリケーションでは処理できません。そのため、先の手順で収集された静的ファイルに対するリクエストについては、Pythonプロセスで処理せずにWebサーバからコンテンツが直接供給されるよう設定し直す必要があります。
Django Webロールに含まれているデフォルトのデプロイ処理モジュールは、FastCGIを処理するPythonプロセスを実行するための「Python_via_FastCGI」という名前のリクエストハンドラをIISに登録し、そのハンドラで全てのリクエストを処理するように設定を行います。また、Django Webロールのフォルダに予め含まれているIISのWebサイト設定ファイルでも、「Django FastCGI」という名前で同様のリクエストハンドラが設定されるように記述されています。
そこで、先に作成した静的ファイル収集用のフォルダ内のコンテンツについては、上述のリクエストハンドラを使用せずに処理するよう、IISのWebサイト設定ファイルを記述します。静的ファイル収集先として作成したstaticフォルダの中にweb.configという名前のファイルを作成し、その内容を以下のように記述してください。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers>
<remove name="Python_via_FastCGI" />
<remove name="Django FastCGI" />
</handlers>
</system.webServer>
</configuration>
これにより、静的ファイルが収集されたフォルダ内のコンテンツについては、FastCGIのPythonプロセスではなく、IISが通常の静的ファイル供給で使用するリクエストハンドラにより処理されるようになります。
この状態でWindows Azureエミュレータを起動、またはパッケージを再作成のうえクラウドサービスにデプロイしてDjango管理サイトにアクセスすると、静的ファイルも適切に供給されている状態の外観となっているはずです。
なお静的ファイルの供給については、クラウドサービスのWebサーバから供給する以外に、Windows AzureストレージのBLOBコンテナより供給する方法もあります。ここでの詳細な説明は省略しますが、静的ファイルを含めることでパッケージの容量が肥大化してしまう、あるいは、CDNを利用して送信速度の向上を図りたい、などの場合にはこちらの方法が有効です。