{"id":1770,"date":"2022-02-25T22:45:59","date_gmt":"2022-02-25T13:45:59","guid":{"rendered":"https:\/\/oboki.net\/workspace\/?p=1770"},"modified":"2022-06-01T23:16:13","modified_gmt":"2022-06-01T14:16:13","slug":"debugging-python-app-in-container-using-vscode","status":"publish","type":"post","link":"https:\/\/oboki.net\/workspace\/python\/debugging-python-app-in-container-using-vscode\/","title":{"rendered":"[VSCode] Remote Container \uc5d0\uc11c \ud30c\uc774\uc36c \ub514\ubc84\uae45\ud558\uae30 (feat. Airflow)"},"content":{"rendered":"<p>\ucd5c\uadfc\uc5d0 \ud300 <code>airflow<\/code> \ud504\ub85c\uc81d\ud2b8\ub97c \ucee8\ud14c\uc774\ub108 \uae30\ubc18\uc73c\ub85c \uc804\ud658\ud558\uba74\uc11c \ub7f0\ud0c0\uc784\uc5d0 \ub514\ubc84\uae45\ud558\ub294 \ud658\uacbd\uc744 \ubcc4\ub3c4\ub85c \uad6c\ucd95\ud588\uc5b4\uc57c\ud588\ub294\ub370 <code>Remote - containers<\/code> \ud50c\ub7ec\uadf8\uc778\uc744 \uc774\uc6a9\ud558\uba74 \uc6b4\uc601\ud658\uacbd\uc5d0\uc11c \ud06c\uac8c \ubcc0\uacbd\uc5c6\uc774 \ub514\ubc84\uae45\ud560 \uc218 \uc788\uc5b4\uc11c \uc0ac\uc6a9\ubc29\ubc95\uc744 \uac04\ub2e8\ud788 \uc815\ub9ac\ud574\ubcf8\ub2e4. \uc774 \ud655\uc7a5\uc744 \uc774\uc6a9\ud558\uba74 \ub514\ubc84\uae45 \uc6a9\uc73c\ub85c \ubcc4\ub3c4 \ub85c\uceec \ud658\uacbd\uc744 \uad6c\ucd95\ud558\uc9c0 \uc54a\uc544\ub3c4 \ucee8\ud14c\uc774\ub108\ub85c \uad00\ub9ac\ud558\ub294 \uc11c\ube44\uc2a4\ub4e4\uc744 \uc6b4\uc601 \uc774\ubbf8\uc9c0 \uadf8\ub300\ub85c \ub514\ubc84\uae45\ud560 \uc218 \uc788\ub294\ub370, \uc544\uc9c1 <code>preview<\/code> \ubc84\uc804\uc774\uae34 \ud558\uc9c0\ub9cc \uc0ac\ub0b4\uc5d0\uc11c \uc0ac\uc6a9\ud558\uace0 \uc788\ub294 airflow \uc774\ubbf8\uc9c0 \uae30\uc900\uc73c\ub85c \ubb38\uc81c\uc5c6\uc774 \ub3d9\uc791\ud574\uc11c \uc55e\uc73c\ub85c \uc694\uae34\ud558\uac8c \uc798 \uc4f8 \uac83 \uac19\ub2e4.<\/p>\n<p>2.2.4 \ubc84\uc804 \uacf5\uc2dd \uc774\ubbf8\uc9c0\uc640 \ucee4\ubba4\ub2c8\ud2f0\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 <code>docker-compose.yml<\/code> \ud30c\uc77c\uc744 \uc774\uc6a9\ud574\uc11c \uc0ac\uc6a9\ubc95\uc744 \uc815\ub9ac\ud574\ubcf4\uba74,<\/p>\n<p><a href=\"https:\/\/airflow.apache.org\/docs\/apache-airflow\/2.2.4\/docker-compose.yaml\">https:\/\/airflow.apache.org\/docs\/apache-airflow\/2.2.4\/docker-compose.yaml<\/a><\/p>\n<p>\ub2e4\uc74c\uacfc \uac19\uc774 \ucd08\uae30 \uc124\uc815\uc744 \uc9c4\ud589\ud574\uc8fc\uace0<\/p>\n<pre><code class=\"language-bash\">mkdir -p .\/dags .\/logs .\/plugins\nchmod a+rwx .\/dags .\/logs .\/plugins\n#echo -e &quot;AIRFLOW_UID=$(id -u)&quot; &gt; .env\n\ndocker-compose up airflow-init<\/code><\/pre>\n<pre><code class=\"language-bash\"># docker ps\nCONTAINER ID   IMAGE                           COMMAND                  CREATED          STATUS                    PORTS                                             NAMES\n2fbba240865f   postgres:13                     &quot;docker-entrypoint.s\u2026&quot;   48 seconds ago   Up 45 seconds (healthy)   5432\/tcp                                          airflow-debug_postgres_1\n9113cfcb4bf4   redis:latest                    &quot;docker-entrypoint.s\u2026&quot;   48 seconds ago   Up 45 seconds (healthy)   6379\/tcp                                          airflow-debug_redis_1<\/code><\/pre>\n<p>\uc774\uc5b4\uc11c \uc704 <code>docker-compose.yml<\/code> \uba85\uc138\uc11c\uc758 airflow-scheduler \uc11c\ube44\uc2a4\ub97c \uc81c\uc678\ud558\uace0 \uc2e4\ud589\ud55c\ub2e4.<\/p>\n<pre><code class=\"language-yml\">services:\n  postgres:\n    image: postgres:13\n\n...\n\n#  airflow-scheduler:\n#    &lt;&lt;: *airflow-common\n#    command: scheduler\n#    healthcheck:\n#      test: [&quot;CMD-SHELL&quot;, &#039;airflow jobs check --job-type SchedulerJob --hostname &quot;$${HOSTNAME}&quot;&#039;]\n#      interval: 10s\n#      timeout: 10s\n#      retries: 5\n#    restart: always\n#    depends_on:\n#      &lt;&lt;: *airflow-common-depends-on\n#      airflow-init:\n#        condition: service_completed_successfully\n\n  airflow-worker:\n    &lt;&lt;: *airflow-common\n    command: celery worker\n\n...<\/code><\/pre>\n<p><\/p>\n<p>\uc774\ub807\uac8c \ucee8\ud14c\uc774\ub108\ub97c \uc2e4\ud589\ud558\uba74 scheduler \uc11c\ube44\uc2a4\ub294 \uae30\ub3d9\ub418\uc9c0 \uc54a\uc740 \ucc44\ub85c \uc11c\ube44\uc2a4\uac00 \uc2e4\ud589\ub418\ub294\ub370 \ub098\uc911\uc5d0 \ub2e4\ub978 \ucee8\ud14c\uc774\ub108\uc5d0\uc11c \ub514\ubc84\uac70\ub97c \ubd99\uc5ec\uc11c \uc218\ub3d9\uc73c\ub85c \uc2e4\ud589\ud574\uc904 \uc608\uc815\uc774\ub2e4. \uc2a4\ucf00\uc904\ub7ec \ub9d0\uace0 \ub2e4\ub978 \ud504\ub85c\uc138\uc2a4\ub97c \ub514\ubc84\uae45\ud558\uace0 \uc2f6\uc73c\uba74 \ud574\ub2f9 \ud504\ub85c\uc138\uc2a4\ub97c \uc81c\uc678\ud558\uace0 \uc2e4\ud589\ud55c\ub2e4.<\/p>\n<pre><code class=\"language-bash\"># docker-compose up -d\ndebug-airflow_postgres_1 is up-to-date\ndebug-airflow_redis_1 is up-to-date\nStarting debug-airflow_airflow-init_1 ... done\nCreating debug-airflow_airflow-webserver_1 ... done\nCreating debug-airflow_flower_1            ... done\nCreating debug-airflow_airflow-worker_1    ... done\nCreating debug-airflow_airflow-triggerer_1 ... done\n\n# docker ps\nCONTAINER ID   IMAGE                  COMMAND                  CREATED              STATUS                        PORTS                              NAMES\n4bda22ed8d3a   apache\/airflow:2.2.4   &quot;\/usr\/bin\/dumb-init \u2026&quot;   47 seconds ago       Up 44 seconds (healthy)       8080\/tcp                           debug-airflow_airflow-triggerer_1\n4860e0207530   apache\/airflow:2.2.4   &quot;\/usr\/bin\/dumb-init \u2026&quot;   47 seconds ago       Up 44 seconds (healthy)       8080\/tcp                           debug-airflow_airflow-worker_1\n551a9c164187   apache\/airflow:2.2.4   &quot;\/usr\/bin\/dumb-init \u2026&quot;   47 seconds ago       Up 43 seconds (healthy)       0.0.0.0:5555-&gt;5555\/tcp, 8080\/tcp   debug-airflow_flower_1\ne2996c5df253   apache\/airflow:2.2.4   &quot;\/usr\/bin\/dumb-init \u2026&quot;   47 seconds ago       Up 44 seconds (healthy)       0.0.0.0:8080-&gt;8080\/tcp             debug-airflow_airflow-webserver_1\n3a676a1c4789   postgres:13            &quot;docker-entrypoint.s\u2026&quot;   About a minute ago   Up About a minute (healthy)   5432\/tcp                           debug-airflow_postgres_1\n84522e22b760   redis:latest           &quot;docker-entrypoint.s\u2026&quot;   About a minute ago   Up About a minute (healthy)   6379\/tcp                           debug-airflow_redis_1<\/code><\/pre>\n<p>\ucee8\ud14c\uc774\ub108\uac00 \ub2e4 \uc62c\ub77c\uc654\uc744\ub54c \uc6f9\uc73c\ub85c \uc9c4\uc785\ud558\uba74 \uc2a4\ucf00\uc904\ub7ec\uac00 \ub3d9\uc791\ud558\uc9c0 \uc54a\ub294\ub2e4\ub294 \uc5d0\ub7ec\uc640 \ud568\uaed8 example DAG \uac00 \ud558\ub098\ub3c4 \ub85c\ub4dc\ub418\uc9c0 \uc54a\ub294\ub370 \uc774 \uc0c1\ud0dc\uc5d0\uc11c \uc2a4\ucf00\uc904\ub7ec \ud504\ub85c\uc138\uc2a4\ub294 \uc55e\uc73c\ub85c \ub514\ubc84\uac70\uc640 \ud568\uaed8 \uc2e4\ud589\ud560 \uc608\uc815\uc774\ub2e4.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/oboki.net\/workspace\/wp-content\/uploads\/2022\/06\/1.png\" alt=\"\" \/><\/p>\n<p>\ub2e4\uc74c\uacfc \uac19\uc774 shell \ub85c\uadf8\uc778\uc774 default \uacc4\uc815\uc774 \uc544\ub2cc airflow \uacc4\uc815\uc73c\ub85c \uc798 \ub418\ub294\uc9c0 \ud655\uc778\uc774 \ub410\uc73c\uba74 \uc774\uc5b4\uc11c remote \ud658\uacbd \uc138\ud305\uc744 \uc9c4\ud589\ud55c\ub2e4.<\/p>\n<pre><code class=\"language-bash\"># docker-compose exec airflow-webserver bash\nairflow@e2996c5df253:\/opt\/airflow$<\/code><\/pre>\n<p>\ucee4\ub9e8\ub4dc \ud314\ub808\ud2b8\uc5d0\uc11c <code>Remote-Containers: Attach to Running Containers...<\/code> \uba54\ub274\ub97c \uc120\ud0dd\ud558\uace0<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/oboki.net\/workspace\/wp-content\/uploads\/2022\/06\/2.png\" alt=\"\" \/><\/p>\n<p>\uc801\ub2f9\ud55c airflow \ucee8\ud14c\uc774\ub108\ub97c \uc120\ud0dd\ud55c\ub2e4. (\uc774 \uc608\uc2dc\uc5d0\uc11c\ub294 airflow \ucee8\ud14c\uc774\ub108\ub294 \uc804\ubd80 \uac19\uc740 \uc774\ubbf8\uc9c0\uc5ec\uc11c \uc544\ubb34\uac70\ub098 \uc120\ud0dd\ud574\ub3c4 \uad1c\ucc2e\uc74c.)<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/oboki.net\/workspace\/wp-content\/uploads\/2022\/06\/3.png\" alt=\"\" \/><\/p>\n<p>\ub2e4\uc74c\uacfc \uac19\uc774 \uc0c8\ub85c\uc6b4 \uc708\ub3c4\uc6b0\ub85c \ud574\ub2f9 \ucee8\ud14c\uc774\ub108\uc5d0\uc11c vscode \uac00 \uc2e4\ud589\ub418\ub294\ub370, \ud30c\uc77c \ube0c\ub77c\uc6b0\uc800\ub97c \uc798 \uc0b4\ud3b4\ubcf4\uba74 \ucee8\ud14c\uc774\ub108 \uc548\uc5d0\uc11c \uc2e4\ud589\ub41c \uac83\uc744 \uc54c \uc218 \uc788\ub2e4. \uc2e4\ud589 \ucd08\uae30\uc5d0 \ubcf4\uba74 vscode \uac00 \uc124\uce58\ub418\uace0\uc788\ub2e4\ub294 \ud31d\uc5c5\uc774 \ub728\ub294\ub370 wsl \ucc98\ub7fc remote \ud638\uc2a4\ud2b8\uc5d0 vscode-server \uac00 \uc124\uce58\ub418\uba74\uc11c windows \uc778\ud130\ud398\uc774\uc2a4\uc5d0\uc11c \uc2e4\ud589\ub418\ub294 \uac83 \uac19\ub2e4.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/oboki.net\/workspace\/wp-content\/uploads\/2022\/06\/4.png\" alt=\"\" \/><\/p>\n<p>\ub514\ubc84\uae45 \ud0ed\uc73c\ub85c \uc774\ub3d9\ud574 <code>Run and Debug<\/code> \ubc84\ud2bc\uc744 \ub204\ub974\uba74<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/oboki.net\/workspace\/wp-content\/uploads\/2022\/06\/5.png\" alt=\"\" \/><\/p>\n<p>\ub2e4\uc74c\uacfc \uac19\uc774 <code>Python<\/code> \uc5d4\ud2b8\ub9ac\uac00 \ub098\uc640\uc57c\ud558\ub294\ub370<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/oboki.net\/workspace\/wp-content\/uploads\/2022\/06\/6.png\" alt=\"\" \/><\/p>\n<p>\ud639\uc2dc \ub9ac\ubaa8\ud2b8 vscode \uc5d0 python \ud328\ud0a4\uc9c0\uac00 \uc124\uce58\uc548\ub410\ub2e4\ub294 \uc5d0\ub7ec\uac00 \ubc1c\uc0dd\ud558\uba74 \ud574\ub2f9 \ud328\ud0a4\uc9c0\ub4e4\uc744 \uc124\uce58\ud574\uc900\ub2e4. (offline \ud658\uacbd\uc774\ub77c\uba74, local\uc758 *.vsix \ub97c \uc774\uc6a9\ud574\uc11c \uc124\uce58\ud560 \uc218 \uc788\ub2e4.)<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/oboki.net\/workspace\/wp-content\/uploads\/2022\/06\/16.png\" alt=\"\" \/><\/p>\n<p>\ud328\ud0a4\uc9c0\uac00 \ubb38\uc81c\uc5c6\uc774 \uc124\uce58\ub3fc\uc788\uace0 \ud30c\uc774\uc36c \uc5d4\ud2b8\ub9ac\ub97c \uc120\ud0dd\ud588\ub2e4\uba74 \uc774\uc5b4\uc11c \ub514\ubc84\uae45 \uc124\uc815\uc744 \uc9c4\ud589\ud55c\ub2e4. <code>Attach using Proccess ID<\/code> \ub97c \uc774\uc6a9\ud574 \uc2e4\ud589\uc911\uc778 \ud504\ub85c\uc138\uc2a4\ub97c \ub514\ubc84\uae45\ud560 \uc218 \uc788\uc73c\uba74 \uc88b\uc744\ud150\ub370 \uc544\uc9c1 \uc131\uacf5\ud558\uc9c0 \ubabb\ud574\uc11c <code>Python File<\/code> \uc744 \uc120\ud0dd.. (\uc774\ub807\uac8c \uc9c4\ud589\ud558\ub824\uace0 \ub514\ubc84\uae45 \ub300\uc0c1 \uc11c\ube44\uc2a4\ub97c \uc2e4\ud589\ud558\uc9c0 \uc54a\uc74c.)<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/oboki.net\/workspace\/wp-content\/uploads\/2022\/06\/8.png\" alt=\"\" \/><\/p>\n<p><code>launch.json<\/code> \uc774 \uc5c6\ub2e4\ub294 \ud31d\uc5c5\uc774 \ubc1c\uc0dd\ud558\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 \ub514\ubc84\uae45\ud558\uace0\uc790\ud558\ub294 \uc2a4\ud06c\ub9bd\ud2b8\uc640 \ud30c\ub77c\ubbf8\ud130\ub97c \uc785\ub825\ud574\uc900\ub2e4.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/oboki.net\/workspace\/wp-content\/uploads\/2022\/06\/9.png\" alt=\"\" \/><\/p>\n<p>\uc6d0\ub798 \uc774 \uc774\ubbf8\uc9c0\uc5d0\uc11c scheduler \ud504\ub85c\uc138\uc2a4\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \uc2e4\ud589\ub418\ub294\ub370<\/p>\n<pre><code class=\"language-bash\">\/usr\/local\/bin\/python \/home\/airflow\/.local\/bin\/airflow scheduler<\/code><\/pre>\n<p>\uc5ec\uae30\uc11c \ub9e8 \uc55e\uc758 \uc778\ud130\ud504\ub9ac\ud130\ub294 \uae30\ubcf8\uc801\uc73c\ub85c \uc124\uc815\ub3fc \uc788\uc73c\ub2c8, \ub450\ubc88\uc9f8 <code>\/home\/airflow\/.local\/bin\/airflow<\/code> \uc2a4\ud06c\ub9bd\ud2b8\ub97c <code>program<\/code> \uc5d0 \uc801\uace0, <code>scheduler<\/code> \ub97c <code>args<\/code> \uc5d0 \uc785\ub825\ud55c\ub2e4.<\/p>\n<pre><code class=\"language-json\">{\n    \/\/ Use IntelliSense to learn about possible attributes.\n    \/\/ Hover to view descriptions of existing attributes.\n    \/\/ For more information, visit: https:\/\/go.microsoft.com\/fwlink\/?linkid=830387\n    &quot;version&quot;: &quot;0.2.0&quot;,\n    &quot;configurations&quot;: [\n        {\n            &quot;name&quot;: &quot;Python: Current File&quot;,\n            &quot;type&quot;: &quot;python&quot;,\n            &quot;request&quot;: &quot;launch&quot;,\n            &quot;program&quot;: &quot;\/home\/airflow\/.local\/bin\/airflow&quot;,\n            &quot;console&quot;: &quot;integratedTerminal&quot;,\n            &quot;justMyCode&quot;: false,\n            &quot;args&quot;: [\n                &quot;scheduler&quot;\n            ]\n        }\n    ]\n}<\/code><\/pre>\n<p>\uc774 \uc0c1\ud0dc\uc5d0\uc11c \uc2e4\ud589 \ubc84\ud2bc\uc774\ub098 <code>F5<\/code> \ud0a4\ubcf4\ub4dc \uc785\ub825\uc744 \ub204\ub974\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 \uc2a4\ucf00\uc904\ub7ec\uac00 \uc2e4\ud589\ub418\uace0 \uc6f9 ui \uc5d0\uc11c\ub3c4 example DAG \uac00 \ub85c\ub529\ub418\uae30 \uc2dc\uc791\ud55c\ub2e4.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/oboki.net\/workspace\/wp-content\/uploads\/2022\/06\/12.png\" alt=\"\" \/><\/p>\n<p>DAG \ub97c \uc544\ubb34\uac70\ub098 \ud558\ub098 on \uc73c\ub85c \ubcc0\uacbd\ud55c \ub2e4\uc74c, \ucf54\ub4dc\uc5d0\uc11c breakpoint \ub97c \uc124\uc815\ud558\uba74<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/oboki.net\/workspace\/wp-content\/uploads\/2022\/06\/15.png\" alt=\"\" \/><\/p>\n<p>\ub2e4\uc74c\uacfc \uac19\uc774 taskinstance \uc0c1\ud0dc\uac00 \uace7\ubc14\ub85c \ubcc0\uacbd\ub418\uc9c0 \uc54a\uace0 <code>Continue<\/code> \uc785\ub825\uc5d0 \ub530\ub77c \uc9c4\ud589\ub418\ub294 \uc0c1\ud0dc\ub97c \ubaa8\ub2c8\ud130\ub9c1\ud560 \uc218 \uc788\ub2e4.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/oboki.net\/workspace\/wp-content\/uploads\/2022\/06\/14.png\" alt=\"\" \/><\/p>\n<h2>references<\/h2>\n<ul>\n<li><a href=\"https:\/\/davidgriffiths-data.medium.com\/debugging-airflow-in-a-container-with-vs-code-7cc26734444\">https:\/\/davidgriffiths-data.medium.com\/debugging-airflow-in-a-container-with-vs-code-7cc26734444<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\ucd5c\uadfc\uc5d0 \ud300 airflow \ud504\ub85c\uc81d\ud2b8\ub97c \ucee8\ud14c\uc774\ub108 \uae30\ubc18\uc73c\ub85c \uc804\ud658\ud558\uba74\uc11c \ub7f0\ud0c0\uc784\uc5d0 \ub514\ubc84\uae45\ud558\ub294 \ud658\uacbd\uc744 \ubcc4\ub3c4\ub85c \uad6c\ucd95\ud588\uc5b4\uc57c\ud588\ub294\ub370 Remote &#8211; containers \ud50c\ub7ec\uadf8\uc778\uc744 \uc774\uc6a9\ud558\uba74 \uc6b4\uc601\ud658\uacbd\uc5d0\uc11c \ud06c\uac8c \ubcc0\uacbd\uc5c6\uc774 \ub514\ubc84\uae45\ud560 \uc218 \uc788\uc5b4\uc11c \uc0ac\uc6a9\ubc29\ubc95\uc744 \uac04\ub2e8\ud788 \uc815\ub9ac\ud574\ubcf8\ub2e4. \uc774 \ud655\uc7a5\uc744 \uc774\uc6a9\ud558\uba74 \ub514\ubc84\uae45 \uc6a9\uc73c\ub85c \ubcc4\ub3c4 \ub85c\uceec \ud658\uacbd\uc744 \uad6c\ucd95\ud558\uc9c0 \uc54a\uc544\ub3c4 \ucee8\ud14c\uc774\ub108\ub85c \uad00\ub9ac\ud558\ub294 \uc11c\ube44\uc2a4\ub4e4\uc744 \uc6b4\uc601 \uc774\ubbf8\uc9c0 \uadf8\ub300\ub85c \ub514\ubc84\uae45\ud560 \uc218 \uc788\ub294\ub370, \uc544\uc9c1 preview \ubc84\uc804\uc774\uae34 \ud558\uc9c0\ub9cc \uc0ac\ub0b4\uc5d0\uc11c \uc0ac\uc6a9\ud558\uace0 \uc788\ub294 airflow \uc774\ubbf8\uc9c0 \uae30\uc900\uc73c\ub85c [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[199,162,10,204],"tags":[],"class_list":["post-1770","post","type-post","status-publish","format-standard","hentry","category-airflow","category-docker","category-python","category-vscode"],"_links":{"self":[{"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/posts\/1770","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/comments?post=1770"}],"version-history":[{"count":1,"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/posts\/1770\/revisions"}],"predecessor-version":[{"id":1784,"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/posts\/1770\/revisions\/1784"}],"wp:attachment":[{"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/media?parent=1770"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/categories?post=1770"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oboki.net\/workspace\/wp-json\/wp\/v2\/tags?post=1770"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}