{"id":49357,"date":"2023-07-05T12:38:37","date_gmt":"2022-10-31T14:32:38","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e7%94%a8dockerdjangonexttypescriptecs%e5%88%9b%e5%bb%ba%e5%ba%94%e7%94%a8%e7%9a%84%e6%95%85%e4%ba%8b2-%ef%bd%9e-%e4%bb%8edjango%e7%9a%84%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae%e5%88%b0%e5%88%9b\/"},"modified":"2024-04-30T12:06:12","modified_gmt":"2024-04-30T04:06:12","slug":"%e7%94%a8dockerdjangonexttypescriptecs%e5%88%9b%e5%bb%ba%e5%ba%94%e7%94%a8%e7%9a%84%e6%95%85%e4%ba%8b2-%ef%bd%9e-%e4%bb%8edjango%e7%9a%84%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae%e5%88%b0%e5%88%9b","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e7%94%a8dockerdjangonexttypescriptecs%e5%88%9b%e5%bb%ba%e5%ba%94%e7%94%a8%e7%9a%84%e6%95%85%e4%ba%8b2-%ef%bd%9e-%e4%bb%8edjango%e7%9a%84%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae%e5%88%b0%e5%88%9b\/","title":{"rendered":"\u7528Docker+Django+Next+TypeScript+ECS\u521b\u5efa\u5e94\u7528\u7684\u6545\u4e8b(2) \uff5e \u4eceDjango\u7684\u521d\u59cb\u8bbe\u7f6e\u5230\u521b\u5efa\u6a21\u578b\u7684\u90e8\u5206 \uff5e"},"content":{"rendered":"<h1>\u9996\u5148<\/h1>\n<p>\u63a5\u4e0b\u6765\u662f\u4e0a\u4e00\u6b21\u7684\u5ef6\u7eed\u3002<\/p>\n<p>\u524d\u4e00\u4e2a\u6587\u7ae0\uff1a\u5173\u4e8e\u4f7f\u7528Docker+Django+Next+TypeScript+ECS\u521b\u5efa\u5e94\u7528\u7a0b\u5e8f\u7684\u6545\u4e8b\uff081\uff09\u301c\u51c6\u5907\u7bc7\u301c<br \/>\n\u540e\u4e00\u4e2a\u6587\u7ae0\uff1a\u5173\u4e8e\u4f7f\u7528Docker+Django+Next+TypeScript+ECS\u521b\u5efa\u5e94\u7528\u7a0b\u5e8f\u7684\u6545\u4e8b\uff083\uff09\u301c\u4eceDjango\u6a21\u5f0f\u521b\u5efa\u5230\u6570\u636e\u83b7\u53d6\u301c<\/p>\n<p>\u8fd9\u6b21\u7684\u6587\u7ae0\u5199\u4e86\u5173\u4e8eDjango\u9879\u76ee\u7684\u521d\u59cb\u8bbe\u7f6e\u5230\u521b\u5efa\u6a21\u578b\u7684\u8fc7\u7a0b\u3002<br \/>\n\u6211\u4eec\u9009\u62e9\u4e86Django\u4f5c\u4e3a\u540e\u7aef\uff0c\u5e76\u91c7\u7528\u4e86graphene-django\u6765\u5c06Django\u8f6c\u5316\u4e3aAPI\u3002<br \/>\n\u5173\u4e8egraphene-django\uff0c\u6211\u4eec\u53c2\u8003\u4e86\u4e0b\u9762\u7684\u6587\u7ae0\u3002<\/p>\n<p>&nbsp;<\/p>\n<h1>1. \u521d\u6b65\u8bbe\u7f6e<\/h1>\n<p>\u6211\u5c06\u521b\u5efa\u7528\u4e8e\u5f00\u53d1\u548c\u6d4b\u8bd5\u73af\u5883\u7684settings\u4ee5\u53ca\u7528\u4e8e\u751f\u4ea7\u73af\u5883\u7684settings\u3002\u6b64\u5916\uff0c\u6211\u5c06\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a.env\u7684\u6587\u4ef6\u6765\u7ba1\u7406\u751f\u4ea7\u73af\u5883\u7684SECRET_KEY\uff0c\u5e76\u901a\u8fc7django-environ\u5305\u8fdb\u884c\u7ba1\u7406\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"p\">myProject\/\r\n<\/span>\u3000\u3000\u3000 app\/\r\n<span class=\"gi\">+   .env\r\n<\/span>\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000app\/\r\n        settings.py\r\n<span class=\"gi\">+\u3000\u3000\u3000\u3000\u3000\u3000    dev_settings.py\r\n+\u3000\u3000\u3000\u3000\u3000\u3000    prod_settings.py\r\n<\/span>        ...\r\n<\/code><\/pre>\n<ul class=\"post-ul\">settings.py<\/ul>\n<p>\u8fd9\u91cc\u8bb0\u8f7d\u4e86\u5728\u6240\u6709\u5f00\u53d1\u73af\u5883\u4e2d\u5171\u540c\u7684\u90e8\u5206\u3002SECRET_KEY\u548cDEBUG\u5df2\u7ecf\u5728\u4e0d\u540c\u7684\u73af\u5883\u8bbe\u7f6e\u4e2d\u8fdb\u884c\u4e86\u8bb0\u5f55\u3002<br \/>\nALLOWED_HOSTS\u901a\u8fc7\u73af\u5883\u53d8\u91cf\u8fdb\u884c\u8bbe\u7f6e\uff0c\u53ef\u4ee5\u5728\u6bcf\u4e2a\u73af\u5883\u4e2d\u8fdb\u884c\u66f4\u6539\u3002<br \/>\n\u6b64\u5916\uff0c\u8fd8\u8fdb\u884c\u4e86graphene-django\u548c\u6570\u636e\u5e93\u914d\u7f6e\u7684\u66f4\u6539\uff0c\u5c06\u8bed\u8a00\u8bbe\u7f6e\u4e3a\u65e5\u8bed\uff0c\u65f6\u533a\u8bbe\u7f6e\u4e3a\u65e5\u672c\u3002<br \/>\n\u540c\u65f6\uff0cAUTH_USER_MODEL\u5df2\u88ab\u8bbe\u7f6e\u4e3a\u7a0d\u540e\u521b\u5efa\u7684User\u6a21\u578b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"gi\">+ import os\r\n<\/span>  from pathlib import Path\r\n\r\n  BASE_DIR = Path(__file__).resolve().parent.parent\r\n<span class=\"gd\">-\r\n- SECRET_KEY = '1234567890**************************'\r\n- DEBUG = True \r\n- \r\n- ALLOWED_HOSTS = []\r\n<\/span><span class=\"gi\">+ ALLOWED_HOSTS = [os.environ['ALLOWED_HOST']]\r\n<\/span> \r\n  INSTALLED_APPS = [\r\n      'django.contrib.admin',\r\n      'django.contrib.auth',\r\n      'django.contrib.contenttypes',\r\n      'django.contrib.sessions',\r\n      'django.contrib.messages',\r\n      'django.contrib.staticfiles',\r\n<span class=\"gi\">+     'graphene_django',\r\n+     'corsheaders',\r\n+     'api.apps.ApiConfig',\r\n<\/span>  ]\r\n\r\n  MIDDLEWARE = [\r\n      'django.middleware.security.SecurityMiddleware',\r\n      'django.contrib.sessions.middleware.SessionMiddleware',\r\n      'django.middleware.common.CommonMiddleware',\r\n      'django.middleware.csrf.CsrfViewMiddleware',\r\n      'django.contrib.auth.middleware.AuthenticationMiddleware',\r\n      'django.contrib.messages.middleware.MessageMiddleware',\r\n      'django.middleware.clickjacking.XFrameOptionsMiddleware',\r\n<span class=\"gi\">+     'corsheaders.middleware.CorsMiddleware',\r\n<\/span>  ]\r\n\r\n<span class=\"gi\">+\r\n+ CORS_ORIGIN_WHITELIST = [\r\n+     os.environ['FRONT_URI']\r\n+ ]\r\n+\r\n+ GRAPHWL_JWT = {\r\n+     'JWT_VERIFY_EXPORATION': False,\r\n+ }\r\n+\r\n+ GRAPHENE = {\r\n+     'SCHEMA':\r\n+         'app.schema.schema',\r\n+         'MIDDLEWARE': [\r\n+             'graphql_jwt.middleware.JSONWebTokenMiddleware',\r\n+         ],\r\n+ }\r\n+ \r\n+ AUTHENTICATION_BACKENDS = [\r\n+     'graphql_jwt.backends.JSONWebTokenBackend',\r\n+     'django.contrib.auth.backends.ModelBackend',\r\n+ ]\r\n<\/span>\r\n  ROOT_URLCONF = 'app.urls'\r\n\r\n  TEMPLATES = [\r\n      {\r\n          'BACKEND': 'django.template.backends.django.DjangoTemplates',\r\n          'DIRS': [],\r\n          'APP_DIRS': True,\r\n          'OPTIONS': {\r\n              'context_processors': [\r\n                  'django.template.context_processors.debug',\r\n                  'django.template.context_processors.request',\r\n                  'django.contrib.auth.context_processors.auth',\r\n                  'django.contrib.messages.context_processors.messages',\r\n              ],\r\n          },\r\n      },\r\n  ]\r\n\r\n  WSGI_APPLICATION = 'app.wsgi.application'\r\n\r\n  DATABASES = {\r\n      'default': {\r\n<span class=\"gd\">-          'ENGINE': 'django.db.backends.sqlite3',\r\n<\/span><span class=\"gi\">+          'ENGINE': 'django.db.backends.postgresql',\r\n<\/span><span class=\"gd\">-          'NAME': BASE_DIR \/ 'db.sqlite3',\r\n<\/span><span class=\"gi\">+          'NAME': os.environ['DB_NAME'],\r\n+          'USER': os.environ['DB_USER'],\r\n+          'HOST': os.environ['DB_HOST'],\r\n+          'PORT': 5432,\r\n<\/span>       }\r\n  }\r\n\r\n  AUTH_PASSWORD_VALIDATORS = [\r\n      {\r\n          'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',\r\n      },\r\n      {\r\n          'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',\r\n      },\r\n      {\r\n          'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',\r\n      },\r\n      {\r\n          'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',\r\n      },\r\n  ]\r\n\r\n<span class=\"gd\">- LANGUAGE_CODE = 'en-us'\r\n<\/span><span class=\"gi\">+ LANGUAGE_CODE = 'ja'\r\n<\/span><span class=\"gd\">-\r\n- TIME_ZONE = 'UTC'\r\n<\/span><span class=\"gi\">+ TIME_ZONE = 'Asia\/Tokyo'\r\n<\/span>\r\n  USE_I18N = True\r\n\r\n  USE_L10N = True\r\n\r\n  USE_TZ = True\r\n<span class=\"gi\">+\r\n+ AUTH_USER_MODEL = 'api.CustomUser'\r\n<\/span>\r\n  STATIC_URL = '\/static\/'\r\n<span class=\"gi\">+\r\n+ STATIC_ROOT = os.path.join(BASE_DIR, 'static')\r\n<\/span><\/code><\/pre>\n<ul class=\"post-ul\">dev_settings.py<\/ul>\n<p>\u6211\u6b63\u5728\u8a18\u9304\u958b\u767c\u74b0\u5883\u548c\u6e2c\u8a66\u74b0\u5883\u7684\u8a2d\u5b9a\u3002SECRET_KEY\u7684\u503c\u8207\u751f\u7522\u74b0\u5883\u4e0d\u540c\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"kn\">from<\/span> <span class=\"n\">.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\">SECRET_KEY<\/span> <span class=\"o\">=<\/span> <span class=\"sh\">'<\/span><span class=\"s\">1234567890**************************<\/span><span class=\"sh\">'<\/span>\r\n<\/code><\/pre>\n<ul class=\"post-ul\">prod_settings.py<\/ul>\n<p>\u6211\u5728\u8fd9\u91cc\u5199\u4e0b\u4e86\u7528\u4e8e\u751f\u4ea7\u73af\u5883\u7684\u8bbe\u7f6e\u3002<br \/>\nSECRET_KEY\u901a\u8fc7django-environ\u5728.env\u6587\u4ef6\u4e2d\u8fdb\u884c\u4e86\u8bb0\u5f55\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"kn\">import<\/span> <span class=\"n\">os<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"n\">environ<\/span>\r\n\r\n<span class=\"kn\">from<\/span> <span class=\"n\">.settings<\/span> <span class=\"kn\">import<\/span> <span class=\"o\">*<\/span>\r\n\r\n<span class=\"n\">env<\/span> <span class=\"o\">=<\/span> <span class=\"n\">environ<\/span><span class=\"p\">.<\/span><span class=\"nc\">Env<\/span><span class=\"p\">()<\/span>\r\n<span class=\"n\">env<\/span><span class=\"p\">.<\/span><span class=\"nf\">read_env<\/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=\"nf\">join<\/span><span class=\"p\">(<\/span><span class=\"n\">BASE_DIR<\/span><span class=\"p\">,<\/span> <span class=\"sh\">'<\/span><span class=\"s\">.env<\/span><span class=\"sh\">'<\/span><span class=\"p\">))<\/span>\r\n\r\n<span class=\"n\">DEBUG<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">False<\/span>\r\n\r\n<span class=\"n\">SECRET_KEY<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">env<\/span><span class=\"p\">(<\/span><span class=\"sh\">'<\/span><span class=\"s\">SECRET_KEY<\/span><span class=\"sh\">'<\/span><span class=\"p\">)<\/span>\r\n<\/code><\/pre>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">.env<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u672c\u756a\u74b0\u5883\u7528\u306eSECRET_KEY\u3092\u8a18\u8f09\u3057\u3066\u3044\u307e\u3059\u3002<\/ul>\n<pre class=\"post-pre\"><code>SECRET_KEY=abcdefghijk************************\r\n<\/code><\/pre>\n<h1>2. \u5efa\u7acb\u6a21\u578b<\/h1>\n<p>\u6211\u5c06\u521b\u5efaUser\u6a21\u578b\u548cProfile\u6a21\u578b\u3002<br \/>\n\u5c06\u5176\u8bb0\u5f55\u5728api\u6587\u4ef6\u5939\u7684models.py\u6587\u4ef6\u4e2d\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">models.py<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">User\u30e2\u30c7\u30eb\u306fDjango\u6a19\u6e96\u306eAbstractBaseUser\u3092\u30aa\u30fc\u30d0\u30fc\u30e9\u30a4\u30c9\u3057\u3066\u4f5c\u6210\u3057\u307e\u3059\u3002<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">email\u3001password\u3067\u306e\u8a8d\u8a3c\u306b\u3059\u308b\u305f\u3081\u3001name\u5c5e\u6027\u306fProfile\u30e2\u30c7\u30eb\u306b\u5206\u3051\u3001User\u30e2\u30c7\u30eb\u306f\u5fc5\u8981\u6700\u4f4e\u9650\u306e\u5c5e\u6027\u306b\u3057\u3066\u3044\u307e\u3059\u3002<\/ul>\n<pre class=\"post-pre\"><code>\r\n<span class=\"kn\">from<\/span> <span class=\"n\">django.db<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">models<\/span>\r\n<span class=\"kn\">from<\/span> <span class=\"n\">django.contrib.auth.models<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">AbstractBaseUser<\/span><span class=\"p\">,<\/span> <span class=\"n\">BaseUserManager<\/span><span class=\"p\">,<\/span> <span class=\"n\">PermissionsMixin<\/span>\r\n\r\n<span class=\"k\">class<\/span> <span class=\"nc\">CustomUserManager<\/span><span class=\"p\">(<\/span><span class=\"n\">BaseUserManager<\/span><span class=\"p\">):<\/span>\r\n    <span class=\"k\">def<\/span> <span class=\"nf\">create_user<\/span><span class=\"p\">(<\/span><span class=\"n\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">email<\/span><span class=\"p\">,<\/span> <span class=\"n\">password<\/span><span class=\"o\">=<\/span><span class=\"bp\">None<\/span><span class=\"p\">):<\/span>\r\n\r\n        <span class=\"k\">if<\/span> <span class=\"ow\">not<\/span> <span class=\"n\">email<\/span><span class=\"p\">:<\/span>\r\n            <span class=\"k\">raise<\/span> <span class=\"nc\">ValueError<\/span><span class=\"p\">(<\/span><span class=\"sh\">'<\/span><span class=\"s\">email is must<\/span><span class=\"sh\">'<\/span><span class=\"p\">)<\/span>\r\n\r\n        <span class=\"n\">user<\/span> <span class=\"o\">=<\/span> <span class=\"n\">self<\/span><span class=\"p\">.<\/span><span class=\"nf\">model<\/span><span class=\"p\">(<\/span><span class=\"n\">email<\/span><span class=\"o\">=<\/span><span class=\"n\">self<\/span><span class=\"p\">.<\/span><span class=\"nf\">normalize_email<\/span><span class=\"p\">(<\/span><span class=\"n\">email<\/span><span class=\"p\">))<\/span>\r\n        <span class=\"n\">user<\/span><span class=\"p\">.<\/span><span class=\"nf\">set_password<\/span><span class=\"p\">(<\/span><span class=\"n\">password<\/span><span class=\"p\">)<\/span>\r\n        <span class=\"n\">user<\/span><span class=\"p\">.<\/span><span class=\"nf\">save<\/span><span class=\"p\">(<\/span><span class=\"n\">using<\/span><span class=\"o\">=<\/span><span class=\"n\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">_db<\/span><span class=\"p\">)<\/span>\r\n\r\n        <span class=\"k\">return<\/span> <span class=\"n\">user<\/span>\r\n\r\n    <span class=\"k\">def<\/span> <span class=\"nf\">create_superuser<\/span><span class=\"p\">(<\/span><span class=\"n\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">email<\/span><span class=\"p\">,<\/span> <span class=\"n\">password<\/span><span class=\"p\">):<\/span>\r\n        <span class=\"n\">user<\/span> <span class=\"o\">=<\/span> <span class=\"n\">self<\/span><span class=\"p\">.<\/span><span class=\"nf\">create_user<\/span><span class=\"p\">(<\/span><span class=\"n\">email<\/span><span class=\"p\">,<\/span> <span class=\"n\">password<\/span><span class=\"p\">)<\/span>\r\n        <span class=\"n\">user<\/span><span class=\"p\">.<\/span><span class=\"n\">is_staff<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">True<\/span>\r\n        <span class=\"n\">user<\/span><span class=\"p\">.<\/span><span class=\"n\">is_superuser<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">True<\/span>\r\n        <span class=\"n\">user<\/span><span class=\"p\">.<\/span><span class=\"nf\">save<\/span><span class=\"p\">(<\/span><span class=\"n\">using<\/span><span class=\"o\">=<\/span><span class=\"n\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">_db<\/span><span class=\"p\">)<\/span>\r\n\r\n        <span class=\"k\">return<\/span> <span class=\"n\">user<\/span>\r\n\r\n<span class=\"k\">class<\/span> <span class=\"nc\">CustomUser<\/span><span class=\"p\">(<\/span><span class=\"n\">AbstractBaseUser<\/span><span class=\"p\">,<\/span> <span class=\"n\">PermissionsMixin<\/span><span class=\"p\">):<\/span>\r\n    <span class=\"n\">email<\/span> <span class=\"o\">=<\/span> <span class=\"n\">models<\/span><span class=\"p\">.<\/span><span class=\"nc\">EmailField<\/span><span class=\"p\">(<\/span><span class=\"n\">max_length<\/span><span class=\"o\">=<\/span><span class=\"mi\">50<\/span><span class=\"p\">,<\/span> <span class=\"n\">unique<\/span><span class=\"o\">=<\/span><span class=\"bp\">True<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"n\">is_active<\/span> <span class=\"o\">=<\/span> <span class=\"n\">models<\/span><span class=\"p\">.<\/span><span class=\"nc\">BooleanField<\/span><span class=\"p\">(<\/span><span class=\"n\">default<\/span><span class=\"o\">=<\/span><span class=\"bp\">True<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"n\">is_staff<\/span> <span class=\"o\">=<\/span> <span class=\"n\">models<\/span><span class=\"p\">.<\/span><span class=\"nc\">BooleanField<\/span><span class=\"p\">(<\/span><span class=\"n\">default<\/span><span class=\"o\">=<\/span><span class=\"bp\">False<\/span><span class=\"p\">)<\/span>\r\n\r\n    <span class=\"n\">objects<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">CustomUserManager<\/span><span class=\"p\">()<\/span>\r\n\r\n    <span class=\"n\">USERNAME_FIELD<\/span> <span class=\"o\">=<\/span> <span class=\"sh\">'<\/span><span class=\"s\">email<\/span><span class=\"sh\">'<\/span>\r\n\r\n    <span class=\"k\">def<\/span> <span class=\"nf\">__str__<\/span><span class=\"p\">(<\/span><span class=\"n\">self<\/span><span class=\"p\">):<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">email<\/span>\r\n\r\n<span class=\"k\">class<\/span> <span class=\"nc\">Profile<\/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\">nickname<\/span> <span class=\"o\">=<\/span> <span class=\"n\">models<\/span><span class=\"p\">.<\/span><span class=\"nc\">CharField<\/span><span class=\"p\">(<\/span><span class=\"n\">max_length<\/span><span class=\"o\">=<\/span><span class=\"mi\">20<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"n\">user<\/span> <span class=\"o\">=<\/span> <span class=\"n\">models<\/span><span class=\"p\">.<\/span><span class=\"nc\">OneToOneField<\/span><span class=\"p\">(<\/span>\r\n        <span class=\"n\">CustomUser<\/span><span class=\"p\">,<\/span> <span class=\"n\">related_name<\/span><span class=\"o\">=<\/span><span class=\"sh\">\"<\/span><span class=\"s\">profile<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"n\">on_delete<\/span><span class=\"o\">=<\/span><span class=\"n\">models<\/span><span class=\"p\">.<\/span><span class=\"n\">CASCADE<\/span>\r\n    <span class=\"p\">)<\/span>\r\n\r\n    <span class=\"k\">def<\/span> <span class=\"nf\">__str__<\/span><span class=\"p\">(<\/span><span class=\"n\">self<\/span><span class=\"p\">):<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">nickname<\/span>\r\n\r\n<\/code><\/pre>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">admin.py<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">Django\u6a19\u6e96\u306e\u7ba1\u7406\u753b\u9762\u306b\u3066User\u30e2\u30c7\u30eb\u3068Profile\u30e2\u30c7\u30eb\u3092CRUD\u64cd\u4f5c\u3067\u304d\u308b\u3088\u3046\u306b\u8a18\u8f09\u3057\u307e\u3059\u3002<\/ul>\n<pre class=\"post-pre\"><code><span class=\"kn\">from<\/span> <span class=\"n\">django.contrib<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">admin<\/span>\r\n<span class=\"kn\">from<\/span> <span class=\"n\">.models<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">CustomUser<\/span><span class=\"p\">,<\/span> <span class=\"n\">Profile<\/span>\r\n\r\n<span class=\"n\">admin<\/span><span class=\"p\">.<\/span><span class=\"n\">site<\/span><span class=\"p\">.<\/span><span class=\"nf\">register<\/span><span class=\"p\">(<\/span><span class=\"n\">CustomUser<\/span><span class=\"p\">)<\/span>\r\n<span class=\"n\">admin<\/span><span class=\"p\">.<\/span><span class=\"n\">site<\/span><span class=\"p\">.<\/span><span class=\"nf\">register<\/span><span class=\"p\">(<\/span><span class=\"n\">Profile<\/span><span class=\"p\">)<\/span>\r\n\r\n<\/code><\/pre>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">docker-compose.yml<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">Django\u30b3\u30f3\u30c6\u30ca\u8d77\u52d5\u6642\u306b\u3001\u958b\u767a\u74b0\u5883\u7528\u306esettings\u3092\u4f7f\u7528\u3059\u308b\u3088\u3046\u306b\u4fee\u6b63\u3057\u307e\u3059\u3002<\/ul>\n<pre class=\"post-pre\"><code>  version: \"3\"\r\n\r\n  services:\r\n    app:\r\n      build:\r\n        context: .\r\n      ports:\r\n        - \"8000:8000\"\r\n      volumes:\r\n        - .\/app:\/app\r\n<span class=\"gd\">-      command: sh -c \"python manage.py migrate &amp;&amp;\r\n-       python manage.py runserver 0.0.0.0:8000\"\r\n<\/span><span class=\"gi\">+      command: sh -c \"python manage.py migrate --settings app.dev_settings &amp;&amp;\r\n+       python manage.py runserver 0.0.0.0:8000\u3000--settings app.dev_settings\"\r\n<\/span>      environment:\r\n        - FRONT_URI=http:\/\/localhost:3000\r\n        - ALLOWED_HOST=localhost\r\n        - DB_HOST=db\r\n        - DB_NAME=app\r\n        - DB_USER=postgres\r\n        - DB_PASS=supersecretpassword\r\n      depends_on:\r\n        - db\r\n\u30fb\u30fb\u30fb\r\n<\/code><\/pre>\n<p>\u901a\u8fc7\u4ee5\u4e0b\u547d\u4ee4\uff0c\u66f4\u65b0\u6570\u636e\u5e93\u5e76\u521b\u5efa\u7ba1\u7406\u5458\u7528\u6237\u3002<\/p>\n<pre class=\"post-pre\"><code>$ make migrate\r\n$ make admin\r\n<\/code><\/pre>\n<p>\u91cd\u65b0\u542f\u52a8\u5bb9\u5668\uff0c\u7136\u540e\u8bbf\u95eelocalhost:8000\/admin\u3002<br \/>\n\u5982\u679c\u5bb9\u5668\u6b63\u5e38\u5de5\u4f5c\uff0c\u5c06\u663e\u793a\u7ba1\u7406\u5458\u767b\u5f55\u9875\u9762\u3002<br \/>\n\u8bf7\u4f7f\u7528\u5148\u524d\u521b\u5efa\u7684\u7ba1\u7406\u5458\u8d26\u6237\u767b\u5f55\u3002<br \/>\n\u767b\u5f55\u540e\uff0c\u5c06\u8df3\u8f6c\u5230\u53ef\u4ee5\u6267\u884cUser\u6a21\u578b\u548cProfile\u6a21\u578b\u7684CRUD\u64cd\u4f5c\u7684\u9875\u9762\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8ad9913a08637a6cb814\/30-0.png\" alt=\"Django\u7ba1\u7406\u8005\u5f8c\u306e\u30ed\u30b0\u30a4\u30f3\u30da\u30fc\u30b8\" \/><\/div>\n<h1>\u603b\u7ed3\u4e86<\/h1>\n<p>\u6211\u8fd9\u6b21\u8fdb\u884c\u4e86\u5bf9\u8bbe\u7f6e\u7684\u4fee\u6b63\uff0c\u521b\u5efa\u4e86User\u6a21\u578b\u548cProfile\u6a21\u578b\u3002<br \/>\n\u4e0b\u6b21\uff0c\u6211\u5e0c\u671b\u5c06Django\u4f5c\u4e3aGraphql\uff0c\u521b\u5efa\u6a21\u5f0f\uff0c\u5e76\u7f16\u5199\u5728\u6d4f\u89c8\u5668\u4e2d\u83b7\u53d6\u6570\u636e\u7684\u90e8\u5206\u3002<\/p>\n<p>\u7528Docker+Django+Next+TypeScript+ECS\u521b\u5efa\u5e94\u7528\u7684\u6545\u4e8b(3) &#8211; \u4ece\u521b\u5efaDjango\u6a21\u5f0f\u5230\u83b7\u53d6\u6570\u636e\u7684\u8fc7\u7a0b\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u9996\u5148 \u63a5\u4e0b\u6765\u662f\u4e0a\u4e00\u6b21\u7684\u5ef6\u7eed\u3002 \u524d\u4e00\u4e2a\u6587\u7ae0\uff1a\u5173\u4e8e\u4f7f\u7528Docker+Django+Next+TypeScript+ [&hellip;]<\/p>\n","protected":false},"author":11,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-49357","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>\u7528Docker+Django+Next+TypeScript+ECS\u521b\u5efa\u5e94\u7528\u7684\u6545\u4e8b(2) \uff5e \u4eceDjango\u7684\u521d\u59cb\u8bbe\u7f6e\u5230\u521b\u5efa\u6a21\u578b\u7684\u90e8\u5206 \uff5e - 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\/\u7528dockerdjangonexttypescriptecs\u521b\u5efa\u5e94\u7528\u7684\u6545\u4e8b2-\uff5e-\u4ecedjango\u7684\u521d\u59cb\u8bbe\u7f6e\u5230\u521b\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u7528Docker+Django+Next+TypeScript+ECS\u521b\u5efa\u5e94\u7528\u7684\u6545\u4e8b(2) \uff5e \u4eceDjango\u7684\u521d\u59cb\u8bbe\u7f6e\u5230\u521b\u5efa\u6a21\u578b\u7684\u90e8\u5206 \uff5e\" \/>\n<meta property=\"og:description\" content=\"\u9996\u5148 \u63a5\u4e0b\u6765\u662f\u4e0a\u4e00\u6b21\u7684\u5ef6\u7eed\u3002 \u524d\u4e00\u4e2a\u6587\u7ae0\uff1a\u5173\u4e8e\u4f7f\u7528Docker+Django+Next+TypeScript+ [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u7528dockerdjangonexttypescriptecs\u521b\u5efa\u5e94\u7528\u7684\u6545\u4e8b2-\uff5e-\u4ecedjango\u7684\u521d\u59cb\u8bbe\u7f6e\u5230\u521b\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2022-10-31T14:32:38+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-30T04:06:12+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8ad9913a08637a6cb814\/30-0.png\" \/>\n<meta name=\"author\" content=\"\u65b0, \u97f5\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u65b0, \u97f5\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 \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\/%e7%94%a8dockerdjangonexttypescriptecs%e5%88%9b%e5%bb%ba%e5%ba%94%e7%94%a8%e7%9a%84%e6%95%85%e4%ba%8b2-%ef%bd%9e-%e4%bb%8edjango%e7%9a%84%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae%e5%88%b0%e5%88%9b\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e7%94%a8dockerdjangonexttypescriptecs%e5%88%9b%e5%bb%ba%e5%ba%94%e7%94%a8%e7%9a%84%e6%95%85%e4%ba%8b2-%ef%bd%9e-%e4%bb%8edjango%e7%9a%84%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae%e5%88%b0%e5%88%9b\/\",\"name\":\"\u7528Docker+Django+Next+TypeScript+ECS\u521b\u5efa\u5e94\u7528\u7684\u6545\u4e8b(2) \uff5e \u4eceDjango\u7684\u521d\u59cb\u8bbe\u7f6e\u5230\u521b\u5efa\u6a21\u578b\u7684\u90e8\u5206 \uff5e - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2022-10-31T14:32:38+00:00\",\"dateModified\":\"2024-04-30T04:06:12+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/4ba4019495123db3038fd0809e6959c9\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e7%94%a8dockerdjangonexttypescriptecs%e5%88%9b%e5%bb%ba%e5%ba%94%e7%94%a8%e7%9a%84%e6%95%85%e4%ba%8b2-%ef%bd%9e-%e4%bb%8edjango%e7%9a%84%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae%e5%88%b0%e5%88%9b\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e7%94%a8dockerdjangonexttypescriptecs%e5%88%9b%e5%bb%ba%e5%ba%94%e7%94%a8%e7%9a%84%e6%95%85%e4%ba%8b2-%ef%bd%9e-%e4%bb%8edjango%e7%9a%84%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae%e5%88%b0%e5%88%9b\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e7%94%a8dockerdjangonexttypescriptecs%e5%88%9b%e5%bb%ba%e5%ba%94%e7%94%a8%e7%9a%84%e6%95%85%e4%ba%8b2-%ef%bd%9e-%e4%bb%8edjango%e7%9a%84%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae%e5%88%b0%e5%88%9b\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u7528Docker+Django+Next+TypeScript+ECS\u521b\u5efa\u5e94\u7528\u7684\u6545\u4e8b(2) \uff5e \u4eceDjango\u7684\u521d\u59cb\u8bbe\u7f6e\u5230\u521b\u5efa\u6a21\u578b\u7684\u90e8\u5206 \uff5e\"}]},{\"@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\/4ba4019495123db3038fd0809e6959c9\",\"name\":\"\u65b0, \u97f5\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g\",\"caption\":\"\u65b0, \u97f5\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yunxin\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e7%94%a8dockerdjangonexttypescriptecs%e5%88%9b%e5%bb%ba%e5%ba%94%e7%94%a8%e7%9a%84%e6%95%85%e4%ba%8b2-%ef%bd%9e-%e4%bb%8edjango%e7%9a%84%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae%e5%88%b0%e5%88%9b\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u7528Docker+Django+Next+TypeScript+ECS\u521b\u5efa\u5e94\u7528\u7684\u6545\u4e8b(2) \uff5e \u4eceDjango\u7684\u521d\u59cb\u8bbe\u7f6e\u5230\u521b\u5efa\u6a21\u578b\u7684\u90e8\u5206 \uff5e - 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\/\u7528dockerdjangonexttypescriptecs\u521b\u5efa\u5e94\u7528\u7684\u6545\u4e8b2-\uff5e-\u4ecedjango\u7684\u521d\u59cb\u8bbe\u7f6e\u5230\u521b\/","og_locale":"zh_CN","og_type":"article","og_title":"\u7528Docker+Django+Next+TypeScript+ECS\u521b\u5efa\u5e94\u7528\u7684\u6545\u4e8b(2) \uff5e \u4eceDjango\u7684\u521d\u59cb\u8bbe\u7f6e\u5230\u521b\u5efa\u6a21\u578b\u7684\u90e8\u5206 \uff5e","og_description":"\u9996\u5148 \u63a5\u4e0b\u6765\u662f\u4e0a\u4e00\u6b21\u7684\u5ef6\u7eed\u3002 \u524d\u4e00\u4e2a\u6587\u7ae0\uff1a\u5173\u4e8e\u4f7f\u7528Docker+Django+Next+TypeScript+ [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u7528dockerdjangonexttypescriptecs\u521b\u5efa\u5e94\u7528\u7684\u6545\u4e8b2-\uff5e-\u4ecedjango\u7684\u521d\u59cb\u8bbe\u7f6e\u5230\u521b\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2022-10-31T14:32:38+00:00","article_modified_time":"2024-04-30T04:06:12+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8ad9913a08637a6cb814\/30-0.png"}],"author":"\u65b0, \u97f5","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u65b0, \u97f5","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"3 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e7%94%a8dockerdjangonexttypescriptecs%e5%88%9b%e5%bb%ba%e5%ba%94%e7%94%a8%e7%9a%84%e6%95%85%e4%ba%8b2-%ef%bd%9e-%e4%bb%8edjango%e7%9a%84%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae%e5%88%b0%e5%88%9b\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e7%94%a8dockerdjangonexttypescriptecs%e5%88%9b%e5%bb%ba%e5%ba%94%e7%94%a8%e7%9a%84%e6%95%85%e4%ba%8b2-%ef%bd%9e-%e4%bb%8edjango%e7%9a%84%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae%e5%88%b0%e5%88%9b\/","name":"\u7528Docker+Django+Next+TypeScript+ECS\u521b\u5efa\u5e94\u7528\u7684\u6545\u4e8b(2) \uff5e \u4eceDjango\u7684\u521d\u59cb\u8bbe\u7f6e\u5230\u521b\u5efa\u6a21\u578b\u7684\u90e8\u5206 \uff5e - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2022-10-31T14:32:38+00:00","dateModified":"2024-04-30T04:06:12+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/4ba4019495123db3038fd0809e6959c9"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e7%94%a8dockerdjangonexttypescriptecs%e5%88%9b%e5%bb%ba%e5%ba%94%e7%94%a8%e7%9a%84%e6%95%85%e4%ba%8b2-%ef%bd%9e-%e4%bb%8edjango%e7%9a%84%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae%e5%88%b0%e5%88%9b\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e7%94%a8dockerdjangonexttypescriptecs%e5%88%9b%e5%bb%ba%e5%ba%94%e7%94%a8%e7%9a%84%e6%95%85%e4%ba%8b2-%ef%bd%9e-%e4%bb%8edjango%e7%9a%84%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae%e5%88%b0%e5%88%9b\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e7%94%a8dockerdjangonexttypescriptecs%e5%88%9b%e5%bb%ba%e5%ba%94%e7%94%a8%e7%9a%84%e6%95%85%e4%ba%8b2-%ef%bd%9e-%e4%bb%8edjango%e7%9a%84%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae%e5%88%b0%e5%88%9b\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u7528Docker+Django+Next+TypeScript+ECS\u521b\u5efa\u5e94\u7528\u7684\u6545\u4e8b(2) \uff5e \u4eceDjango\u7684\u521d\u59cb\u8bbe\u7f6e\u5230\u521b\u5efa\u6a21\u578b\u7684\u90e8\u5206 \uff5e"}]},{"@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\/4ba4019495123db3038fd0809e6959c9","name":"\u65b0, \u97f5","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g","caption":"\u65b0, \u97f5"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yunxin\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e7%94%a8dockerdjangonexttypescriptecs%e5%88%9b%e5%bb%ba%e5%ba%94%e7%94%a8%e7%9a%84%e6%95%85%e4%ba%8b2-%ef%bd%9e-%e4%bb%8edjango%e7%9a%84%e5%88%9d%e5%a7%8b%e8%ae%be%e7%bd%ae%e5%88%b0%e5%88%9b\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/49357","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\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=49357"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/49357\/revisions"}],"predecessor-version":[{"id":91812,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/49357\/revisions\/91812"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=49357"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=49357"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=49357"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}