본문 바로가기
개발일지/Django

Django - markdownx, ImportError: cannot import name 'url' from 'django.conf.urls' 해결

by 개발에정착하고싶다 2023. 1. 4.

현재 진행하는 교재가 "Do it 장고+부트스트랩 파이썬 웹개발의 정석" 이라는 책으로 진행하고 있다.
430페이지 즈음에

pip install markdownx를 하라고 했다.

그 이유는 "포스트에 대해서 줄바꿈이 반영되어서 노출되기 위해" 였다.

 

markdownx를 설치하고 사용하려고 하니

ImportError: cannot import name 'url' from 'django.conf.urls'

라는 에러가 떴다.

물론 뒤의 경로야 더 있지만 그건 컴퓨터 마다 경로가 다르기 때문에 그냥 생략했다.


#1 원인분석

 

자료를 조사하다보니 markdownx는 django내부적으로 url을 활용하여 진행하는 라이브러리인데,

심플하게 Django3.x 버전까지는 지원이 되었으나

Django 4.x 버전부터는 지원이 안된다고 한다 ㅡㅡ;


#2 방법들

 

방법을 찾아보니 2가지가 있었다.

 

첫번째 - pip uninstall django

를 해주고

pip install django==3.2

를 해줘서 즉 장고를 3.x버전으로 만드는 방법이다.

 

두번째

markdownx가 Django4.x버전과 호환되는 방법이 있다고있었다.

https://neutronx.github.io/django-markdownx/

 

Django Markdownx

Django MarkdownX Django MarkdownX is a comprehensive Markdown plugin built for Django, the renowned high-level Python web framework, with flexibility, extensibility, and ease-of-use at its core. GitHub: https://github.com/neutronX/django-markdownx PyPi: ht

neutronx.github.io


#3 적용해보기

 

우선 #2의 첫번째 방법은 너무 쉬워서 보류했다.

사실 저것 만으로도 해결은 가능한 문제니깐

 

하지만 나는 그런 방법을 쓰기는 싫었다.

쉬운방법을 선호하지만, 버전의 다운그레이드는 내 기준에서 분명히 덜떨어지는 부분도 있을것이고..

내가 알기로는 하둡등에 대한 호환문제로 JAVA는 8버전을 주로 쓰는걸로 알고있는데 그런 특별케이스를 제외하고는

가급적이면 최신버전에서 하향한다는 부분에 있어서 타협을 하기 싫었다.

그래서 Django4.x의 최신버전을 유지하면서 markdownx를 적용할 수 있는 방법을 찾으려고 했다.

 

문제는 django-markdownx의 공식문서로 추정되는 링크의 방법을 따라하는 과정이였다.


1)

당연하게도 기능은 알고있으니 Django MarkdownX의 프리뷰는 볼필요가 없었다.


2)

Installation에 나와있는 이것들을 해주었다.

python3 -m pip install django-markdownx
git clone https://github.com/adi-/django-markdownx.git
cd django-markdownx/
python3 setup.py install

3)

Getting Started에 나와있는 이것들을

바로 이전 단계였던 Installation에서 clone으로 따게 된 markdown 내부의 settings.py가 아니라

내가 사용하던 기존 프로젝트의 settings.py에다가 셋팅해주었다.

 

참고

나의 프로젝트 경로의 settings.py는

do_it_django_prj/settings.py

이고

새로 클론으로 따온 settings.py는

django-markdownx/settings.py

였다.

클론만 받아오고 건드리지도 않았으며

메인프로젝트 폴더와 동등선상에 클론을 떴다.


4)

그랬더니 서버작동은 되는데 안의 내용물이 다 날라가고 base.html에 해당하는 뼈대만 남았다;


5)

그리고 생각을 했다.

왜 서버는 작동되는데, 이게 이모양일까....

 

그리고 기억이 떠올랐다.

"아... 내가 데이터베이스 다 날렸지..."

그렇다. 내가 데이터베이스 파일 자체를 아예 삭제해버렸다.

slug등 뭔가의 문제가 있다고 느껴서 이왕이면 좀 깔끔하게 꺼림직한것없이 시작해보고 싶어서.. 

makemigrations, migrate로 데이터베이스 뼈대는 만들어올수있으니깐!

 

뭐 말은 길었는데 아무튼 장장 4시간만에 해결!!


#4 추가조정

 

해결되었다고 생각하고 사용하다보니 또다시 

modulenotfounderror: no module named 'markdown.utils'

이런류의 에러가 나타나기 시작했다.

아직 100%라고 말하긴 어렵지만, 최소한에 지금까지는 또다시 해결하는 방법이 있다.

기존에 #3의 2)에 깃 클론하는게 나온다.

그리고 깃 클론을 하고나면 폴더명이 "django-markdownx"라는 이름을 시작으로

그 안에 정말 많은 폴더와 자료들이 있다.

 

추후에 어떻게 작용할지는 모르겠으나,

django-markdownx는 "-"이 표시때문에 import가 안되는듯 하여

그 안에 있는 "markdownx"라는 이름의 폴더를 내가 현재 이어붙여서 사용하고 있는

app단위의 폴더안에 넣어주었다.

경로를 보자면

<app단위>/markdownx

가 되는거고

실질적으로는

blog/markdownx

라고 써줬다.

 

그리고 기존의 도서에서 소개된 markdown의 임포트 방법은

from markdown.admin import MarkdownxModelAdmin
from markdown.models import MarkdownxField
from markdown.utils import markdown

이런식으로 나왔다.

하지만 바로 위의 과정처럼 내가 주로 사용하고있는 app단위의 폴더에 넣어서

from markdownx.admin import MarkdownxModelAdmin
from markdownx.models import MarkdownxField
from markdownx.utils import markdown

이렇게 사용해 주었더니 작동은 되었다.(그런데 마크다운 적용은 안된다;)

음... 좀 더 연구해봐야겠다.


#5 후문

 

내가 markdownx가 필요했던 이유는 html 상에서는 들여쓰기가 안되서이다.

이를테면 안지영 볼빨간 사춘기

가아니라

안지영

볼빨간 사춘기

라고 별도의 html문법으로 작성하지 않고 일반 글쓰듯이 써도 들여쓰기가 되게끔 만들어주고 싶었는데

markdownx는 이렇게 해도 안되고 저렇게 해도 안되었다.

 

그래서 생각하다 생각하다 떠오른게

django-html인지 오리지널 html문법인지는 모르겠으나 (django-html일 확률이 큼)

더블컬리브레이스를 사용해준 인자 안에 linebreaks 필터를 거는 것이다.

{{ p.content|linebreaks }}

이런식으로. 그러면 간단하게 html 문법 없이도 일반 에디터 처럼 들여쓰기가 된다.