Help us understand the problem. What is going on with this article?

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした