はじめに
Djangoを用いて作成したwebページをNetlifyにてデプロイをしたい.
それには,静的ページを作ることが必要なので,django-distillライブラリで静的ページを作成する時のメモ
やること:urls.pyの変更
urls.pyで変更するのは次の二つ
- 表示するすべてのページそれぞれのリンクをイテレートできる様にする
- urlpatternsをdistillように書き換える
表示するすべてのページそれぞれのリンクをイテレートできる様にする
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ってやってたら,イイカト