간단한 팁 하나 올립니다. django에서 가끔 로컬에서 DEBUG=False로 놓고 테스트하고 싶을 때가 있죠? 그런데 그러면 static file이 서빙되지 않아서 원하는 테스트가 안될 때가 있습니다. django 공식 문서에서는 이럴 때 다음과 같이 안내하고 있죠.
https://docs.djangoproject.com/en/1.10/howto/static-files/#serving-static-files-during-development
근데, 이 방식을 하려면 STATIC_ROOT도 설정해야 하고 거기에 collectstatic 명령까지 써야 하죠. 별 것 아니라면 아니지만, 어차피 runserver에서 해주는 기능이라면서 왜 이렇게 어렵게 써야 할까요?
사실 더 쉬운 대안이 이미 django에 있습니다.
./manage.py runserver –insecure
이러면 static file serving이 됩니다. 근데, 이걸로도 충분하지가 않습니다. django에서 채팅 등을 비동기 기능을 구현할 때 runserver가 아니라 다른 서버를 띄워야 하는 경우가 있죠. 이 때는 심지어 DEBUG를 True로 놔도 static file이 서빙되지 않습니다. 로컬에서 nginx 없이 uwsgi만 띄워서 테스트하고 싶다든지 할 때도 마찬가지입니다. 이럴 때는 runserver –insecure로도 해결이 안되죠. 그래도 여전히 로컬에서 collectstaic 하기는 싫습니다. 그래서 runserver에서 어떻게 하는지 봤더니 간단하게 해결할 수가 있더군요.
runserver에서는 static 파일을 서비스해야하는 조건일 때 그냥 파일 경로를 django.contrib.staticfiles.view.serve에 넘겨줍니다. 그럼 그냥 이걸 그대로 urls.py에 넣으면 되겠죠. 그래서 다음과 같이 넣었습니다.
url(r’^static/(?P.+)’, serve, kwargs={‘insecure’: True})
잘 되더군요. 대체 왜 django 문서에서는 이 방법을 안내하지 않는지 의문입니다. 어차피 문서에 있는 방법도 insecure하기는 마찬가지인데 말입니다.
장난 삼아 wsgi server를 만들어보고 있는데, 만든 걸로 django 애플리케이션 하나 돌려보려다보니 이것 때문에 걸려서 여기까지 왔네요. 또 다음 삽질은 뭐가 될런지…
저는 이렇게 쓰곤 합니다. 동작 자체는 설명하신 것과 동일합니다.
# urls.py
from django.conf.urls.static import static
from django.conf import settings
urlpatterns = […]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT, insecure=True)
꿀팁 감사합니다.
제 삶의 질을 +10 올려주셨습니다 감사합니다 …
(view->views)
꿀팁이네요!
pipeline을 쓰신다면, 아래와 같이 STATICFILES_STORAGE를 바꿔주는 등 추가 설정 필요합니다!
STATICFILES_STORAGE = ‘pipeline.storage.NonPackagingPipelineStorage’
PIPELINE[‘PIPELINE_ENABLED’] = False