LoginSignup
0
1

More than 3 years have passed since last update.

DjangoのMarkdownx をサイトルート以外で使う

Last updated at Posted at 2020-02-18

DjangoではMarkdownx というパッケージを使って、プレビューを出しながらマークダウン記法で書かれたソースのデバッグができる。
これはかなり便利なのだけど、Markdownx は、Djangoプロジェクトがサイトルート以外にデプロイされていると対応してくれない。

たとえば、

apache2.conf
WSGIScriptAlias /prefix /django/project/project/wsgi.py

のようになっている場合、Markdownx のURLとしては
/prefix/markdownx/markdownify のようになってくれないと困るが、Markdownxのコードでは、markdownx/settings.pyの中で固定値で書かれたものを使っているため、/markdownx/markdownifyにアクセスしようとして404になる。

これを回避するには、以下のようにすればよい。

  1. プロジェクトのurls.py でmarkdownxのincludeにnamespaceを指定しておく(markdownxとする)
  2. markdownx/widgets.py 内の`attrs.updateのうち、URL部分をreverse()で書き換える

検索で引っかかってくるMarkdownxの解説では、urlpatternsにnamespaceを指定してしないものもあるので、以下のようにnamespaceを指定しておく。

settings.py
urlpatterns = [
    path('markdownx/', include(('markdownx.urls','markdownx'))), 
      :

続いて、markdownx/widgets.py(各環境の site-packages内にある)だが、元は以下のようになっている。(どこにあるんだよ、って時は、定番のfindで、
sudo find / -name 'widgets.py' | grep markdownx
で探しましょう。settings.pyもそこ。)

widgets.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つを以下のように書き換える。

widgets.py(改変後)
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サイト(こいつがサイトルート)に追加でデプロイという関係からちょっとハマってしまった。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1