DjangoではMarkdownx というパッケージを使って、プレビューを出しながらマークダウン記法で書かれたソースのデバッグができる。
これはかなり便利なのだけど、Markdownx は、Djangoプロジェクトがサイトルート以外にデプロイされていると対応してくれない。
たとえば、
WSGIScriptAlias /prefix /django/project/project/wsgi.py
のようになっている場合、Markdownx のURLとしては
/prefix/markdownx/markdownify
のようになってくれないと困るが、Markdownxのコードでは、markdownx/settings.py
の中で固定値で書かれたものを使っているため、/markdownx/markdownify
にアクセスしようとして404
になる。
これを回避するには、以下のようにすればよい。
- プロジェクトの
urls.py
でmarkdownxのincludeにnamespaceを指定しておく(markdownxとする) -
markdownx/widgets.py
内の`attrs.updateのうち、URL部分をreverse()で書き換える
検索で引っかかってくるMarkdownxの解説では、urlpatterns
にnamespaceを指定してしないものもあるので、以下のようにnamespaceを指定しておく。
urlpatterns = [
path('markdownx/', include(('markdownx.urls','markdownx'))),
:
続いて、markdownx/widgets.py
(各環境の site-packages内にある)だが、元は以下のようになっている。(どこにあるんだよ、って時は、定番のfindで、
sudo find / -name 'widgets.py' | grep markdownx
で探しましょう。settings.pyもそこ。)
attrs.update({
'data-markdownx-editor-resizable': MARKDOWNX_EDITOR_RESIZABLE,
'data-markdownx-urls-path': MARKDOWNX_URLS_PATH,
'data-markdownx-upload-urls-path': MARKDOWNX_UPLOAD_URLS_PATH,
'data-markdownx-latency': MARKDOWNX_SERVER_CALL_LATENCY
})
大文字の変数は、markdownx/settings.py の中で定数として定義されていて、widgets.py
の頭のところでimportされている。これらのうち、_URLS_PATH
で終わる2つを以下のように書き換える。
from django.urls import reverse
:
attrs.update({
'data-markdownx-editor-resizable': MARKDOWNX_EDITOR_RESIZABLE,
'data-markdownx-urls-path': reverse('markdownx:markdownx_markdownify'),
'data-markdownx-upload-urls-path': reverse('markdownx:markdownx_upload'),
'data-markdownx-latency': MARKDOWNX_SERVER_CALL_LATENCY
})
これで、サイトルート以外にDjangoをデプロイしている場合にもMarkdownxを使うことができた。
まぁ、サイトルート以外で使う例はそれほどないのかもしれないけど、今回は既にあるPHPサイト(こいつがサイトルート)に追加でデプロイという関係からちょっとハマってしまった。