django-distllを用いてDjangoの静的ページを生成する


はじめに

Djangoを用いて作成したwebページをNetlifyにてデプロイをしたい.
それには,静的ページを作ることが必要なので,django-distillライブラリで静的ページを作成する時のメモ

やること:urls.pyの変更

urls.pyで変更するのは次の二つ


表示するすべてのページそれぞれのリンクをイテレートできる様にする

URLに引数がある場合,その引数として渡されるものをすべてイテレートできる関数を作る

引数があるURLの例:

path('<str:cateogry>/<str:subcategory>/<str:post>', views.animal, name='animal')


例えば,記事に対してカテゴリ(animal,food),とサブカテゴリ(dog,cat,meet,pasta)があって,次の様に割り当てられるとする.

# animalカテゴリ
animal/dog/post1
animal/dog/post2
animal/cat/post3

# foodカテゴリ
food/meet/post4
food/mpasta/post5

これら計5つに対して,URLにある変数名をキーに対応させて,辞書を返すイテレータを作る.

イテレータの例;

def get_categories():
    cat_sub_pos = [
        ('animal', 'dog', 'psot1'),
        ('animal', 'dog', 'psot2'),
        ('animal', 'cat', 'psot3'),
        ('food', 'meet', 'psot4'),
        ('food', 'pasta', 'psot5'),
    ]
    for cat, sub_cat, post in cat_sub_pos:
      yield {'category': cat, 'subcategory': sub_cat, 'post': post} 



urlpatternsをdistillバージョンにする

path()をdistill_pathにする

例:

# 追加
from django_distill import distill_path

urlpatterns = [
    distill_path('', views.index, name='index',
        distill_file='index.html'),

        distill_path('<str:cateogry>/<str:subcategory>/<str:post>', views.post, name='post',
                      distill_func=get_posts),
]









別リンクに飛ばす

view.pyにて,別リンクにリダイレクトさせようとすると,HTTP302が返ってくる.
デフォルト設定ではHTTP200ステータスしか受け付けないので,このままだとエラーになる.

views.py

def shop(request):
    return redirect('https://suzuri.jp/nanimoshitakunai?utm_source=others&utm_medium=social&utm_campaign=shop_share')


python ./manage.py distill-local 実行後エラー

CommandError: View returned an invalid status code: 302 (expected one of (200,))


対処

HTTP200ステータス以外にも受け付ける様にするには,distil_status_code 引数を指定する.

urls.py

urlpatterns = [
    distill_path('omiyageshop', views.shop, name='shop',
        distill_status_codes=(200, 302)),
]


これでエラーは出なくなってデプロイはできるけど,結局そのリンクに飛んでくれない...
リダイレクトは

参考:https://django-distill.com/integration

URLが共通するとエラーが起こる場合ある

例えば,次の様な場合にはNotADirectoryErrorが生じる.
/AAA > a.html
/AAA/BBB > b.html

原因:ディレクトリ構造によるもの

例えば次のようなURLがある静的サイトを生成する
/aaa
/bbb
/ccd/ddd
このとき,各ページには拡張子なしファイルが生成され,ページには該当しない要素にはディレクトリが生成される.
root
|- aaa(拡張子なしファイル)
|- bbb(拡張子なしファイル)
|- ccc
|- ddd(拡張子なしファイル)

このため,拡張子なしファイルと同じ名前のディレクトリを生成することができないため,エラーが生じてしまうので注意が必要.




現時点で考えていること

URL遷移について

nameを指定して,htmlから引数渡される
→nameのurlがview.pyに引数ごと飛ばす
その引数がURLになる.
→view.pyがhtmlの選択をして,それに中身渡す.


distill_funcについて

urlとなるpathを作る.それに従って,htmlファイルをあらかじめ作っておく.


コマンドについて

--force
全ての質問をyesで返す.



わかった問題点.課題.


url遷移

htmlファイルのaタグで渡した引数が,views.pyに渡されない.
{{% url "hoge:urln_ame" category.id %}}
HTMLから渡された引数がそのままURLになる.
URLで引数のやり取りをするみたいだ.

HTMLで渡した引数は位置引数以外無理.
Djangoではhtmlでキーワード引数もいけるはず.
django-distillのせい.

viewの引数

引数で**kwargsってやってたら,イイカト