#ここに記述するのはVisualStudioCodeのチュートリアル(英文)を引用した内容である。
1_ テンプレートを使ってページをレンダリングする
このチュートリアルでこれまでに作成したアプリは、PythonのコードからプレーンテキストのWebページを生成するだけでした。コード内で直接HTMLを生成することは可能ですが、クロスサイトスクリプティング(XSS)攻撃を受ける可能性があるため、開発者はそのような行為を避けています。例えば、このチュートリアルのhello_there関数では、content = "<h1>Hello there, " + clean_name + "!</h1>"のようなコードで出力をフォーマットしようと考えるかもしれませんが、ここでcontentの結果は直接ブラウザに渡されます。このような場合、攻撃者はJavaScriptのコードを含む悪意のあるHTMLをURL内に配置し、clean_nameで終了させ、ブラウザで実行させることが可能になります。
より良い方法は、テンプレートを使って HTML をコードから完全に排除し、コード がデータの値だけに関係し、レンダリングには関係しないようにすることです。
Django では、テンプレートは、コードが実行時に提供する値のプレースホルダを含む HTML ファイルです。そして、 Django のテンプレートエンジンは、ページをレンダリングする際に置換を行い、XSS 攻撃を防ぐために自動的なエスケープを提供します (つまり、データ値に HTML を使おうとすると、HTML はプレーンテキストとしてのみレンダリングされることがわかります)。従って、コードはデータ値のみに関係し、テンプレートはマークアップのみに関係します。Django のテンプレートは、テンプレートの継承のような柔軟なオプションを提供し、共通のマークアップを持つベースページを定義し、そのベース上にページ固有の追加を行うことができます。
この節では、まずテンプレートを使って 1 つのページを作成します。以降の節では、静的ファイルを提供するアプリを設定し、ベーステンプレートからそれぞれナビバーを含む複数のページをアプリに作成します。Django テンプレートは、このチュートリアルの後半でテンプレートのデバッグの文脈で見るように、 制御フローと反復もサポートしています。
2_ web_project / settings.pyファイルで、INSTALLED_APPSリストを見つけて、<フォルダ(アプリ)名>を追加します。これにより、プロジェクトがアプリについて認識し、テンプレートを処理できるようになります。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'<フォルダ(アプリ)名>'
]
<フォルダ(アプリ)名>内に、templatesという名前のフォルダーを作成し、次に<フォルダ(アプリ)名>という名前の別のサブフォルダーを作成してアプリ名と一致させます(この2層のフォルダー構造は一般的なDjangoの規則です)。
templates / <フォルダ(アプリ)名>フォルダーに、以下の内容のhello_there.htmlという名前のファイルを作成します。 このテンプレートには、「name」と「date」という名前のデータ値の2つのプレースホルダーが含まれています。これらは、中括弧{{と}}のペアで表されます。 他のすべての不変のテキストは、フォーマットマークアップ(<strong>など)とともにテンプレートの一部です。 ご覧のとおり、テンプレートプレースホルダーには、フォーマット、パイプの後の式を含めることもできます。 シンボル。この場合、Djangoの組み込みの日付フィルターと時間フィルターを使用します。 コードは、事前にフォーマットされた文字列ではなく、日時の値を渡すだけで済みます。