{"id":49408,"date":"2023-07-10T13:35:04","date_gmt":"2023-06-30T02:09:34","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8nginx-django%e5%9c%a8gke%e4%b8%8a%e4%bb%8e%e9%9b%b6%e5%bc%80%e5%a7%8b%e9%83%a8%e7%bd%b2djangoreact%ef%bc%881%ef%bc%89%e5%90%8e%e7%ab%af%e5%bc%80%e5%8f%91%e3%80%82\/"},"modified":"2024-04-30T12:53:10","modified_gmt":"2024-04-30T04:53:10","slug":"%e4%bd%bf%e7%94%a8nginx-django%e5%9c%a8gke%e4%b8%8a%e4%bb%8e%e9%9b%b6%e5%bc%80%e5%a7%8b%e9%83%a8%e7%bd%b2djangoreact%ef%bc%881%ef%bc%89%e5%90%8e%e7%ab%af%e5%bc%80%e5%8f%91%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8nginx-django%e5%9c%a8gke%e4%b8%8a%e4%bb%8e%e9%9b%b6%e5%bc%80%e5%a7%8b%e9%83%a8%e7%bd%b2djangoreact%ef%bc%881%ef%bc%89%e5%90%8e%e7%ab%af%e5%bc%80%e5%8f%91%e3%80%82\/","title":{"rendered":"\u4f7f\u7528Nginx + Django\u5728GKE\u4e0a\u4ece\u96f6\u5f00\u59cb\u90e8\u7f72Django+React\uff081\uff09\u540e\u7aef\u5f00\u53d1"},"content":{"rendered":"<h1>\u4f7f\u7528Nginx + Django\u8fdb\u884c\u5f00\u53d1\uff0c\u5728GKE\u4e0a\u4ece\u96f6\u90e8\u7f72Django+React\u7684\u540e\u7aef\u3002(1)<\/h1>\n<h2>\u60f3\u8981\u505a\u7684\u4e8b\u60c5<\/h2>\n<p>\u7531\u4e8e\u5728Django+React\u6784\u67b6\u4e0b\u5f00\u53d1\u5e94\u7528\u5e76\u5c06\u5176\u90e8\u7f72\u5230Google Kubernetes Engine\u7684\u8fc7\u7a0b\u4e2d\uff0c\u5e76\u65e0\u5b8c\u6574\u7684\u6559\u7a0b\u53ef\u4f9b\u53c2\u8003\uff0c\u56e0\u6b64\u6211\u64b0\u5199\u4e86\u8fd9\u7bc7\u6587\u7ae0\u3002<\/p>\n<p>\u6211\u8ba4\u4e3a\u867d\u7136\u8fd8\u6709\u4e00\u4e9b\u5730\u65b9\u4e0d\u5b8c\u5584\uff0c\u4f46\u662f\u5982\u679c\u6709\u4e00\u70b9\u7ecf\u9a8c\u7684\u4eba\uff0c\u5e94\u8be5\u53ef\u4ee5\u7acb\u5373\u4f7f\u7528\u3002<\/p>\n<h2>\u8bf7\u7559\u610f<\/h2>\n<p>\u9019\u662f\u4e00\u4f4d\u672a\u66fe\u6709\u7d93\u9a57\u7684\u8208\u8da3\u5de5\u7a0b\u5e2b\u70ba\u4e86\u5efa\u7acb\u500b\u4eba\u4f5c\u54c1\u96c6\u800c\u52aa\u529b\u89e3\u6c7a\u90e8\u7f72\u554f\u984c\u7684\u8a18\u9304\u3002\u5982\u679c\u6709\u4efb\u4f55\u758f\u6f0f\u4e4b\u8655\uff0c\u656c\u8acb\u6307\u6b63\u3002<\/p>\n<h2>\u7784\u51c6\u7684\u59ff\u6001 de z\u012b<\/h2>\n<h2>\u73af\u5883<\/h2>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>node <span class=\"nt\">--version<\/span>\r\nv12.14.1\r\n\r\n<span class=\"nv\">$ <\/span>npm <span class=\"nt\">--version<\/span>\r\n6.13.7\r\n\r\n<span class=\"nv\">$ <\/span>python <span class=\"nt\">--version<\/span>\r\nPython 3.7.4\r\n\r\n<span class=\"nv\">$ <\/span>docker <span class=\"nt\">--version<\/span>\r\nDocker version 19.03.8\r\n\r\nOS windows10 pro\r\n<\/code><\/pre>\n<h2>\u9996\u5148\u5728\u672c\u5730\u5f00\u59cb<\/h2>\n<h3>\u521b\u5efa\u4e00\u4e2a\u76ee\u5f55<\/h3>\n<pre class=\"post-pre\"><code><span class=\"c\"># \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u30d5\u30a9\u30eb\u30c0\u306e\u4f5c\u6210<\/span>\r\n<span class=\"nv\">$ <\/span><span class=\"nb\">mkdir <\/span>gke-django-tutorial\r\n<span class=\"nv\">$ <\/span><span class=\"nb\">cd <\/span>gke-django-tutorial\r\n\r\n<span class=\"c\"># \u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u4f5c\u6210\u3059\u308b<\/span>\r\n<span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\m<\/span>kdir backend\r\n<span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\m<\/span>kdir frontend\r\n<\/code><\/pre>\n<h3>\u540e\u7aef\u5f00\u53d1\uff08Django\u7248\uff09<\/h3>\n<p>\u540e\u7aef\u7684Pod\u4f1a\u4f7f\u7528Django-rest-framework\u6765\u63d0\u4f9bRestAPI\u3002<br \/>\n\u5173\u4e8e\u540e\u7aef\u7684Pod\uff0c\u6211\u4f1a\u8fdb\u884c\u6574\u7406\u3002<\/p>\n<div>\n<div class=\"post-table\">\u5f79\u5272\u30b3\u30f3\u30c6\u30ca\u30a4\u30e1\u30fc\u30b8\u30d7\u30ed\u30ad\u30b7\u30b5\u30fc\u30d0\u30fcNginx:1.17.4-alpine\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3Python3.7 &#8211; Django rest frameworkcloud_sql_proxygcr.io\/cloudsql-docker\/gce-proxy<\/div>\n<\/div>\n<p>\u5728\u540e\u7aef\uff08backend\uff09\u521b\u5efa\u76ee\u5f55\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\"># backend\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u79fb\u52d5<\/span>\r\n<span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\c<\/span>d backend\r\n\r\n<span class=\"c\"># django\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e\u4f5c\u6210<\/span>\r\n<span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\b<\/span>ackend<span class=\"se\">\\m<\/span>kdir web-back\r\n\r\n<span class=\"c\"># Nginx\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e\u4f5c\u6210<\/span>\r\n<span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\b<\/span>ackend<span class=\"se\">\\m<\/span>kdir nginx\r\n<\/code><\/pre>\n<h4>\u7528Django\u5f00\u59cb\u9879\u76ee\u3002<\/h4>\n<p>\u5728\u4e2d\u6587\u4e2d\u521b\u5efaPython\u865a\u62df\u73af\u5883\uff0c\u5e76\u4f7f\u7528Django REST framework\u5f00\u53d1API\u670d\u52a1\u5668\u3002\u8fd9\u5c06\u5728backend\\web-back\\\u76ee\u5f55\u4e0b\u521b\u5efa\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\"># web-back\u30c7\u30a3\u30ec\u30af\u30c8\u30ea<\/span>\r\n<span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\b<\/span>ackend<span class=\"se\">\\c<\/span>d web-back\r\n\r\n<span class=\"c\"># Python\u306e\u4eee\u60f3\u74b0\u5883\u4f5c\u6210<\/span>\r\n<span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\b<\/span>ackend<span class=\"se\">\\w<\/span>eb-back<span class=\"se\">\\p<\/span>ython <span class=\"nt\">-m<\/span> venv venv\r\n\r\n<span class=\"c\"># \u4eee\u60f3\u74b0\u5883\u306e\u6709\u52b9\u5316<\/span>\r\n<span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\b<\/span>ackend<span class=\"se\">\\w<\/span>eb-back<span class=\"se\">\\v<\/span><span class=\"nb\">env<\/span><span class=\"se\">\\S<\/span>cripts<span class=\"se\">\\a<\/span>ctivate\r\n\r\n<span class=\"c\"># Python\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/span>\r\n<span class=\"o\">(<\/span>venv<span class=\"o\">)<\/span><span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\b<\/span>ackend<span class=\"se\">\\w<\/span>eb-back<span class=\"se\">\\p<\/span>ython <span class=\"nt\">-m<\/span> <span class=\"nb\">install<\/span> <span class=\"nt\">--upgrade<\/span> pip setuptools\r\n<span class=\"o\">(<\/span>venv<span class=\"o\">)<\/span><span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\b<\/span>ackend<span class=\"se\">\\w<\/span>eb-back<span class=\"se\">\\p<\/span>ython <span class=\"nt\">-m<\/span> <span class=\"nb\">install <\/span>django djangorestframework python-dotenv\r\n\r\n<span class=\"c\"># Django\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u59cb\u3081\u308b<\/span>\r\n<span class=\"o\">(<\/span>venv<span class=\"o\">)<\/span><span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\b<\/span>ackend<span class=\"se\">\\w<\/span>eb-back<span class=\"se\">\\d<\/span>jango-admin startproject config <span class=\"nb\">.<\/span>\r\n<\/code><\/pre>\n<p>\u5728web-back\u76ee\u5f55\u4e0b\uff0c\u901a\u8fc7\u8fd0\u884cdjango-admin startproject config .\u547d\u4ee4\uff0c\u6210\u529f\u521b\u5efa\u4e86\u4e00\u4e2a\u540d\u4e3aconfig\u7684Django\u9879\u76ee\u6587\u4ef6\u5939\u3002<\/p>\n<p>\u8ba9\u6211\u4eec\u68c0\u67e5\u4e00\u4e0b\u672c\u5730\u670d\u52a1\u5668\u662f\u5426\u5df2\u7ecf\u542f\u52a8\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"o\">(<\/span>venv<span class=\"o\">)<\/span><span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\b<\/span>ackend<span class=\"se\">\\w<\/span>eb-back<span class=\"se\">\\p<\/span>ython manage.py runserver\r\nWatching <span class=\"k\">for <\/span>file changes with StatReloader\r\nPerforming system checks...\r\n\r\nSystem check identified no issues <span class=\"o\">(<\/span>0 silenced<span class=\"o\">)<\/span><span class=\"nb\">.<\/span>\r\n\r\nYou have 17 unapplied migration<span class=\"o\">(<\/span>s<span class=\"o\">)<\/span><span class=\"nb\">.<\/span> Your project may not work properly <span class=\"k\">until <\/span>you apply the migrations <span class=\"k\">for <\/span>app<span class=\"o\">(<\/span>s<span class=\"o\">)<\/span>: admin, auth, contenttypes, sessions.\r\nRun <span class=\"s1\">'python manage.py migrate'<\/span> to apply them.\r\nApril 27, 2020 - 11:22:06\r\nDjango version 3.0.5, using settings <span class=\"s1\">'config.settings'<\/span>\r\nStarting development server at http:\/\/127.0.0.1:8000\/\r\nQuit the server with CTRL-BREAK.\r\n<\/code><\/pre>\n<p>\u5f53\u5f00\u53d1\u670d\u52a1\u5668\u542f\u52a8\u540e\uff0c\u60a8\u53ef\u4ee5\u8bbf\u95eehttp:\/\/localhost:8000\/\uff0c\u4ee5\u786e\u8ba4\u5b89\u88c5\u6210\u529f\u7684\u9875\u9762\u4e3a&#8221;The install worked successfully!&#8221;\u3002<\/p>\n<h4>\u8bbe\u7f6e.py<\/h4>\n<p>\u8bf7\u7f16\u8f91config\/settings.py\u6587\u4ef6\u4ee5\u5305\u542b\u57fa\u672c\u914d\u7f6e\u3002<br \/>\n\u5c06\u5e94\u8be5\u4fdd\u5bc6\u7684settings.py\u4fe1\u606f\u8bb0\u5f55\u5728.env\u6587\u4ef6\u4e2d\uff0c\u4e0d\u8981\u516c\u5f00\u3002<br \/>\n\u4f7f\u7528python-dotenv\u5305\u6765\u4f7f\u7528.env\u6587\u4ef6\u4e2d\u8bb0\u5f55\u7684\u4fe1\u606f\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\"># .env\u30d5\u30a1\u30a4\u30eb\u306e\u4f5c\u6210<\/span>\r\n<span class=\"o\">(<\/span>venv<span class=\"o\">)<\/span><span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\b<\/span>ackend<span class=\"se\">\\w<\/span>eb-back<span class=\"se\">\\t<\/span>ype nul <span class=\"o\">&gt;<\/span> .env\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"c1\"># config\/settings.py\r\n<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">os<\/span>\r\n<span class=\"kn\">from<\/span> <span class=\"nn\">dotenv<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">load_dotenv<\/span>  <span class=\"c1\"># \u8ffd\u52a0\r\n<\/span>\r\n<span class=\"c1\"># Build paths inside the project like this: os.path.join(BASE_DIR, ...)\r\n<\/span><span class=\"n\">BASE_DIR<\/span> <span class=\"o\">=<\/span> <span class=\"n\">os<\/span><span class=\"p\">.<\/span><span class=\"n\">path<\/span><span class=\"p\">.<\/span><span class=\"n\">dirname<\/span><span class=\"p\">(<\/span><span class=\"n\">os<\/span><span class=\"p\">.<\/span><span class=\"n\">path<\/span><span class=\"p\">.<\/span><span class=\"n\">dirname<\/span><span class=\"p\">(<\/span><span class=\"n\">os<\/span><span class=\"p\">.<\/span><span class=\"n\">path<\/span><span class=\"p\">.<\/span><span class=\"n\">abspath<\/span><span class=\"p\">(<\/span><span class=\"n\">__file__<\/span><span class=\"p\">)))<\/span>\r\n<span class=\"n\">PROJECT_DIR<\/span> <span class=\"o\">=<\/span> <span class=\"n\">os<\/span><span class=\"p\">.<\/span><span class=\"n\">path<\/span><span class=\"p\">.<\/span><span class=\"n\">basename<\/span><span class=\"p\">(<\/span><span class=\"n\">BASE_DIR<\/span><span class=\"p\">)<\/span>  <span class=\"c1\"># \u8ffd\u52a0\r\n<\/span>\r\n<span class=\"c1\"># .env\u306e\u8aad\u307f\u8fbc\u307f\r\n<\/span><span class=\"n\">load_dotenv<\/span><span class=\"p\">(<\/span><span class=\"n\">os<\/span><span class=\"p\">.<\/span><span class=\"n\">path<\/span><span class=\"p\">.<\/span><span class=\"n\">join<\/span><span class=\"p\">(<\/span><span class=\"n\">BASE_DIR<\/span><span class=\"p\">,<\/span> <span class=\"s\">'.env'<\/span><span class=\"p\">))<\/span>  <span class=\"c1\"># \u8ffd\u52a0\r\n<\/span>\r\n<span class=\"c1\"># Quick-start development settings - unsuitable for production\r\n# See https:\/\/docs.djangoproject.com\/en\/3.0\/howto\/deployment\/checklist\/\r\n<\/span>\r\n<span class=\"c1\"># SECURITY WARNING: keep the secret key used in production secret!\r\n<\/span><span class=\"n\">SECRET_KEY<\/span> <span class=\"o\">=<\/span> <span class=\"n\">os<\/span><span class=\"p\">.<\/span><span class=\"n\">getenv<\/span><span class=\"p\">(<\/span><span class=\"s\">'SECRET_KEY'<\/span><span class=\"p\">)<\/span>\r\n\r\n<span class=\"c1\"># SECURITY WARNING: don't run with debug turned on in production!\r\n<\/span><span class=\"n\">DEBUG<\/span> <span class=\"o\">=<\/span> <span class=\"n\">os<\/span><span class=\"p\">.<\/span><span class=\"n\">getenv<\/span><span class=\"p\">(<\/span><span class=\"s\">'DEBUG'<\/span><span class=\"p\">)<\/span>\r\n\r\n<span class=\"n\">ALLOWED_HOSTS<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"s\">\"*\"<\/span><span class=\"p\">]<\/span>  <span class=\"c1\"># \u5909\u66f4\r\n<\/span>\r\n\r\n<span class=\"c1\"># Application definition\r\n<\/span>\r\n<span class=\"n\">INSTALLED_APPS<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span>\r\n    <span class=\"s\">'django.contrib.admin'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s\">'django.contrib.auth'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s\">'django.contrib.contenttypes'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s\">'django.contrib.sessions'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s\">'django.contrib.messages'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s\">'django.contrib.staticfiles'<\/span><span class=\"p\">,<\/span>\r\n<span class=\"p\">]<\/span>\r\n\r\n<span class=\"n\">MIDDLEWARE<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span>\r\n    <span class=\"s\">'django.middleware.security.SecurityMiddleware'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s\">'django.contrib.sessions.middleware.SessionMiddleware'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s\">'django.middleware.common.CommonMiddleware'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s\">'django.middleware.csrf.CsrfViewMiddleware'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s\">'django.contrib.auth.middleware.AuthenticationMiddleware'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s\">'django.contrib.messages.middleware.MessageMiddleware'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s\">'django.middleware.clickjacking.XFrameOptionsMiddleware'<\/span><span class=\"p\">,<\/span>\r\n<span class=\"p\">]<\/span>\r\n\r\n<span class=\"n\">ROOT_URLCONF<\/span> <span class=\"o\">=<\/span> <span class=\"s\">'config.urls'<\/span>\r\n\r\n<span class=\"n\">TEMPLATES<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span>\r\n    <span class=\"p\">{<\/span>\r\n        <span class=\"s\">'BACKEND'<\/span><span class=\"p\">:<\/span> <span class=\"s\">'django.template.backends.django.DjangoTemplates'<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"s\">'DIRS'<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"n\">os<\/span><span class=\"p\">.<\/span><span class=\"n\">path<\/span><span class=\"p\">.<\/span><span class=\"n\">join<\/span><span class=\"p\">(<\/span><span class=\"n\">BASE_DIR<\/span><span class=\"p\">,<\/span> <span class=\"s\">'templates'<\/span><span class=\"p\">)],<\/span>  <span class=\"c1\"># \u5909\u66f4\r\n<\/span>        <span class=\"s\">'APP_DIRS'<\/span><span class=\"p\">:<\/span> <span class=\"bp\">True<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"s\">'OPTIONS'<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"s\">'context_processors'<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\r\n                <span class=\"s\">'django.template.context_processors.debug'<\/span><span class=\"p\">,<\/span>\r\n                <span class=\"s\">'django.template.context_processors.request'<\/span><span class=\"p\">,<\/span>\r\n                <span class=\"s\">'django.contrib.auth.context_processors.auth'<\/span><span class=\"p\">,<\/span>\r\n                <span class=\"s\">'django.contrib.messages.context_processors.messages'<\/span><span class=\"p\">,<\/span>\r\n            <span class=\"p\">],<\/span>\r\n        <span class=\"p\">},<\/span>\r\n    <span class=\"p\">},<\/span>\r\n<span class=\"p\">]<\/span>\r\n\r\n<span class=\"n\">WSGI_APPLICATION<\/span> <span class=\"o\">=<\/span> <span class=\"s\">'config.wsgi.application'<\/span>\r\n\r\n\r\n<span class=\"c1\"># Database\r\n# https:\/\/docs.djangoproject.com\/en\/3.0\/ref\/settings\/#databases\r\n<\/span>\r\n<span class=\"n\">DATABASES<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"s\">'default'<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"s\">'ENGINE'<\/span><span class=\"p\">:<\/span> <span class=\"s\">'django.db.backends.sqlite3'<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"s\">'NAME'<\/span><span class=\"p\">:<\/span> <span class=\"n\">os<\/span><span class=\"p\">.<\/span><span class=\"n\">path<\/span><span class=\"p\">.<\/span><span class=\"n\">join<\/span><span class=\"p\">(<\/span><span class=\"n\">BASE_DIR<\/span><span class=\"p\">,<\/span> <span class=\"s\">'db.sqlite3'<\/span><span class=\"p\">),<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n\r\n<span class=\"c1\"># Password validation\r\n# https:\/\/docs.djangoproject.com\/en\/3.0\/ref\/settings\/#auth-password-validators\r\n<\/span>\r\n<span class=\"n\">AUTH_PASSWORD_VALIDATORS<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span>\r\n    <span class=\"p\">{<\/span>\r\n        <span class=\"s\">'NAME'<\/span><span class=\"p\">:<\/span> <span class=\"s\">'django.contrib.auth.password_validation.UserAttributeSimilarityValidator'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"p\">},<\/span>\r\n    <span class=\"p\">{<\/span>\r\n        <span class=\"s\">'NAME'<\/span><span class=\"p\">:<\/span> <span class=\"s\">'django.contrib.auth.password_validation.MinimumLengthValidator'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"p\">},<\/span>\r\n    <span class=\"p\">{<\/span>\r\n        <span class=\"s\">'NAME'<\/span><span class=\"p\">:<\/span> <span class=\"s\">'django.contrib.auth.password_validation.CommonPasswordValidator'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"p\">},<\/span>\r\n    <span class=\"p\">{<\/span>\r\n        <span class=\"s\">'NAME'<\/span><span class=\"p\">:<\/span> <span class=\"s\">'django.contrib.auth.password_validation.NumericPasswordValidator'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"p\">},<\/span>\r\n<span class=\"p\">]<\/span>\r\n\r\n\r\n<span class=\"c1\"># Internationalization\r\n# https:\/\/docs.djangoproject.com\/en\/3.0\/topics\/i18n\/\r\n<\/span>\r\n<span class=\"n\">LANGUAGE_CODE<\/span> <span class=\"o\">=<\/span> <span class=\"s\">'ja'<\/span>  <span class=\"c1\"># \u5909\u66f4\r\n<\/span>\r\n<span class=\"n\">TIME_ZONE<\/span> <span class=\"o\">=<\/span> <span class=\"s\">'Asia\/Tokyo'<\/span>\r\n\r\n<span class=\"n\">USE_I18N<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">True<\/span>\r\n\r\n<span class=\"n\">USE_L10N<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">True<\/span>\r\n\r\n<span class=\"n\">USE_TZ<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">True<\/span>\r\n\r\n\r\n<span class=\"c1\"># Static files (CSS, JavaScript, Images)\r\n# https:\/\/docs.djangoproject.com\/en\/3.0\/howto\/static-files\/\r\n<\/span>\r\n<span class=\"n\">STATIC_URL<\/span> <span class=\"o\">=<\/span> <span class=\"s\">'\/static\/'<\/span>\r\n\r\n<span class=\"c1\"># \u958b\u767a\u74b0\u5883\u4e0b\u3067\u9759\u7684\u30d5\u30a1\u30a4\u30eb\u3092\u53c2\u7167\u3059\u308b\u5148\r\n<\/span><span class=\"n\">STATICFILES_DIRS<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"n\">os<\/span><span class=\"p\">.<\/span><span class=\"n\">path<\/span><span class=\"p\">.<\/span><span class=\"n\">join<\/span><span class=\"p\">(<\/span><span class=\"n\">BASE_DIR<\/span><span class=\"p\">,<\/span> <span class=\"s\">'static'<\/span><span class=\"p\">)]<\/span> <span class=\"c1\"># \u8ffd\u52a0\r\n<\/span>\r\n<span class=\"c1\"># \u672c\u756a\u74b0\u5883\u3067\u9759\u7684\u30d5\u30a1\u30a4\u30eb\u3092\u53c2\u7167\u3059\u308b\u5148\r\n<\/span><span class=\"n\">STATIC_ROOT<\/span> <span class=\"o\">=<\/span> <span class=\"n\">os<\/span><span class=\"p\">.<\/span><span class=\"n\">path<\/span><span class=\"p\">.<\/span><span class=\"n\">join<\/span><span class=\"p\">(<\/span><span class=\"n\">BASE_DIR<\/span><span class=\"p\">,<\/span> <span class=\"s\">'staticfiles'<\/span><span class=\"p\">)<\/span> <span class=\"c1\"># \u8ffd\u52a0\r\n<\/span>\r\n<span class=\"c1\"># \u30e1\u30c7\u30a3\u30a2\u30d5\u30a1\u30a4\u30ebpath\r\n<\/span><span class=\"n\">MEDIA_URL<\/span> <span class=\"o\">=<\/span> <span class=\"s\">'\/media\/'<\/span> <span class=\"c1\"># \u8ffd\u52a0\r\n<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"c\"># .env<\/span>\r\nSECRET_KEY <span class=\"o\">=<\/span> <span class=\"s1\">'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'<\/span>\r\nDEBUG <span class=\"o\">=<\/span> False\r\n<\/code><\/pre>\n<h4>\u6dfb\u52a0\u5e94\u7528\u7a0b\u5e8f<\/h4>\n<p>\u8ba9\u6211\u4eec\u4e00\u8d77\u5f00\u53d1\u4e00\u4e2a\u5f85\u529e\u4e8b\u9879\u5e94\u7528\u7a0b\u5e8f\u5427\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"o\">(<\/span>venv<span class=\"o\">)<\/span><span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\b<\/span>ackend<span class=\"se\">\\w<\/span>eb-back<span class=\"se\">\\p<\/span>ython manage.py startapp todo\r\n<\/code><\/pre>\n<p>\u5728config\/settings.py\u7684INSTALLED_APPS\u4e2d\u6dfb\u52a0todo\u548crest_framework\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\"># config\/settings.py\r\n<\/span>\r\n<span class=\"n\">INSTALLED_APPS<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span>\r\n    <span class=\"s\">'django.contrib.admin'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s\">'django.contrib.auth'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s\">'django.contrib.contenttypes'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s\">'django.contrib.sessions'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s\">'django.contrib.messages'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s\">'django.contrib.staticfiles'<\/span><span class=\"p\">,<\/span>\r\n\r\n    <span class=\"c1\"># 3rd party\r\n<\/span>    <span class=\"s\">'rest_framework'<\/span><span class=\"p\">,<\/span>\r\n\r\n    <span class=\"c1\"># Local\r\n<\/span>    <span class=\"s\">'todo.apps.TodoConfig'<\/span><span class=\"p\">,<\/span>\r\n<span class=\"p\">]<\/span>\r\n\r\n<span class=\"c1\"># \u8ffd\u52a0\r\n<\/span><span class=\"n\">REST_FRAMEWORK<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"s\">'DEFAULT_PERMISSION_CLASSES'<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\r\n        <span class=\"s\">'rest_framework.permissions.AllowAny'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"p\">]<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<\/code><\/pre>\n<p>rest_framework.permissions.AllowAny\u662f\u7528\u6765\u53d6\u6d88django-rest-framework\u9ed8\u8ba4\u8bbe\u7f6e&#8217;DEFAULT_PERMISSION_CLASSES&#8217;\u7684\u9690\u5f0f\u8bbe\u7f6e\u7684\u3002<\/p>\n<h4>todo\/models.py<br \/>\n\u5f85\u529e\/\u6a21\u578b.py<\/h4>\n<p>\u6211\u4f1a\u521b\u5efa\u4e00\u4e2a\u4efb\u52a1\u5e94\u7528\u7a0b\u5e8f\u6a21\u578b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\"># todo\/models.py\r\n<\/span><span class=\"kn\">from<\/span> <span class=\"nn\">django.db<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">models<\/span>\r\n\r\n\r\n<span class=\"k\">class<\/span> <span class=\"nc\">Todo<\/span><span class=\"p\">(<\/span><span class=\"n\">models<\/span><span class=\"p\">.<\/span><span class=\"n\">Model<\/span><span class=\"p\">):<\/span>\r\n    <span class=\"n\">title<\/span> <span class=\"o\">=<\/span> <span class=\"n\">models<\/span><span class=\"p\">.<\/span><span class=\"n\">CharField<\/span><span class=\"p\">(<\/span><span class=\"n\">max_length<\/span><span class=\"o\">=<\/span><span class=\"mi\">200<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"n\">body<\/span> <span class=\"o\">=<\/span> <span class=\"n\">models<\/span><span class=\"p\">.<\/span><span class=\"n\">TextField<\/span><span class=\"p\">()<\/span>\r\n\r\n    <span class=\"k\">def<\/span> <span class=\"nf\">__str__<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">):<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">title<\/span>\r\n<\/code><\/pre>\n<p>\u5c06\u5728 todo\/admin.py \u4e2d\u6dfb\u52a0\u5df2\u521b\u5efa\u7684\u6a21\u578b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\"># todo\/admin.py\r\n<\/span><span class=\"kn\">from<\/span> <span class=\"nn\">django.contrib<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">admin<\/span>\r\n<span class=\"kn\">from<\/span> <span class=\"nn\">.models<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">Todo<\/span>\r\n\r\n\r\n<span class=\"n\">admin<\/span><span class=\"p\">.<\/span><span class=\"n\">site<\/span><span class=\"p\">.<\/span><span class=\"n\">register<\/span><span class=\"p\">(<\/span><span class=\"n\">Todo<\/span><span class=\"p\">)<\/span>\r\n<\/code><\/pre>\n<p>\u6211\u8981\u8fdb\u884c\u8fc1\u79fb\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"o\">(<\/span>venv<span class=\"o\">)<\/span><span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\b<\/span>ackend<span class=\"se\">\\w<\/span>eb-back<span class=\"se\">\\p<\/span>ython manage.py makemigrations\r\nMigrations <span class=\"k\">for<\/span> <span class=\"s1\">'todo'<\/span>:\r\n  todo<span class=\"se\">\\m<\/span>igrations<span class=\"se\">\\0<\/span>001_initial.py\r\n    - Create model Todo\r\n\r\n<span class=\"o\">(<\/span>venv<span class=\"o\">)<\/span><span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\b<\/span>ackend<span class=\"se\">\\w<\/span>eb-back<span class=\"se\">\\p<\/span>ython manage.py migrate\r\nOperations to perform:\r\n  Apply all migrations: admin, auth, contenttypes, sessions, todo\r\nRunning migrations:\r\n  Applying contenttypes.0001_initial... OK\r\n  Applying auth.0001_initial... OK\r\n  Applying admin.0001_initial... OK\r\n  Applying admin.0002_logentry_remove_auto_add... OK\r\n  Applying admin.0003_logentry_add_action_flag_choices... OK\r\n  Applying contenttypes.0002_remove_content_type_name... OK\r\n  Applying auth.0002_alter_permission_name_max_length... OK\r\n  Applying auth.0003_alter_user_email_max_length... OK\r\n  Applying auth.0004_alter_user_username_opts... OK\r\n  Applying auth.0005_alter_user_last_login_null... OK\r\n  Applying auth.0006_require_contenttypes_0002... OK\r\n  Applying auth.0007_alter_validators_add_error_messages... OK\r\n  Applying auth.0008_alter_user_username_max_length... OK\r\n  Applying auth.0009_alter_user_last_name_max_length... OK\r\n  Applying auth.0010_alter_group_name_max_length... OK\r\n  Applying auth.0011_update_proxy_permissions... OK\r\n  Applying sessions.0001_initial... OK\r\n  Applying todo.0001_initial... OK\r\n<\/code><\/pre>\n<h4>\u521b\u5efa\u8d85\u7ea7\u7528\u6237<\/h4>\n<p>\u521b\u5efa\u7ba1\u7406\u5458\u7528\u6237\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"o\">(<\/span>venv<span class=\"o\">)<\/span><span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\b<\/span>ackend<span class=\"se\">\\w<\/span>eb-back<span class=\"se\">\\p<\/span>ython manage.py createsuperuser\r\n\u30e6\u30fc\u30b6\u30fc\u540d <span class=\"o\">(<\/span>leave blank to use <span class=\"s1\">'[YOUR_NAME]'<\/span><span class=\"o\">)<\/span>: <span class=\"o\">[<\/span>USER_NAME]\r\n\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9: YOUR_MAIL_ADDRESS@MAIL.COM\r\nPassword:\r\nPassword <span class=\"o\">(<\/span>again<span class=\"o\">)<\/span>:\r\nSuperuser created successfully.\r\n<\/code><\/pre>\n<p>\u5f53\u60a8\u542f\u52a8\u5f00\u53d1\u670d\u52a1\u5668\u5e76\u8bbf\u95eehttp:\/\/localhost:8000\/admin\/\u65f6\uff0c\u5c06\u663e\u793aDjango\u7ba1\u7406\u7f51\u7ad9\u7684\u767b\u5f55\u754c\u9762\u3002\u8bf7\u8f93\u5165\u60a8\u8bbe\u7f6e\u7684\u7528\u6237\u540d\u548c\u5bc6\u7801\u4ee5\u8fdb\u884c\u767b\u5f55\u3002<\/p>\n<p>\u5f53\u60a8\u6210\u529f\u767b\u5f55\u540e\uff0c\u60a8\u53ef\u4ee5\u67e5\u770b\u60a8\u521b\u5efa\u7684Todo\u5e94\u7528\u7a0b\u5e8f\u7684\u8868\u683c\u3002<br \/>\n\u8ba9\u6211\u4eec\u5148\u6dfb\u52a02\u52303\u4e2a\u9879\u76ee\u3002<\/p>\n<h4>\u7f51\u5740<\/h4>\n<p>\u5728config\/urls.py\u4e2d\u6dfb\u52a0\u81f3todo\u5e94\u7528\u7684\u8def\u7531\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\"># config\/urls.py\r\n<\/span>\r\n<span class=\"kn\">from<\/span> <span class=\"nn\">django.contrib<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">admin<\/span>\r\n<span class=\"kn\">from<\/span> <span class=\"nn\">django.urls<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">path<\/span><span class=\"p\">,<\/span> <span class=\"n\">include<\/span>\r\n\r\n<span class=\"n\">urlpatterns<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span>\r\n    <span class=\"n\">path<\/span><span class=\"p\">(<\/span><span class=\"s\">'admin\/'<\/span><span class=\"p\">,<\/span> <span class=\"n\">admin<\/span><span class=\"p\">.<\/span><span class=\"n\">site<\/span><span class=\"p\">.<\/span><span class=\"n\">urls<\/span><span class=\"p\">),<\/span>\r\n    <span class=\"n\">path<\/span><span class=\"p\">(<\/span><span class=\"s\">'api\/'<\/span><span class=\"p\">,<\/span> <span class=\"n\">include<\/span><span class=\"p\">(<\/span><span class=\"s\">'todo.urls'<\/span><span class=\"p\">))<\/span>  <span class=\"c1\"># \u8ffd\u52a0\r\n<\/span><span class=\"p\">]<\/span>\r\n<\/code><\/pre>\n<h4>\u5f85\u529e\u4e8b\u9879\/urls.py<\/h4>\n<p>\u6211\u5c06\u521b\u5efatodo\/urls.py\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"o\">(<\/span>venv<span class=\"o\">)<\/span><span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\b<\/span>ackend<span class=\"se\">\\w<\/span>eb-back<span class=\"se\">\\t<\/span>ype nul <span class=\"o\">&gt;<\/span> todo<span class=\"se\">\\u<\/span>rls.py\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"c1\"># todo\/urls.py\r\n<\/span><span class=\"kn\">from<\/span> <span class=\"nn\">django.urls<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">path<\/span><span class=\"p\">,<\/span> <span class=\"n\">include<\/span>\r\n<span class=\"kn\">from<\/span> <span class=\"nn\">.views<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">ListTodo<\/span><span class=\"p\">,<\/span> <span class=\"n\">DetailTodo<\/span>\r\n\r\n<span class=\"n\">urlpatterns<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span>\r\n    <span class=\"n\">path<\/span><span class=\"p\">(<\/span><span class=\"s\">'&lt;int:pk&gt;\/'<\/span><span class=\"p\">,<\/span> <span class=\"n\">DetailTodo<\/span><span class=\"p\">.<\/span><span class=\"n\">as_view<\/span><span class=\"p\">()),<\/span>\r\n    <span class=\"n\">path<\/span><span class=\"p\">(<\/span><span class=\"s\">''<\/span><span class=\"p\">,<\/span> <span class=\"n\">ListTodo<\/span><span class=\"p\">.<\/span><span class=\"n\">as_view<\/span><span class=\"p\">())<\/span>\r\n<span class=\"p\">]<\/span>\r\n<\/code><\/pre>\n<h4>\u5f85\u529e\u4e8b\u9879\/\u5e8f\u5217\u5316\u5668.py<\/h4>\n<p>\u6211\u5c06\u521b\u5efa\u4e00\u4e2a\u5e8f\u5217\u5316\u5668\uff0c\u4ee5\u4fbf\u5c06\u6a21\u578b\u5b9e\u4f8b\u7b80\u5355\u5730\u8f6c\u6362\u4e3aJSON\u683c\u5f0f\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"o\">(<\/span>venv<span class=\"o\">)<\/span><span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\b<\/span>ackend<span class=\"se\">\\t<\/span>ype nul <span class=\"o\">&gt;<\/span> todo<span class=\"se\">\\s<\/span>erializers.py\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"c1\"># todo\/serializers.py\r\n<\/span><span class=\"kn\">from<\/span> <span class=\"nn\">rest_framework<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">serializers<\/span>\r\n<span class=\"kn\">from<\/span> <span class=\"nn\">.models<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">Todo<\/span>\r\n\r\n\r\n<span class=\"k\">class<\/span> <span class=\"nc\">TodoSerializer<\/span><span class=\"p\">(<\/span><span class=\"n\">serizers<\/span><span class=\"p\">.<\/span><span class=\"n\">ModelSerializer<\/span><span class=\"p\">):<\/span>\r\n    <span class=\"k\">class<\/span> <span class=\"nc\">Meta<\/span><span class=\"p\">:<\/span>\r\n        <span class=\"n\">model<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Todo<\/span>\r\n        <span class=\"n\">fields<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"s\">'id'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'title'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'body'<\/span><span class=\"p\">)<\/span>\r\n<\/code><\/pre>\n<p>\u5982\u679c\u5728\u5b57\u6bb5\uff08fields\uff09\u4e2d\uff0c\u6ca1\u6709\u5728\u6a21\u578b\uff08model\uff09\u4e2d\u6307\u5b9aPrimary Key\uff08\u4e3b\u952e\uff09\uff0cDjango\u4f1a\u81ea\u52a8\u6dfb\u52a0\u4e00\u4e2aid\u3002<\/p>\n<h4>\u7684\u4efb\u52a1\/\u89c6\u56fe.py<\/h4>\n<p>\u5728\u4f7f\u7528Django rest framework\u521b\u5efaviews.py\u65f6\uff0c\u9700\u8981\u7ee7\u627frest_framework.generics\u4e0b\u7684~~APIView\u7c7b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\"># todo\/views.py\r\n<\/span>\r\n<span class=\"kn\">from<\/span> <span class=\"nn\">django.shortcuts<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">render<\/span>\r\n<span class=\"kn\">from<\/span> <span class=\"nn\">rest_framework<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">generics<\/span>\r\n<span class=\"kn\">from<\/span> <span class=\"nn\">.models<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">Todo<\/span>\r\n<span class=\"kn\">from<\/span> <span class=\"nn\">.serializers<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">TodoSerializer<\/span>\r\n\r\n\r\n<span class=\"k\">class<\/span> <span class=\"nc\">ListTodo<\/span><span class=\"p\">(<\/span><span class=\"n\">generics<\/span><span class=\"p\">.<\/span><span class=\"n\">ListAPIView<\/span><span class=\"p\">):<\/span>\r\n    <span class=\"n\">queryset<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Todo<\/span><span class=\"p\">.<\/span><span class=\"n\">objects<\/span><span class=\"p\">.<\/span><span class=\"nb\">all<\/span><span class=\"p\">()<\/span>\r\n    <span class=\"n\">serializer_class<\/span> <span class=\"o\">=<\/span> <span class=\"n\">TodoSerializer<\/span>\r\n\r\n\r\n<span class=\"k\">class<\/span> <span class=\"nc\">DetailTodo<\/span><span class=\"p\">(<\/span><span class=\"n\">generics<\/span><span class=\"p\">.<\/span><span class=\"n\">RetrieveAPIView<\/span><span class=\"p\">):<\/span>\r\n    <span class=\"n\">queryset<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Todo<\/span><span class=\"p\">.<\/span><span class=\"n\">objects<\/span><span class=\"p\">.<\/span><span class=\"nb\">all<\/span><span class=\"p\">()<\/span>\r\n    <span class=\"n\">serializer_class<\/span> <span class=\"o\">=<\/span> <span class=\"n\">TodoSerializer<\/span>\r\n<\/code><\/pre>\n<p>\u5c3d\u7ba1\u8def\u7531\u5668\u7b49\u8bbe\u5907\u5c1a\u672a\u914d\u7f6e\u597d\uff0c\u4f46\u6211\u4eec\u5df2\u7ecf\u51c6\u5907\u597d\u5c06Todo\u5e94\u7528\u7a0b\u5e8f\u7684\u9879\u76ee\u4f5c\u4e3aRest API\u8fdb\u884c\u53d1\u5e03\u3002<br \/>\n\u60a8\u53ef\u4ee5\u901a\u8fc7\u5728\u5f00\u53d1\u670d\u52a1\u5668\u4e0a\u8bbf\u95eehttp:\/\/localhost:8000\/api\/\u6765\u786e\u8ba4API\u89c6\u56fe\u3002<\/p>\n<p>\u5230\u76ee\u524d\u4e3a\u6b62\uff0c\u8fd9\u662f\u5e38\u89c1\u7684\u5728Django\u4e2d\u8fdb\u884c\u672c\u5730\u73af\u5883\u5f00\u53d1\u7684\u65b9\u5f0f\u3002<\/p>\n<h4>CORS \u7684\u4e2d\u6587\u91ca\u4e49\u662f\u8de8\u6e90\u8d44\u6e90\u5171\u4eab\u3002<\/h4>\n<p>\u8981\u4f7fDjango\uff08localhost:8000\uff09\u4e0eReact\uff08localhost:3000\uff09\u8fdb\u884cJSON\u4ea4\u4e92\uff0c\u9700\u8981\u8fdb\u884cCORS\uff08\u8de8\u6e90\u8d44\u6e90\u5171\u4eab\uff09\u7684\u8bbe\u7f6e\u3002<\/p>\n<p>\u8ba9\u6211\u4eec\u5b89\u88c5django-cors-headers\u5e93\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"o\">(<\/span>venv<span class=\"o\">)<\/span><span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\b<\/span>ackend<span class=\"se\">\\w<\/span>eb-back<span class=\"se\">\\p<\/span>ython <span class=\"nt\">-m<\/span> pip <span class=\"nb\">install <\/span>django-cors-headers\r\n<\/code><\/pre>\n<p>\u5c06config\/settings.py\u6587\u4ef6\u8fdb\u884c\u66f4\u65b0\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\"># config\/settings.py\r\n<\/span>\r\n<span class=\"c1\"># Application definition\r\n<\/span>\r\n<span class=\"n\">INSTALLED_APPS<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span>\r\n    <span class=\"s\">'django.contrib.admin'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s\">'django.contrib.auth'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s\">'django.contrib.contenttypes'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s\">'django.contrib.sessions'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s\">'django.contrib.messages'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s\">'django.contrib.staticfiles'<\/span><span class=\"p\">,<\/span>\r\n\r\n    <span class=\"c1\"># 3rd party\r\n<\/span>    <span class=\"s\">'rest_framework'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s\">'corsheaders'<\/span><span class=\"p\">,<\/span>\r\n\r\n    <span class=\"c1\"># Local\r\n<\/span>    <span class=\"s\">'todos.apps.TodosConfig'<\/span><span class=\"p\">,<\/span>\r\n<span class=\"p\">]<\/span>\r\n\r\n<span class=\"n\">MIDDLEWARE<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span>\r\n    <span class=\"s\">'django.middleware.security.SecurityMiddleware'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s\">'django.contrib.sessions.middleware.SessionMiddleware'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s\">'corsheaders.middleware.CorsMidddleware'<\/span><span class=\"p\">,<\/span>  <span class=\"c1\"># \u8ffd\u52a0\r\n<\/span>    <span class=\"s\">'django.middleware.common.CommonMiddleware'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s\">'django.middleware.csrf.CsrfViewMiddleware'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s\">'django.contrib.auth.middleware.AuthenticationMiddleware'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s\">'django.contrib.messages.middleware.MessageMiddleware'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"s\">'django.middleware.clickjacking.XFrameOptionsMiddleware'<\/span><span class=\"p\">,<\/span>\r\n<span class=\"p\">]<\/span>\r\n\r\n<span class=\"c1\">##################\r\n# rest_framework #\r\n##################\r\n<\/span>\r\n<span class=\"n\">REST_FRAMEWORK<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"s\">'DEFAULT_PERMISSION_CLASSES'<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\r\n        <span class=\"s\">'rest_framework.permissions.AllowAny'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"p\">]<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"n\">CORS_ORIGIN_WHITELIST<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span>\r\n    <span class=\"s\">'http:\/\/localhost:3000'<\/span><span class=\"p\">,<\/span>\r\n<span class=\"p\">)<\/span>\r\n<\/code><\/pre>\n<h4>\u672c\u5730\u8bbe\u7f6e.py<\/h4>\n<p>\u4e3a\u4e86\u5728\u751f\u4ea7\u73af\u5883\u4e2d\u4f7f\u7528\uff0c\u6211\u4eec\u5047\u5b9aconfig\/settings.py\uff0c\u5e76\u521b\u5efaconfig\/local_settings.py\uff0c\u4ee5\u4fbf\u5728\u672c\u5730\u5f00\u53d1\u4e2d\u8fdb\u884c\u533a\u5206\u3002\u4f7f\u7528CloudSQL\u8fdb\u884cGKE\u90e8\u7f72\uff0c\u672c\u5730\u4f7f\u7528sqlite3\uff0c\u901a\u8fc7\u5c06settings.py\u5206\u5f00\uff0c\u6211\u4eec\u53ef\u4ee5\u907f\u514d\u4fee\u6539\u914d\u7f6e\u503c\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\"># \u30d5\u30a1\u30a4\u30eb\u306e\u4f5c\u6210<\/span>\r\n<span class=\"o\">(<\/span>venv<span class=\"o\">)<\/span><span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\b<\/span>ackend<span class=\"se\">\\w<\/span>eb-back<span class=\"se\">\\t<\/span>ype nul <span class=\"o\">&gt;<\/span> config\/local_settings.py\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"c1\"># config\/local_settings.py\r\n<\/span><span class=\"kn\">from<\/span> <span class=\"nn\">.settings<\/span> <span class=\"kn\">import<\/span> <span class=\"o\">*<\/span>\r\n\r\n<span class=\"n\">DEBUG<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">True<\/span>\r\n\r\n<span class=\"n\">ALLOWED_HOSTS<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"s\">'*'<\/span><span class=\"p\">]<\/span>\r\n\r\n<span class=\"n\">DATABASES<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"s\">'default'<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"s\">'ENGINE'<\/span><span class=\"p\">:<\/span> <span class=\"s\">'django.db.backends.sqlite3'<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"s\">'NAME'<\/span><span class=\"p\">:<\/span> <span class=\"n\">os<\/span><span class=\"p\">.<\/span><span class=\"n\">path<\/span><span class=\"p\">.<\/span><span class=\"n\">join<\/span><span class=\"p\">(<\/span><span class=\"n\">BASE_DIR<\/span><span class=\"p\">,<\/span> <span class=\"s\">'db.sqlite3'<\/span><span class=\"p\">),<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u8bf7\u4f7f\u7528 config\/local_settings.py \u542f\u52a8\u5f00\u53d1\u670d\u52a1\u5668\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"o\">(<\/span>venv<span class=\"o\">)<\/span><span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\b<\/span>ackend<span class=\"se\">\\w<\/span>eb-back<span class=\"se\">\\p<\/span>ython manage.py runserver <span class=\"nt\">--settings<\/span> config.local_settings\r\n<\/code><\/pre>\n<h4>\u8003\u8bd5<\/h4>\n<p>\u6211\u8981\u5199\u8003\u8bd5\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\"># todos\/test.py\r\n<\/span>\r\n<span class=\"kn\">from<\/span> <span class=\"nn\">django.test<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">TestCase<\/span>\r\n<span class=\"kn\">from<\/span> <span class=\"nn\">.models<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">Todo<\/span>\r\n\r\n\r\n<span class=\"k\">class<\/span> <span class=\"nc\">TodoModelTest<\/span><span class=\"p\">(<\/span><span class=\"n\">TestCase<\/span><span class=\"p\">):<\/span>\r\n\r\n    <span class=\"o\">@<\/span><span class=\"nb\">classmethod<\/span>\r\n    <span class=\"k\">def<\/span> <span class=\"nf\">setUpTestData<\/span><span class=\"p\">(<\/span><span class=\"n\">cls<\/span><span class=\"p\">):<\/span>\r\n        <span class=\"n\">Todo<\/span><span class=\"p\">.<\/span><span class=\"n\">objects<\/span><span class=\"p\">.<\/span><span class=\"n\">create<\/span><span class=\"p\">(<\/span><span class=\"n\">title<\/span><span class=\"o\">=<\/span><span class=\"s\">\"first todo\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">body<\/span><span class=\"o\">=<\/span><span class=\"s\">\"a body here\"<\/span><span class=\"p\">)<\/span>\r\n\r\n    <span class=\"k\">def<\/span> <span class=\"nf\">test_title_content<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">):<\/span>\r\n        <span class=\"n\">todo<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Todo<\/span><span class=\"p\">.<\/span><span class=\"n\">objects<\/span><span class=\"p\">.<\/span><span class=\"n\">get<\/span><span class=\"p\">(<\/span><span class=\"nb\">id<\/span><span class=\"o\">=<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span>\r\n        <span class=\"n\">excepted_object_name<\/span> <span class=\"o\">=<\/span> <span class=\"sa\">f<\/span><span class=\"s\">'<\/span><span class=\"si\">{<\/span><span class=\"n\">todo<\/span><span class=\"p\">.<\/span><span class=\"n\">title<\/span><span class=\"si\">}<\/span><span class=\"s\">'<\/span>\r\n        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">assertEqual<\/span><span class=\"p\">(<\/span><span class=\"n\">excepted_object_name<\/span><span class=\"p\">,<\/span> <span class=\"s\">'first todo'<\/span><span class=\"p\">)<\/span>\r\n\r\n    <span class=\"k\">def<\/span> <span class=\"nf\">test_body_content<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">):<\/span>\r\n        <span class=\"n\">todo<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Todo<\/span><span class=\"p\">.<\/span><span class=\"n\">objects<\/span><span class=\"p\">.<\/span><span class=\"n\">get<\/span><span class=\"p\">(<\/span><span class=\"nb\">id<\/span><span class=\"o\">=<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span>\r\n        <span class=\"n\">excepted_object_name<\/span> <span class=\"o\">=<\/span> <span class=\"sa\">f<\/span><span class=\"s\">'<\/span><span class=\"si\">{<\/span><span class=\"n\">todo<\/span><span class=\"p\">.<\/span><span class=\"n\">body<\/span><span class=\"si\">}<\/span><span class=\"s\">'<\/span>\r\n        <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">assertEqual<\/span><span class=\"p\">(<\/span><span class=\"n\">excepted_object_name<\/span><span class=\"p\">,<\/span> <span class=\"s\">'a body here'<\/span><span class=\"p\">)<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"o\">(<\/span>venv<span class=\"o\">)<\/span><span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\b<\/span>ackend<span class=\"se\">\\w<\/span>eb-back<span class=\"se\">\\p<\/span>ython manage.py <span class=\"nb\">test\r\n<\/span>Creating <span class=\"nb\">test <\/span>database <span class=\"k\">for <\/span><span class=\"nb\">alias<\/span> <span class=\"s1\">'default'<\/span>...\r\nSystem check identified no issues <span class=\"o\">(<\/span>0 silenced<span class=\"o\">)<\/span><span class=\"nb\">.<\/span>\r\n..\r\n<span class=\"nt\">----------------------------------------------------------------------<\/span>\r\nRan 2 tests <span class=\"k\">in <\/span>0.007s\r\n\r\nOK\r\nDestroying <span class=\"nb\">test <\/span>database <span class=\"k\">for <\/span><span class=\"nb\">alias<\/span> <span class=\"s1\">'default'<\/span>...\r\n<\/code><\/pre>\n<p>\u770b\u8d77\u6765\u8fdb\u5c55\u987a\u5229\u3002<\/p>\n<h4>\u975c\u614b\u6587\u4ef6<\/h4>\n<p>\u5728\u90e8\u7f72\u4e4b\u540e\uff0c\u6211\u4eec\u4f1a\u5c06\u9759\u6001\u6587\u4ef6\u8fdb\u884c\u6c47\u603b\uff0c\u4ee5\u4fbf\u7ba1\u7406\u8005\u529f\u80fd\u7684CSS\u80fd\u591f\u5f97\u5230\u53cd\u6620\u3002<br \/>\n\u7528\u4e8e\u53d1\u5e03\u7684\u9759\u6001\u6587\u4ef6\u4f1a\u88ab\u6c47\u603b\u5230staticfiles\/\u76ee\u5f55\u4e2d\uff0c\u800c\u7528\u4e8e\u5f00\u53d1\u7684\u9759\u6001\u6587\u4ef6\u76ee\u5f55\u5219\u662fstatic\/\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\"># \u9759\u7684\u30d5\u30a1\u30a4\u30eb\u914d\u4fe1\u7528\u30c7\u30a3\u30ec\u30af\u30c8\u30ea<\/span>\r\n<span class=\"o\">(<\/span>venv<span class=\"o\">)<\/span><span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\b<\/span>ackend<span class=\"se\">\\w<\/span>eb-back<span class=\"se\">\\m<\/span>kdir staticfiles\r\n\r\n<span class=\"c\"># \u9759\u7684\u30d5\u30a1\u30a4\u30eb\u958b\u767a\u7528\u30c7\u30a3\u30ec\u30af\u30c8\u30ea<\/span>\r\n<span class=\"o\">(<\/span>venv<span class=\"o\">)<\/span><span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\b<\/span>ackend<span class=\"se\">\\w<\/span>eb-back<span class=\"se\">\\m<\/span>kdir static\r\n\r\n<span class=\"c\"># \u9759\u7684\u30d5\u30a1\u30a4\u30eb\u306e\u96c6\u7d04<\/span>\r\n<span class=\"o\">(<\/span>venv<span class=\"o\">)<\/span><span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\b<\/span>ackend<span class=\"se\">\\w<\/span>eb-back<span class=\"se\">\\p<\/span>ython manage.py collectstatic\r\n<\/code><\/pre>\n<p>\u53ef\u4ee5\u786e\u8ba4\u5728staticfiles\/\u76ee\u5f55\u4e0b\u4e5f\u6dfb\u52a0\u4e86admin\u7684CSS\u7b49\u6587\u4ef6\u3002<\/p>\n<h4>\u6dfb\u52a0Python\u8f6f\u4ef6\u5305<\/h4>\n<p>\u5728\u90e8\u7f72\u5230GKE\u65f6\uff0c\u4f7f\u7528Cloud SQL\u7684Postgres\u3002<br \/>\n\u8981\u5728Django\u4e2d\u4f7f\u7528Postgres\uff0c\u9700\u8981psycopg2\u5e93\u3002<br \/>\n\u53e6\u5916\uff0c\u4f7f\u7528gunicorn\u6765\u542f\u52a8\u5e94\u7528\u7a0b\u5e8f\u3002<\/p>\n<p>\u6211\u5011\u5c07\u5b89\u88dd\u5fc5\u8981\u7684\u5957\u4ef6\u4e26\u5c07\u5b89\u88dd\u5728\u865b\u64ec\u74b0\u5883\u4e2d\u7684Python\u5957\u4ef6\u6574\u7406\u81f3requirements.txt\u6a94\u6848\u4e2d\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\"># \u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/span>\r\n<span class=\"o\">(<\/span>venv<span class=\"o\">)<\/span><span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\b<\/span>ackend<span class=\"se\">\\w<\/span>eb-back<span class=\"se\">\\p<\/span>ython <span class=\"nt\">-m<\/span> pip <span class=\"nb\">install <\/span>wheel gunicorn psycopg2-binary\r\n\r\n<span class=\"c\"># requirements.txt\u306e\u66f4\u65b0<\/span>\r\n<span class=\"o\">(<\/span>venv<span class=\"o\">)<\/span><span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\b<\/span>ackend<span class=\"se\">\\w<\/span>eb-back<span class=\"se\">\\p<\/span>ython <span class=\"nt\">-m<\/span> pip freeze <span class=\"o\">&gt;<\/span> requirements.txt\r\n<\/code><\/pre>\n<p>\u8fd0\u884c\u540e\uff0c\u5c06\u5728backend\/\u76ee\u5f55\u4e0b\u751f\u6210requirements.txt\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code>asgiref==3.2.7\r\nDjango==3.0.5\r\ndjango-cors-headers==3.2.1\r\ndjangorestframework==3.11.0\r\ngunicorn==20.0.4\r\npsycopg2-binary==2.8.5\r\npython-dotenv==0.13.0\r\npytz==2019.3\r\nsqlparse==0.3.1\r\n<\/code><\/pre>\n<h4>\u521b\u5efaDockerfile<\/h4>\n<p>\u521b\u5efa\u4e00\u4e2aDockerfile\u4ee5\u5236\u4f5cDjango\u7684\u5bb9\u5668\u6620\u50cf\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\"># Dockerfile\u306e\u4f5c\u6210<\/span>\r\n<span class=\"o\">(<\/span>venv<span class=\"o\">)<\/span><span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\b<\/span>ackend<span class=\"se\">\\w<\/span>eb-back<span class=\"se\">\\t<\/span>ype nul <span class=\"o\">&gt;<\/span> Dockerfile\r\n\r\n<span class=\"c\"># .dockerignore\u306e\u4f5c\u6210<\/span>\r\n<span class=\"o\">(<\/span>venv<span class=\"o\">)<\/span><span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\b<\/span>ackend<span class=\"se\">\\w<\/span>eb-back<span class=\"se\">\\t<\/span>ype nul <span class=\"o\">&gt;<\/span> .dockerignore\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"c\"># backend\/web-back\/Dockerfile<\/span>\r\n\r\n<span class=\"c\"># set base image<\/span>\r\n<span class=\"k\">FROM<\/span><span class=\"s\"> python:3.7<\/span>\r\n\r\n<span class=\"c\"># set environment variables<\/span>\r\n<span class=\"k\">ENV<\/span><span class=\"s\"> PYTHONDONTWRITEBYTECODE 1<\/span>\r\n<span class=\"k\">ENV<\/span><span class=\"s\"> PYTHONUNBUFFERED 1<\/span>\r\n\r\n<span class=\"c\"># set work directory<\/span>\r\n<span class=\"k\">WORKDIR<\/span><span class=\"s\"> \/code<\/span>\r\n\r\n<span class=\"c\"># install dependencies<\/span>\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> requirements.txt .\/<\/span>\r\n<span class=\"k\">RUN <\/span>python3 <span class=\"nt\">-m<\/span> pip <span class=\"nb\">install<\/span> <span class=\"nt\">--upgrade<\/span> pip setuptools\r\n<span class=\"k\">RUN <\/span>pip <span class=\"nb\">install<\/span> <span class=\"nt\">-r<\/span> requirements.txt\r\n\r\n<span class=\"c\"># Copy project<\/span>\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> . .\/<\/span>\r\n\r\n<span class=\"c\"># Expose application port<\/span>\r\n<span class=\"k\">EXPOSE<\/span><span class=\"s\"> 8000<\/span>\r\n<\/code><\/pre>\n<p>\u60a8\u53ef\u4ee5\u521b\u5efa `.dockerignore` \u6587\u4ef6\u6765\u6307\u5b9a\u4e0d\u5e0c\u671b\u653e\u5165\u5bb9\u5668\u4e2d\u7684\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code>venv\/\r\n.env\r\nDockerfile\r\nconfig\/local_settings.py\r\n<\/code><\/pre>\n<p>\u53ea\u9700\u4e00\u4e2a\u9009\u9879\uff1a<\/p>\n<p>\u73b0\u5728\u6211\u4eec\u5df2\u7ecf\u51c6\u5907\u597d\u521b\u5efa\u4e00\u4e2a\u5173\u4e8eDjango\u7684Docker\u955c\u50cf\u3002<\/p>\n<h3>\u540e\u7aef\u5f00\u53d1\uff08Nginx\u90e8\u5206\uff09<\/h3>\n<p>\u5c06Nginx\u5bb9\u5668\u4f5c\u4e3a\u540e\u7aefPod\u4e2d\u7684\u53cd\u5411\u4ee3\u7406\u670d\u52a1\u5668\u6765\u914d\u7f6e\u3002 Nginx\u5c06\u4f7f\u7528\/etc\/nginx\/conf.d\/\u76ee\u5f55\u4e2d\u7684\u914d\u7f6e\u6587\u4ef6\u6765\u5b9a\u4e49\u53cd\u5411\u4ee3\u7406\u529f\u80fd\u3002<\/p>\n<p>\u6b64\u5916\uff0c\u5728\u5f00\u53d1\u540e\u7aef\u7684\u6700\u540e\u9636\u6bb5\u6211\u8fd8\u60f3\u5c1d\u8bd5\u4f7f\u7528docker-compose\u8fdb\u884c\u542f\u52a8\uff0c\u6240\u4ee5\u6211\u4f1a\u521b\u5efa\u4e00\u4e2adocker-compose\u7528\u7684\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\"># Nginx\u7528\u306e\u30d5\u30a1\u30a4\u30eb\u4f5c\u6210<\/span>\r\n<span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\b<\/span>ackened<span class=\"se\">\\n<\/span>ginx<span class=\"se\">\\t<\/span>ype nul <span class=\"o\">&gt;<\/span> Dockerfile\r\n<span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\b<\/span>ackened<span class=\"se\">\\n<\/span>ginx<span class=\"se\">\\t<\/span>ype nul <span class=\"o\">&gt;<\/span> Dockerfile.dev\r\n<span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\b<\/span>ackened<span class=\"se\">\\n<\/span>ginx<span class=\"se\">\\t<\/span>ype nul <span class=\"o\">&gt;<\/span> default.conf\r\n<span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\b<\/span>ackened<span class=\"se\">\\n<\/span>ginx<span class=\"se\">\\t<\/span>ype nul <span class=\"o\">&gt;<\/span> default.dev.conf\r\n<\/code><\/pre>\n<p>\u6211\u5df2\u7ecf\u8bbe\u7f6e\u4e86\u53cd\u5411\u4ee3\u7406\uff0c\u5c06 default.conf \u914d\u7f6e\u4e3a Nginx \u5bb9\u5668\u7684 80 \u7aef\u53e3\u5e76\u6307\u5411 Django \u7684 8000 \u7aef\u53e3\u3002<\/p>\n<p>location = \/healthz\u6307\u4ee4\u662fGKE\u90e8\u7f72\u540e\u6240\u9700\u7684\u7528\u4e8e\u5065\u5eb7\u68c0\u67e5\u7684\u8def\u5f84\u3002<br \/>\nlocation \/static\/\u6307\u4ee4\u662f\u7528\u4e8e\u63d0\u4f9b\u9759\u6001\u6587\u4ef6\u7684\u8def\u5f84\u3002\u5982\u679c\u6ca1\u6709\u8fd9\u4e2a\u8def\u5f84\uff0c\u7ba1\u7406\u754c\u9762\u7684CSS\u5c06\u65e0\u6cd5\u6b63\u5e38\u5e94\u7528\u3002\u5728GKE\u90e8\u7f72\u65f6\uff0c\u9759\u6001\u6587\u4ef6\u5c06\u4eceCloud Storage\u8fdb\u884c\u63d0\u4f9b\uff0c\u56e0\u6b64\u5c06\u5176\u5220\u9664\u3002<\/p>\n<p>\u5982\u679c\u5728GKE\u4e0a\u90e8\u7f72\uff0c\u670d\u52a1\u5668\u6307\u4ee4\u5c06\u8bbe\u4e3alocalhost:8000\uff0c\u5982\u679c\u5728docker-compose\u4e2d\u542f\u52a8\uff0c\u5219\u8bbe\u4e3aweb-back:8000\u3002\u8fd9\u662f\u56e0\u4e3a\u5728docker-compose\u4e2d\u542f\u52a8\u65f6\u9700\u8981\u901a\u8fc7\u670d\u52a1\u540d\u79f0\u8fdb\u884c\u540d\u79f0\u89e3\u6790\u3002\u5728GKE\u4e0a\u90e8\u7f72\u65f6\uff0c\u7531\u4e8e\u4f4d\u4e8e\u540c\u4e00Pod\u5185\uff0c\u53ef\u4ee5\u901a\u8fc7localhost:8000\u8fdb\u884c\u540d\u79f0\u89e3\u6790\u3002<\/p>\n<pre class=\"post-pre\"><code>; <span class=\"n\">default<\/span>.<span class=\"n\">dev<\/span>.<span class=\"n\">conf<\/span>\r\n<span class=\"n\">upstream<\/span> <span class=\"n\">django<\/span> {\r\n    <span class=\"n\">server<\/span> <span class=\"n\">web<\/span>-<span class=\"n\">back<\/span>:<span class=\"m\">8000<\/span>;\r\n}\r\n\r\n; <span class=\"n\">default<\/span>.<span class=\"n\">conf<\/span>\u306e\u5834\u5408\r\n; <span class=\"n\">upstream<\/span> <span class=\"n\">django<\/span> {\r\n    ; <span class=\"n\">server<\/span> <span class=\"n\">localhost<\/span>:<span class=\"m\">8000<\/span>;\r\n; }\r\n\r\n<span class=\"n\">server<\/span> {\r\n\r\n    <span class=\"n\">listen<\/span> <span class=\"m\">80<\/span>;\r\n\r\n    <span class=\"n\">location<\/span> = \/<span class=\"n\">healthz<\/span> {\r\n        <span class=\"n\">return<\/span> <span class=\"m\">200<\/span>;\r\n    }\r\n\r\n    <span class=\"n\">location<\/span> \/ {\r\n        <span class=\"n\">proxy_pass<\/span> <span class=\"n\">http<\/span>:\/\/<span class=\"n\">django<\/span>;\r\n        <span class=\"n\">proxy_set_header<\/span> <span class=\"n\">Host<\/span> $<span class=\"n\">host<\/span>;\r\n        <span class=\"n\">proxy_set_header<\/span> <span class=\"n\">X<\/span>-<span class=\"n\">Forwarded<\/span>-<span class=\"n\">For<\/span> $<span class=\"n\">proxy_add_x_forwarded_for<\/span>;\r\n        <span class=\"n\">proxy_redirect<\/span> <span class=\"n\">off<\/span>;\r\n    }\r\n\r\n; <span class=\"n\">GKE<\/span>\u30c7\u30d7\u30ed\u30a4\u6642\u306b\u306f\u524a\u9664\r\n    <span class=\"n\">location<\/span> \/<span class=\"n\">static<\/span>\/ {\r\n        <span class=\"n\">alias<\/span> \/<span class=\"n\">code<\/span>\/<span class=\"n\">staticfiles<\/span>\/;\r\n    }\r\n}\r\n\r\n<\/code><\/pre>\n<p>\u901a\u8fc7\u5c06Nginx\u914d\u7f6e\u6587\u4ef6\u590d\u5236\u5230Nginx\u5bb9\u5668\u4e2d\u7684Dockerfile\uff0c\u4f7f\u914d\u7f6e\u751f\u6548\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\"># backend\\nginx\\Dockerfile.dev<\/span>\r\n<span class=\"k\">FROM<\/span><span class=\"s\"> nginx:1.17.4-alpine<\/span>\r\n\r\n<span class=\"k\">RUN <\/span><span class=\"nb\">rm<\/span> \/etc\/nginx\/conf.d\/default.conf\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> default.dev.conf \/etc\/nginx\/conf.d<\/span>\r\n\r\n<span class=\"c\"># backend\\nginx\\Dockerfile.dev\u306e\u5834\u5408<\/span>\r\n<span class=\"c\"># COPY default.conf \/etc\/nginx\/conf.d<\/span>\r\n\r\n<\/code><\/pre>\n<h3>\u5f00\u53d1\u540e\u7aef\uff08\u4f7f\u7528docker-compose\u8fdb\u884c\uff09<\/h3>\n<p>\u6211\u60f3\u4f7f\u7528docker-compose\u5728Nginx+Django\u914d\u7f6e\u4e2d\u542f\u52a8\u5bb9\u5668\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\"># docker-compose.yml\u306e\u4f5c\u6210<\/span>\r\n<span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\b<\/span>ackend<span class=\"se\">\\t<\/span>ype nul <span class=\"o\">&gt;<\/span> docker-compose.yml\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"na\">version<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">3.7\"<\/span>\r\n\r\n<span class=\"na\">services<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">web-back<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">container_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">python-backend<\/span>\r\n    <span class=\"na\">env_file<\/span><span class=\"pi\">:<\/span> <span class=\"s\">.\/web-back\/.env<\/span>\r\n    <span class=\"na\">build<\/span><span class=\"pi\">:<\/span> <span class=\"s\">.\/web-back\/.<\/span>\r\n    <span class=\"na\">volumes<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">.\/web-back:\/code\/<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">static_volume:\/code\/staticfiles<\/span> <span class=\"c1\"># &lt;-- bind the static volume<\/span>\r\n    <span class=\"na\">stdin_open<\/span><span class=\"pi\">:<\/span> <span class=\"no\">true<\/span>\r\n    <span class=\"na\">tty<\/span><span class=\"pi\">:<\/span> <span class=\"no\">true<\/span>\r\n    <span class=\"na\">command<\/span><span class=\"pi\">:<\/span> <span class=\"s\">gunicorn --bind :8000 config.wsgi:application<\/span>\r\n    <span class=\"na\">networks<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">backend_network<\/span>\r\n    <span class=\"na\">environment<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">CHOKIDAR_USEPOLLING=true<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">DJANGO_SETTINGS_MODULE=config.local_settings<\/span>\r\n  <span class=\"na\">server<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">container_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">nginx<\/span>\r\n    <span class=\"na\">build<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">context<\/span><span class=\"pi\">:<\/span> <span class=\"s\">.\/nginx\/.<\/span>\r\n      <span class=\"na\">dockerfile<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Dockerfile.dev<\/span>\r\n    <span class=\"na\">volumes<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">static_volume:\/code\/staticfiles<\/span> <span class=\"c1\"># &lt;-- bind the static volume<\/span>\r\n    <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">8080:80\"<\/span>\r\n    <span class=\"na\">depends_on<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">web-back<\/span>\r\n    <span class=\"na\">networks<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">backend_network<\/span>\r\n<span class=\"na\">networks<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">backend_network<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">driver<\/span><span class=\"pi\">:<\/span> <span class=\"s\">bridge<\/span>\r\n<span class=\"na\">volumes<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">static_volume<\/span><span class=\"pi\">:<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"c\"># docker-compose.yml\u3067\u8d77\u52d5\u3059\u308b<\/span>\r\n<span class=\"nv\">$\\<\/span>gke-django-tutorial<span class=\"se\">\\b<\/span>ackend<span class=\"se\">\\d<\/span>ocker-compose up <span class=\"nt\">--build<\/span>\r\n<\/code><\/pre>\n<p>http:\/\/localhost:8080\u88ab\u8f6c\u53d1\u5230Nginx\u5bb9\u5668\u768480\u7aef\u53e3\uff0c\u518d\u8f6c\u53d1\u5230Django\u76848000\u7aef\u53e3\u3002<\/p>\n<p>\u8ba9\u6211\u4eec\u8bbf\u95ee http:\/\/localhost:8080\/admin\/\uff0c\u5e76\u786e\u8ba4CSS\u662f\u5426\u5df2\u7ecf\u751f\u6548\u3002<\/p>\n<p>\u5728\u672c\u5730\u73af\u5883\u4e0b\uff0c\u4f7f\u7528docker-compose\u542f\u52a8\uff0c\u5df2\u7ecf\u51c6\u5907\u597d\u4e86\u7528\u4e8e\u540e\u7aef\u5f00\u53d1\u7684\u73af\u5883\u3002<\/p>\n<p>\u524d\u7aef\u5f00\u53d1\uff1a\u4f7f\u7528Nginx + React\u5b9e\u73b0<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4f7f\u7528Nginx + Django\u8fdb\u884c\u5f00\u53d1\uff0c\u5728GKE\u4e0a\u4ece\u96f6\u90e8\u7f72Django+React\u7684\u540e\u7aef\u3002(1) \u60f3\u8981\u505a\u7684\u4e8b [&hellip;]<\/p>\n","protected":false},"author":9,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-49408","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u4f7f\u7528Nginx + Django\u5728GKE\u4e0a\u4ece\u96f6\u5f00\u59cb\u90e8\u7f72Django+React\uff081\uff09\u540e\u7aef\u5f00\u53d1 - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528nginx-django\u5728gke\u4e0a\u4ece\u96f6\u5f00\u59cb\u90e8\u7f72djangoreact\uff081\uff09\u540e\u7aef\u5f00\u53d1\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u4f7f\u7528Nginx + Django\u5728GKE\u4e0a\u4ece\u96f6\u5f00\u59cb\u90e8\u7f72Django+React\uff081\uff09\u540e\u7aef\u5f00\u53d1\" \/>\n<meta property=\"og:description\" content=\"\u4f7f\u7528Nginx + Django\u8fdb\u884c\u5f00\u53d1\uff0c\u5728GKE\u4e0a\u4ece\u96f6\u90e8\u7f72Django+React\u7684\u540e\u7aef\u3002(1) \u60f3\u8981\u505a\u7684\u4e8b [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528nginx-django\u5728gke\u4e0a\u4ece\u96f6\u5f00\u59cb\u90e8\u7f72djangoreact\uff081\uff09\u540e\u7aef\u5f00\u53d1\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-06-30T02:09:34+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-30T04:53:10+00:00\" \/>\n<meta name=\"author\" content=\"\u6e05, \u626c\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u6e05, \u626c\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8nginx-django%e5%9c%a8gke%e4%b8%8a%e4%bb%8e%e9%9b%b6%e5%bc%80%e5%a7%8b%e9%83%a8%e7%bd%b2djangoreact%ef%bc%881%ef%bc%89%e5%90%8e%e7%ab%af%e5%bc%80%e5%8f%91%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8nginx-django%e5%9c%a8gke%e4%b8%8a%e4%bb%8e%e9%9b%b6%e5%bc%80%e5%a7%8b%e9%83%a8%e7%bd%b2djangoreact%ef%bc%881%ef%bc%89%e5%90%8e%e7%ab%af%e5%bc%80%e5%8f%91%e3%80%82\/\",\"name\":\"\u4f7f\u7528Nginx + Django\u5728GKE\u4e0a\u4ece\u96f6\u5f00\u59cb\u90e8\u7f72Django+React\uff081\uff09\u540e\u7aef\u5f00\u53d1 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-06-30T02:09:34+00:00\",\"dateModified\":\"2024-04-30T04:53:10+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/cb5556d2501da73d864cac945e8d9461\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8nginx-django%e5%9c%a8gke%e4%b8%8a%e4%bb%8e%e9%9b%b6%e5%bc%80%e5%a7%8b%e9%83%a8%e7%bd%b2djangoreact%ef%bc%881%ef%bc%89%e5%90%8e%e7%ab%af%e5%bc%80%e5%8f%91%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8nginx-django%e5%9c%a8gke%e4%b8%8a%e4%bb%8e%e9%9b%b6%e5%bc%80%e5%a7%8b%e9%83%a8%e7%bd%b2djangoreact%ef%bc%881%ef%bc%89%e5%90%8e%e7%ab%af%e5%bc%80%e5%8f%91%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8nginx-django%e5%9c%a8gke%e4%b8%8a%e4%bb%8e%e9%9b%b6%e5%bc%80%e5%a7%8b%e9%83%a8%e7%bd%b2djangoreact%ef%bc%881%ef%bc%89%e5%90%8e%e7%ab%af%e5%bc%80%e5%8f%91%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u4f7f\u7528Nginx + Django\u5728GKE\u4e0a\u4ece\u96f6\u5f00\u59cb\u90e8\u7f72Django+React\uff081\uff09\u540e\u7aef\u5f00\u53d1\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/cb5556d2501da73d864cac945e8d9461\",\"name\":\"\u6e05, \u626c\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/32a4239de8ff29adace466261d309424a1e5fe9f7e3036bf89fe03f2e3dbe717?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/32a4239de8ff29adace466261d309424a1e5fe9f7e3036bf89fe03f2e3dbe717?s=96&d=mm&r=g\",\"caption\":\"\u6e05, \u626c\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/qingyang\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8nginx-django%e5%9c%a8gke%e4%b8%8a%e4%bb%8e%e9%9b%b6%e5%bc%80%e5%a7%8b%e9%83%a8%e7%bd%b2djangoreact%ef%bc%881%ef%bc%89%e5%90%8e%e7%ab%af%e5%bc%80%e5%8f%91%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u4f7f\u7528Nginx + Django\u5728GKE\u4e0a\u4ece\u96f6\u5f00\u59cb\u90e8\u7f72Django+React\uff081\uff09\u540e\u7aef\u5f00\u53d1 - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528nginx-django\u5728gke\u4e0a\u4ece\u96f6\u5f00\u59cb\u90e8\u7f72djangoreact\uff081\uff09\u540e\u7aef\u5f00\u53d1\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u4f7f\u7528Nginx + Django\u5728GKE\u4e0a\u4ece\u96f6\u5f00\u59cb\u90e8\u7f72Django+React\uff081\uff09\u540e\u7aef\u5f00\u53d1","og_description":"\u4f7f\u7528Nginx + Django\u8fdb\u884c\u5f00\u53d1\uff0c\u5728GKE\u4e0a\u4ece\u96f6\u90e8\u7f72Django+React\u7684\u540e\u7aef\u3002(1) \u60f3\u8981\u505a\u7684\u4e8b [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528nginx-django\u5728gke\u4e0a\u4ece\u96f6\u5f00\u59cb\u90e8\u7f72djangoreact\uff081\uff09\u540e\u7aef\u5f00\u53d1\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-06-30T02:09:34+00:00","article_modified_time":"2024-04-30T04:53:10+00:00","author":"\u6e05, \u626c","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u6e05, \u626c","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"9 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8nginx-django%e5%9c%a8gke%e4%b8%8a%e4%bb%8e%e9%9b%b6%e5%bc%80%e5%a7%8b%e9%83%a8%e7%bd%b2djangoreact%ef%bc%881%ef%bc%89%e5%90%8e%e7%ab%af%e5%bc%80%e5%8f%91%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8nginx-django%e5%9c%a8gke%e4%b8%8a%e4%bb%8e%e9%9b%b6%e5%bc%80%e5%a7%8b%e9%83%a8%e7%bd%b2djangoreact%ef%bc%881%ef%bc%89%e5%90%8e%e7%ab%af%e5%bc%80%e5%8f%91%e3%80%82\/","name":"\u4f7f\u7528Nginx + Django\u5728GKE\u4e0a\u4ece\u96f6\u5f00\u59cb\u90e8\u7f72Django+React\uff081\uff09\u540e\u7aef\u5f00\u53d1 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-06-30T02:09:34+00:00","dateModified":"2024-04-30T04:53:10+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/cb5556d2501da73d864cac945e8d9461"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8nginx-django%e5%9c%a8gke%e4%b8%8a%e4%bb%8e%e9%9b%b6%e5%bc%80%e5%a7%8b%e9%83%a8%e7%bd%b2djangoreact%ef%bc%881%ef%bc%89%e5%90%8e%e7%ab%af%e5%bc%80%e5%8f%91%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8nginx-django%e5%9c%a8gke%e4%b8%8a%e4%bb%8e%e9%9b%b6%e5%bc%80%e5%a7%8b%e9%83%a8%e7%bd%b2djangoreact%ef%bc%881%ef%bc%89%e5%90%8e%e7%ab%af%e5%bc%80%e5%8f%91%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8nginx-django%e5%9c%a8gke%e4%b8%8a%e4%bb%8e%e9%9b%b6%e5%bc%80%e5%a7%8b%e9%83%a8%e7%bd%b2djangoreact%ef%bc%881%ef%bc%89%e5%90%8e%e7%ab%af%e5%bc%80%e5%8f%91%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u4f7f\u7528Nginx + Django\u5728GKE\u4e0a\u4ece\u96f6\u5f00\u59cb\u90e8\u7f72Django+React\uff081\uff09\u540e\u7aef\u5f00\u53d1"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/cb5556d2501da73d864cac945e8d9461","name":"\u6e05, \u626c","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/32a4239de8ff29adace466261d309424a1e5fe9f7e3036bf89fe03f2e3dbe717?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/32a4239de8ff29adace466261d309424a1e5fe9f7e3036bf89fe03f2e3dbe717?s=96&d=mm&r=g","caption":"\u6e05, \u626c"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/qingyang\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8nginx-django%e5%9c%a8gke%e4%b8%8a%e4%bb%8e%e9%9b%b6%e5%bc%80%e5%a7%8b%e9%83%a8%e7%bd%b2djangoreact%ef%bc%881%ef%bc%89%e5%90%8e%e7%ab%af%e5%bc%80%e5%8f%91%e3%80%82\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/49408","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=49408"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/49408\/revisions"}],"predecessor-version":[{"id":92024,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/49408\/revisions\/92024"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=49408"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=49408"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=49408"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}