간단한 팁 하나 올립니다. django에서 가끔 로컬에서 DEBUG=False로 놓고 테스

 
박영록

간단한 팁 하나 올립니다. 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 애플리케이션 하나 돌려보려다보니 이것 때문에 걸려서 여기까지 왔네요. 또 다음 삽질은 뭐가 될런지…

  • Kyeong-Mook Kay Cha

    저는 이렇게 쓰곤 합니다. 동작 자체는 설명하신 것과 동일합니다.

    # 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)

    TaeWoong Kim

    꿀팁 감사합니다.

    JunHaeng Joshua Lee

    제 삶의 질을 +10 올려주셨습니다 감사합니다 …
    (view->views)

    Sean Kang

    꿀팁이네요!
    pipeline을 쓰신다면, 아래와 같이 STATICFILES_STORAGE를 바꿔주는 등 추가 설정 필요합니다!
    STATICFILES_STORAGE = ‘pipeline.storage.NonPackagingPipelineStorage’
    PIPELINE[‘PIPELINE_ENABLED’] = False