機械音痴な情報系

メモ帳.txt

【Docker・Django】pip installしてるはずなのにModuleNotFoundError + curlでAccess-Control-Allow-Originを表示させる方法

ずっとModuleNotFoundError

アプリケーションはpip installしてるはずなのにdockerのログを見るとModuleNotFoundErrorが出てる。
一応再インストールしてみるけどもう入ってると言われる。

$ curl -i http://localhost:8000/api/threads/?format=json
curl: (52) Empty reply from server

$ docker logs q-share-app-web
    :
    : 
  File "<frozen importlib._bootstrap>", line 994, in _gcd_import
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 953, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'corsheaders'


$ pip install django-cors-headers
Requirement already satisfied: django-cors-headers in /Users/sane/.pyenv/versions/3.6.2/lib/python3.6/site-packages (2.2.0)

原因

pip installしてるのに、モジュールねえよと言われる。
どうやら、コンテナを生成する時にrequirementsからpip installしてるっぽい。

ということで、一度ストップしてから再生成する。

$ docker-compose stop
$ docker-compose build
    :
    :
Collecting django-cors-headers (from -r requirements.txt (line 7))
  Downloading https://files.pythonhosted.org/packages/b1/bc/0414cf96a2e4a917b1f53b638f34f4999cc9a97fadbd1420054cc11b4ad2/django_cors_headers-2.2.0-py2.py3-none-any.whl
Collecting pytz (from Django==2.0.5->-r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/dc/83/15f7833b70d3e067ca91467ca245bae0f6fe56ddc7451aa0dc5606b120f2/pytz-2018.4-py2.py3-none-any.whl (510kB)
    :

$ docker-compose up -d

うん、インストールしてるっぽいね。

curlで確認

普通に「curl -i example.com」としてもAccess-Control-Allow-Originが出てくれないので以下のようにする。

$ curl -H "Origin: http://example.com" --verbose http://localhost:8000/api/threads/?format=json
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8000 (#0)
> GET /api/threads/?format=json HTTP/1.1
> Host: localhost:8000
> User-Agent: curl/7.58.0
> Accept: */*
> Origin: http://example.com
> 
< HTTP/1.1 200 OK
< Date: Sat, 16 Jun 2018 07:01:41 GMT
< Server: WSGIServer/0.2 CPython/3.6.5
< Content-Type: application/json
< Vary: Accept, Cookie
< Allow: GET, POST, HEAD, OPTIONS
< Content-Length: 374
< Access-Control-Allow-Origin: *
< X-Frame-Options: SAMEORIGIN
< 
* Connection #0 to host localhost left intact
[{"id":2,"name":"Thread2","description":"this is thread 2.","url":"thread-2","views":49,"category":{"id":1,"name":"プログラミング"},"tag":[{"id":2,"name":"Java"}]},{"id":1,"name":"Thread1","description":"this is thread 1.","url":"thread-1","views":4,"category":{"id":1,"name":"プログラミング"},"tag":[{"id":3,"name":"Deep Learning"},{"id":1,"name":"Python"}]}]


おっけい!

curlのやり方は以下を参考にした。
stackoverflow.com