{"id":49964,"date":"2022-11-22T14:51:32","date_gmt":"2023-01-08T00:34:00","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8%e4%bd%bf%e7%94%a8django%e5%88%9b%e5%bb%ba%e7%9a%84web%e5%ba%94%e7%94%a8%e4%b8%ad%e5%bc%95%e5%85%a5pwa%e7%9a%84%e6%96%b9%e6%b3%95\/"},"modified":"2024-04-29T01:57:41","modified_gmt":"2024-04-28T17:57:41","slug":"%e5%9c%a8%e4%bd%bf%e7%94%a8django%e5%88%9b%e5%bb%ba%e7%9a%84web%e5%ba%94%e7%94%a8%e4%b8%ad%e5%bc%95%e5%85%a5pwa%e7%9a%84%e6%96%b9%e6%b3%95","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8%e4%bd%bf%e7%94%a8django%e5%88%9b%e5%bb%ba%e7%9a%84web%e5%ba%94%e7%94%a8%e4%b8%ad%e5%bc%95%e5%85%a5pwa%e7%9a%84%e6%96%b9%e6%b3%95\/","title":{"rendered":"\u5728\u4f7f\u7528Django\u521b\u5efa\u7684WEB\u5e94\u7528\u4e2d\u5f15\u5165PWA\u7684\u65b9\u6cd5"},"content":{"rendered":"<h1>\u7b80\u4ecb<\/h1>\n<p>\u56e0\u4e3aDjango\u548cPython\u662f\u6211\u4f5c\u4e3a\u521d\u5b66\u8005\u521b\u5efa\u7684WEB\u5e94\u7528\u7a0b\u5e8f\uff0c\u5e76\u4e14\u5728\u5f15\u5165PWA\u65f6\uff0c\u867d\u7136\u6709\u4e00\u4e9b\u5173\u4e8ePWA\u7684\u65e5\u6587\u6587\u7ae0\uff0c\u4f46\u51e0\u4e4e\u6ca1\u6709\u5173\u4e8e\u5728Django\u4e2d\u5f15\u5165PWA\u7684\u793a\u4f8b\u7684\u6587\u7ae0\uff0c\u5bf9\u4e8e\u5f15\u5165\u975e\u5e38\u56f0\u96be\uff0c\u6240\u4ee5\u6211\u51b3\u5b9a\u5c06\u5176\u4f5c\u4e3a\u5907\u5fd8\u5f55\u4fdd\u5b58\u5728\u6587\u7ae0\u4e2d\u3002<\/p>\n<h1>PWA\u662f\u4ec0\u4e48<\/h1>\n<p>\u6e10\u8fdb\u5f0f\u7f51\u7edc\u5e94\u7528\uff08Progressive Web Apps\uff09\u662f\u7531\u8c37\u6b4c\u5f00\u53d1\u7684\u4e00\u79cd\u80fd\u4f7fWEB\u5e94\u7528\u7b49\u5728\u79fb\u52a8\u8bbe\u5907\u4e0a\u50cf\u672c\u5730\u5e94\u7528\u4e00\u6837\u8fd0\u884c\u7684\u673a\u5236\u3002\u901a\u8fc7\u5f15\u5165\u8fd9\u79cd\u673a\u5236\uff0c\u7528\u6237\u4e0d\u518d\u9700\u8981\u901a\u8fc7\u6d4f\u89c8\u5668\u8bbf\u95ee\uff0c\u53ea\u9700\u8981\u70b9\u51fb\u6dfb\u52a0\u5230\u4e3b\u5c4f\u5e55\u7684\u56fe\u6807\u5373\u53ef\u8bbf\u95eeWEB\u5e94\u7528\u3002<\/p>\n<h1>\u5728Django\u7684WEB\u5e94\u7528\u4e2d\u5f15\u5165<\/h1>\n<p>\u672c\u9898\u662f\u5173\u4e8ePWA\u7684\u3002<br \/>\n\u8fd9\u6b21\u7684\u76ee\u6807\u662f\u5728\u684c\u9762\u7248\u548c\u5b89\u5353\u7248\u7684Chrome\u4e0a\u5b89\u88c5PWA\uff0c\u7248\u672c\u5c06\u4f7f\u7528Django 2.2.4\u3002<br \/>\n\u5b8c\u6210\u7684\u4ee3\u7801\u5df2\u7ecf\u5728Github\u4e0a\u516c\u5f00\u4e86\u3002<br \/>\nhttps:\/\/github.com\/kitune-chan-250r\/pwa-sample<\/p>\n<h3>\u521b\u5efaDjango\u9879\u76ee\u548c\u5e94\u7528\u7a0b\u5e8f<\/h3>\n<pre class=\"post-pre\"><code>django-admin startproject mypwa\r\n<\/code><\/pre>\n<p>\u6211\u8981\u524d\u5f80mypwa\uff0c\u5e76\u521b\u5efa\u4e00\u4e2a\u540d\u4e3apwatest\u7684\u5e94\u7528\u7a0b\u5e8f\u3002<\/p>\n<pre class=\"post-pre\"><code>python manage.py startapp pwatest\r\n<\/code><\/pre>\n<p>\u5c06\u5e94\u7528\u7a0b\u5e8f\u6dfb\u52a0\u5230mypwa\/mypwa\/setting.py\u6587\u4ef6\u4e2d\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\"># \u7701\u7565\r\n<\/span><span class=\"n\">INSTALLED_APPS<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span>\r\n    <span class=\"sh\">'<\/span><span class=\"s\">django.contrib.admin<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"sh\">'<\/span><span class=\"s\">django.contrib.auth<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"sh\">'<\/span><span class=\"s\">django.contrib.contenttypes<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"sh\">'<\/span><span class=\"s\">django.contrib.sessions<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"sh\">'<\/span><span class=\"s\">django.contrib.messages<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"sh\">'<\/span><span class=\"s\">django.contrib.staticfiles<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"sh\">'<\/span><span class=\"s\">pwatest<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span> <span class=\"c1\">#\u8ffd\u52a0\r\n<\/span><span class=\"p\">]<\/span>\r\n<span class=\"c1\"># \u7701\u7565\r\n<\/span><\/code><\/pre>\n<p>\u670d\u52a1\u5668\u542f\u52a8<\/p>\n<pre class=\"post-pre\"><code>python manage.py runserver\r\n<\/code><\/pre>\n<p>\u53ea\u8981\u6309\u7167\u4e0b\u9762\u7684\u663e\u793a\uff0c\u5c31\u6ca1\u6709\u95ee\u9898\u3002<\/p>\n<pre class=\"post-pre\"><code>Watching for file changes with StatReloader                                                                            \r\nPerforming system checks...                                                                                            \r\n                                                                                                                       \r\nSystem check identified no issues (0 silenced).                                                                        \r\n                                                                                                                       \r\nYou have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.                                                                                        \r\nRun 'python manage.py migrate' to apply them.                                                                          \r\nOctober 22, 2019 - 23:52:56                                                                                                                                                             \r\nStarting development server at http:\/\/127.0.0.1:8000\/                                                                  \r\nQuit the server with CTRL-BREAK. \r\n<\/code><\/pre>\n<h3>\u521b\u5efa\u4e00\u4e2a\u6700\u57fa\u672c\u7684\u7f51\u9875\u5e94\u7528\u7a0b\u5e8f\u3002<\/h3>\n<h5>\u6211\u7684PWA\/mypwa\/urls.py<\/h5>\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\">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=\"nf\">path<\/span><span class=\"p\">(<\/span><span class=\"sh\">'<\/span><span class=\"s\">admin\/<\/span><span class=\"sh\">'<\/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=\"nf\">path<\/span><span class=\"p\">(<\/span><span class=\"sh\">''<\/span><span class=\"p\">,<\/span> <span class=\"nf\">include<\/span><span class=\"p\">(<\/span><span class=\"sh\">'<\/span><span class=\"s\">pwatest.urls<\/span><span class=\"sh\">'<\/span><span class=\"p\">))<\/span>\r\n<span class=\"p\">]<\/span>\r\n<\/code><\/pre>\n<h5>mypwa\/pwatest\/urls.py \uff08\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u6587\u4ef6\uff09<\/h5>\n<pre class=\"post-pre\"><code><span class=\"kn\">from<\/span> <span class=\"n\">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=\"n\">.views<\/span> <span class=\"kn\">import<\/span> <span class=\"o\">*<\/span>\r\n\r\n<span class=\"n\">urlpatterns<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span>\r\n    <span class=\"nf\">path<\/span><span class=\"p\">(<\/span><span class=\"sh\">''<\/span><span class=\"p\">,<\/span> <span class=\"n\">index<\/span><span class=\"p\">,<\/span> <span class=\"n\">name<\/span><span class=\"o\">=<\/span><span class=\"sh\">'<\/span><span class=\"s\">index<\/span><span class=\"sh\">'<\/span><span class=\"p\">)<\/span>\r\n<span class=\"p\">]<\/span>\r\n<\/code><\/pre>\n<h5>mypwa\/pwatest\/views.py (\u6211\u7684PWA \/ PWA\u6d4b\u8bd5 \/ \u89c6\u56fe.py)<\/h5>\n<pre class=\"post-pre\"><code><span class=\"kn\">from<\/span> <span class=\"n\">django.shortcuts<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">render<\/span>\r\n\r\n<span class=\"k\">def<\/span> <span class=\"nf\">index<\/span><span class=\"p\">(<\/span><span class=\"n\">request<\/span><span class=\"p\">):<\/span>\r\n\t<span class=\"k\">return<\/span> <span class=\"nf\">render<\/span><span class=\"p\">(<\/span><span class=\"n\">request<\/span><span class=\"p\">,<\/span> <span class=\"sh\">'<\/span><span class=\"s\">index.html<\/span><span class=\"sh\">'<\/span><span class=\"p\">)<\/span>\r\n<\/code><\/pre>\n<h5>\u5728\u4e2d\u6587\u4e2d\uff0c\u5c06\u4ee5\u4e0b\u5185\u5bb9\u8fdb\u884c\u91cd\u65b0\u8868\u8fbe\uff0c\u53ea\u9700\u7ed9\u51fa\u4e00\u4e2a\u9009\u9879\uff1a<\/h5>\n<p>mypwa\/pwatest\/templates\/index.html (\u521b\u5efa\u4e00\u4e2a templates \u6587\u4ef6\u5939\uff0c\u5e76\u5728\u5176\u4e2d\u521b\u5efa index.html \u6587\u4ef6)<\/p>\n<pre class=\"post-pre\"><code><span class=\"cp\">&lt;!DOCTYPE html&gt;<\/span>\r\n<span class=\"nt\">&lt;html&gt;<\/span>\r\n<span class=\"nt\">&lt;head&gt;<\/span>\r\n\t<span class=\"nt\">&lt;title&gt;&lt;\/title&gt;<\/span>\r\n<span class=\"nt\">&lt;\/head&gt;<\/span>\r\n<span class=\"nt\">&lt;body&gt;<\/span>\r\n\t<span class=\"nt\">&lt;h1&gt;<\/span>PWA test page<span class=\"nt\">&lt;\/h1&gt;<\/span>\r\n<span class=\"nt\">&lt;\/body&gt;<\/span>\r\n<span class=\"nt\">&lt;\/html&gt;<\/span>\r\n<\/code><\/pre>\n<p>\u5728\u6b64\u72b6\u6001\u4e0b\uff0c\u5f53\u8bbf\u95eehttp:\/\/127.0.0.1:8000\/\u65f6\uff0c\u5e94\u8be5\u4f1a\u51fa\u73b0\u4e00\u4e2a\u5199\u7740&#8221;PWA\u6d4b\u8bd5\u9875\u9762&#8221;\u7684\u9875\u9762\u3002<\/p>\n<h3>\u6dfb\u52a0PWA\u6240\u9700\u7684\u8bbe\u7f6e\u548c\u6587\u4ef6<\/h3>\n<p>\u5728\u5df2\u7ecf\u5f00\u53d1\u4e86\u6700\u57fa\u7840\u7684Web\u5e94\u7528\u7684\u57fa\u7840\u4e0a\uff0c\u6211\u4eec\u5c06\u5f15\u5165PWA\u3002<br \/>\n\u4e3a\u4e86\u4f7fPWA\u53ef\u4ee5\u5b89\u88c5\uff0c\u4ee5\u4e0b\u662f\u5fc5\u9700\u7684\u6700\u57fa\u7840\u7684\u9879\u76ee\uff08\u6458\u81eahttps:\/\/developers.google.com\/web\/fundamentals\/app-install-banners\uff09\u3002<\/p>\n<pre class=\"post-pre\"><code>Includes a web app manifest that includes:\r\n    \u30fbshort_name or name\r\n    \u30fbicons must include a 192px and a 512px sized icons\r\n    \u30fbstart_url\r\n    \u30fbdisplay must be one of: fullscreen, standalone, or minimal-ui\r\nServed over HTTPS (required for service workers)\r\nHas registered a service worker with a fetch event handler \r\n<\/code><\/pre>\n<p>\u7b80\u5355\u6765\u8bf4\uff0cmanifest.json\u6587\u4ef6\u4e2d\u5305\u542b\u4e86short_name\u548cname\u4e2d\u7684\u4e00\u4e2a\uff08\u5728\u6211\u7684\u73af\u5883\u4e2d\u4e24\u8005\u90fd\u662f\u5fc5\u9700\u7684\uff09\u3001192px\u548c512px\u5927\u5c0f\u7684\u56fe\u6807\u8bbe\u7f6e\u3001start_url\u3001display\uff08fullscreen\u3001standalone\u3001minimal-ui\u4e2d\u7684\u4e00\u4e2a\uff09\u7b49\u5185\u5bb9\u3002\u6b64\u5916\uff0c\u8be5\u6587\u4ef6\u9700\u8981\u901a\u8fc7HTTPS\u8fdb\u884c\u4f20\u8f93\uff0c\u5e76\u4e14\u5fc5\u987b\u4f7f\u7528service worker\u8fdb\u884c\u6ce8\u518c\u3002\u5bf9\u4e8e\u672c\u5730\u4e3b\u673a\u7684\u60c5\u51b5\uff0c\u4f3c\u4e4e\u4e5f\u53ef\u4ee5\u4f7f\u7528http\u8fdb\u884c\u64cd\u4f5c\u3002<\/p>\n<p>\u4e3a\u4e86\u6ee1\u8db3\u8fd9\u4e9b\u6761\u4ef6\uff0c\u6211\u4eec\u5c06\u5bf9\u4e4b\u524d\u7684Web\u5e94\u7528\u7a0b\u5e8f\u8fdb\u884c\u4fee\u6539\u3002<\/p>\n<h5>\u6211PWA \/ pwatest \/\u6a21\u677f\/ index.html<\/h5>\n<pre class=\"post-pre\"><code><span class=\"cp\">&lt;!DOCTYPE html&gt;<\/span>\r\n<span class=\"nt\">&lt;html&gt;<\/span>\r\n<span class=\"nt\">&lt;head&gt;<\/span>\r\n\t<span class=\"nt\">&lt;title&gt;<\/span>pwa test<span class=\"nt\">&lt;\/title&gt;<\/span>\r\n        <span class=\"c\">&lt;!-- \u3053\u3053\u304b\u3089 --&gt;<\/span>\r\n\t<span class=\"nt\">&lt;link<\/span> <span class=\"na\">rel=<\/span><span class=\"s\">\"manifest\"<\/span> <span class=\"na\">href=<\/span><span class=\"s\">\"static\/manifest.json\"<\/span><span class=\"nt\">&gt;<\/span>\r\n\t<span class=\"nt\">&lt;script&gt;<\/span>\r\n\t\t<span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">serviceWorker<\/span><span class=\"dl\">'<\/span> <span class=\"k\">in<\/span> <span class=\"nb\">navigator<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n  \t\t\t<span class=\"nb\">navigator<\/span><span class=\"p\">.<\/span><span class=\"nx\">serviceWorker<\/span><span class=\"p\">.<\/span><span class=\"nf\">register<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">sw.js<\/span><span class=\"dl\">'<\/span><span class=\"p\">).<\/span><span class=\"nf\">then<\/span><span class=\"p\">(<\/span><span class=\"kd\">function<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">Service Worker Registered<\/span><span class=\"dl\">'<\/span><span class=\"p\">);<\/span> <span class=\"p\">});<\/span>\r\n\t\t\t<span class=\"p\">}<\/span>\r\n\t<span class=\"nt\">&lt;\/script&gt;<\/span>\r\n\u3000\u3000\u3000\u3000<span class=\"c\">&lt;!-- \u3053\u3053\u307e\u3067\u8ffd\u52a0 --&gt;<\/span>\r\n<span class=\"nt\">&lt;\/head&gt;<\/span>\r\n<span class=\"nt\">&lt;body&gt;<\/span>\r\n\t<span class=\"nt\">&lt;h1&gt;<\/span>PWA test pwage<span class=\"nt\">&lt;\/h1&gt;<\/span>\r\n<span class=\"nt\">&lt;\/body&gt;<\/span>\r\n<span class=\"nt\">&lt;\/html&gt;<\/span>\r\n<\/code><\/pre>\n<h5>mypwa\/mypwa\/setting.py\uff08\u6dfb\u52a0\u5230\u5e95\u90e8\uff09<\/h5>\n<pre class=\"post-pre\"><code><span class=\"c1\">#\u7701\u7565\r\n<\/span><span class=\"n\">STATICFILES_DIRS<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span>\r\n    <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\">static<\/span><span class=\"sh\">'<\/span><span class=\"p\">),<\/span>\r\n<span class=\"p\">)<\/span>\r\n<\/code><\/pre>\n<h5>mypwa\/mypwa\/urls.py \u7684\u4e2d\u6587\u91ca\u4e49\u662f\uff1a\u6211\u7684PWA\/\u6211\u7684PWA\/\u7f51\u5740.py\u3002<\/h5>\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\">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=\"c1\">#\u8ffd\u52a0\r\n<\/span><span class=\"kn\">from<\/span> <span class=\"n\">django.views.generic<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">TemplateView<\/span>\r\n<span class=\"kn\">from<\/span> <span class=\"n\">django.views.decorators.cache<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">cache_control<\/span>\r\n\r\n<span class=\"n\">urlpatterns<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span>\r\n    <span class=\"nf\">path<\/span><span class=\"p\">(<\/span><span class=\"sh\">'<\/span><span class=\"s\">admin\/<\/span><span class=\"sh\">'<\/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=\"nf\">path<\/span><span class=\"p\">(<\/span><span class=\"sh\">''<\/span><span class=\"p\">,<\/span> <span class=\"nf\">include<\/span><span class=\"p\">(<\/span><span class=\"sh\">'<\/span><span class=\"s\">pwatest.urls<\/span><span class=\"sh\">'<\/span><span class=\"p\">)),<\/span>\r\n    <span class=\"c1\">#\u8ffd\u52a0\r\n<\/span>    <span class=\"nf\">path<\/span><span class=\"p\">(<\/span><span class=\"sh\">'<\/span><span class=\"s\">sw.js<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"n\">TemplateView<\/span><span class=\"p\">.<\/span><span class=\"nf\">as_view<\/span><span class=\"p\">(<\/span><span class=\"n\">template_name<\/span><span class=\"o\">=<\/span><span class=\"sh\">\"<\/span><span class=\"s\">sw.js<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"n\">content_type<\/span><span class=\"o\">=<\/span><span class=\"sh\">'<\/span><span class=\"s\">application\/javascript<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span> <span class=\"p\">)),<\/span> <span class=\"n\">name<\/span><span class=\"o\">=<\/span><span class=\"sh\">'<\/span><span class=\"s\">sw.js<\/span><span class=\"sh\">'<\/span><span class=\"p\">),<\/span>\r\n<span class=\"p\">]<\/span>\r\n<\/code><\/pre>\n<p>\u9019\u500burls.py\u6a94\u6848\u662f\u6700\u91cd\u8981\u7684\u90e8\u5206\uff0c\u662f\u6211\u5728\u641c\u5c0b\u6642\u5e7e\u4e4e\u627e\u4e0d\u5230\u8cc7\u6599\u4e14\u5361\u4f4f\u7684\u95dc\u9375\u9ede\u3002<\/p>\n<p>\u6211\u4eec\u5c06\u4ece\u8fd9\u91cc\u5f00\u59cb\u521b\u5efaPWA\u6240\u9700\u7684\u6587\u4ef6\u3002<\/p>\n<h5>\u521b\u5efamypwa\/static\/manifest.json\u6587\u4ef6\uff08\u5728static\u6587\u4ef6\u5939\u4e0b\u521b\u5efamanifest.json\u6587\u4ef6\uff09<\/h5>\n<pre class=\"post-pre\"><code><span class=\"p\">{<\/span>\r\n  <span class=\"nl\">\"background_color\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"#1f1f1f\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nl\">\"description\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"pwa test\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nl\">\"display\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"standalone\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nl\">\"theme_color\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"aliceblue\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nl\">\"icons\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[{<\/span>\r\n    <span class=\"nl\">\"src\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"icon-192x192.png\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"sizes\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"192x192\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"type\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"image\/png\"<\/span>\r\n  <span class=\"p\">},{<\/span>\r\n    <span class=\"nl\">\"src\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"icon-512x512.png\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"sizes\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"512x512\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"type\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"image\/png\"<\/span>\r\n  <span class=\"p\">}],<\/span>\r\n  <span class=\"nl\">\"name\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"pwaapp\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nl\">\"short_name\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"pwaapp\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nl\">\"start_url\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"http:\/\/127.0.0.1:8000\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h5>\u8bf7\u6ce8\u610f\uff0c\u5728templates\u6587\u4ef6\u5939\u4e2d\u521b\u5efamypwa\/pwatest\/templates\/sw.js\u6587\u4ef6\uff08\u6ce8\u610f\u4e0d\u662f\u5728static\u6587\u4ef6\u5939\u4e2d\uff09\u3002<\/h5>\n<pre class=\"post-pre\"><code><span class=\"nb\">self<\/span><span class=\"p\">.<\/span><span class=\"nf\">addEventListener<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">fetch<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"kd\">function<\/span><span class=\"p\">(<\/span><span class=\"nx\">event<\/span><span class=\"p\">)<\/span> <span class=\"p\">{});<\/span>\r\n<\/code><\/pre>\n<p>\u5728\u6700\u540e\uff0c\u5c06icon-192&#215;192.png\u548cicon-512&#215;512.png\u6dfb\u52a0\u5230static\u6587\u4ef6\u5939\u4e2d\uff0c PWA\u7684\u90e8\u7f72\u5c31\u5b8c\u6210\u4e86\u3002<\/p>\n<h1>\u786e\u8ba4\u884c\u52a8<\/h1>\n<h4>\u7535\u8111<\/h4>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8ea7913a08637a6d6607\/45-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 (210).png\" \/><\/div>\n<p>\u5982\u679c\u5bfc\u5165\u6210\u529f\uff0c\u5f53\u4f7f\u7528PC\u7248\u7684Chrome\u8fdb\u884c\u8bbf\u95ee\u65f6\uff0cURL\u7684\u53f3\u4fa7\u4f1a\u51fa\u73b0\u4e00\u4e2a\u52a0\u53f7\u6807\u5fd7\uff0c\u901a\u8fc7\u70b9\u51fb\u8be5\u6807\u5fd7\u5373\u53ef\u8fdb\u884c\u5b89\u88c5\u3002\u5b89\u88c5\u540e\uff0c\u5728\u684c\u9762\u4e0a\u4f1a\u51fa\u73b0\u8bbe\u7f6e\u7684\u56fe\u6807\uff0c\u901a\u8fc7\u70b9\u51fb\u8be5\u56fe\u6807\u5373\u53ef\u76f4\u63a5\u8bbf\u95eeWeb\u5e94\u7528\u7a0b\u5e8f\u3002<\/p>\n<h4>\u8c37\u6b4c\u6d4f\u89c8\u5668\u7684\u5b89\u5353\u7248\u672c<\/h4>\n<p>\u60a8\u8fd8\u53ef\u4ee5\u5c06\u5176\u90e8\u7f72\u5230Heroku\u7b49PaaS\u4e0a\u8fdb\u884c\u786e\u8ba4\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u5c06\u4f1a\u51fa\u73b0\u4e00\u4e2a\u5e94\u7528\u7a0b\u5e8f\u6dfb\u52a0\u6a2a\u5e45\u5728\u4e3b\u5c4f\u5e55\u4e0a\uff0c\u901a\u5e38\u5728\u7b2c\u4e8c\u6b21\u8bbf\u95ee\u4e4b\u524d\u4f1a\u6709\u81f3\u5c115\u5206\u949f\u7684\u95f4\u9694\u663e\u793a\u6a2a\u5e45\u3002\u4f46\u5728\u8c03\u8bd5\u65f6\uff0c\u60a8\u53ef\u4ee5\u8bbf\u95eechrome:\/\/flags\/#bypass-app-banner-engagement-checks\u5e76\u542f\u7528\u5b83\uff0c\u8fd9\u6837\u7b2c\u4e00\u6b21\u8bbf\u95ee\u65f6\u6a2a\u5e45\u5c06\u4f1a\u663e\u793a\u51fa\u6765\u3002<\/p>\n<h1>\u7d66\u4f60\u4e00\u500b\u984d\u5916\u7684\u79ae\u7269\u3002<\/h1>\n<p>\u53ea\u6709iOS\u8bbe\u5907\uff01\u65e0\u6cd5\u8c03\u8bd5\uff01\u6211\u60f3\u53ef\u80fd\u4e5f\u6709\u5176\u4ed6\u4eba\u611f\u5230\u56f0\u60d1\u5427\uff08\u6211\u81ea\u5df1\u4e5f\u662f\u5982\u6b64\uff09\u3002<br \/>\n\u5728\u6211\u7684\u73af\u5883\u4e2d\uff0c\u65e0\u6cd5\u5728Nox\u7b49\u6a21\u62df\u5668\u4e0a\u8fdb\u884c\u64cd\u4f5c\u786e\u8ba4\uff0c\u8fd9\u8ba9\u6211\u975e\u5e38\u56f0\u6270\u3002\u7136\u800c\uff0c\u5728Chrome\u6d4f\u89c8\u5668\u7684\u6269\u5c55\u529f\u80fd\u4e2d\uff0c\u6709\u4e00\u4e2a\u540d\u4e3aApkOnline\u7684Android\u6a21\u62df\u5668\u53ef\u4ee5\u5728\u6d4f\u89c8\u5668\u4e2d\u8fd0\u884c\uff0c\u5e76\u4e14\u53ef\u4ee5\u901a\u8fc7\u5b83\u6765\u8fdb\u884cPWA\u7684\u5b89\u88c5\u64cd\u4f5c\u786e\u8ba4\u3002\u771f\u662f\u592a\u4ee4\u4eba\u60ca\u8bb6\u4e86\uff08\u4e0d\u8fc7\u8fd0\u884c\u901f\u5ea6\u975e\u5e38\u6162\uff09\u3002\u5982\u679c\u5b9e\u5728\u6ca1\u6709\u5176\u4ed6\u529e\u6cd5\uff0c\u53ef\u4ee5\u5c1d\u8bd5\u4e00\u4e0b\u3002<\/p>\n<h1>\u6700\u540e<\/h1>\n<p>\u8fd9\u662f\u6211\u4f5c\u4e3a\u521d\u5b66\u8005\u5199\u7684\u521d\u7ea7Qiita\u6587\u7ae0\uff0c\u4e0d\u77e5\u9053\u5bf9\u60a8\u6709\u6ca1\u6709\u5e2e\u52a9\uff0c\u56e0\u4e3a\u6211\u65e0\u6cd5\u8fdb\u884c\u6df1\u5165\u89e3\u91ca\uff0c\u6240\u4ee5\u5e0c\u671b\u6709\u66f4\u591a\u5173\u4e8edjango + pwa\u7684\u65e5\u6587\u6587\u7ae0\u3002<\/p>\n<p>\u6211\u6b63\u5728\u5f00\u53d1\u4e00\u79cd\u4f7f\u7528Stream API\u7684Twitter\u5ba2\u6237\u7aef\uff0c\u5b83\u4e0d\u4f1a\u4ee5\u4ece\u4e0a\u5230\u4e0b\u7684\u65b9\u5f0f\u663e\u793a\u63a8\u6587\u3002\u8bf7\u52a1\u5fc5\u5c1d\u8bd5\u4f7f\u7528\u3002<\/p>\n<p>&nbsp;<\/p>\n<p>\u4ee5\u4e0b\u662f\u672c\u5730\u5316\u7684\u4e2d\u6587\u7ffb\u8bd1\uff08\u4ec5\u63d0\u4f9b\u4e00\u79cd\u9009\u9879\uff09\uff1a<\/p>\n<p>\u53c2\u8003\u9875\u9762\uff1a<br \/>\n\u5c06\u5e94\u7528\u6dfb\u52a0\u5230\u4e3b\u5c4f\u5e55\uff08\u82f1\u6587\uff09- https:\/\/developers.google.com\/web\/fundamentals\/app-install-banners<br \/>\n\u5165\u95e8\u6e10\u8fdb\u5f0f\u7f51\u7edc\u5e94\u7528\u7a0b\u5e8f &#8211; https:\/\/developers.google.com\/web\/fundamentals\/codelabs\/your-first-pwapp<br \/>\n\u4f7f\u75283\u4e2a\u6b65\u9aa4\u5b9e\u73b0PWA\u4e2d\u7684\u201c\u6dfb\u52a0\u5230\u4e3b\u5c4f\u5e55\u201d\u6a2a\u5e45 &#8211; https:\/\/amymd.hatenablog.com\/entry\/2017\/10\/12\/001612<\/p>\n<p>\u6211\u5728\u4e2d\u56fd\u6709\u53bb\u8fc7\u4e00\u4e9b\u5730\u65b9\uff0c\u6211\u4e5f\u53c2\u8003\u4e86Stack Overflow\u3002<\/p>\n<h5>\u591a\u4f59\u4e4b\u7269<\/h5>\n<p>\u6211\u6b63\u5728\u5f00\u53d1\u4e00\u79cd\u4f7f\u7528Stream API\u7684Twitter\u5ba2\u6237\u7aef\uff0c\u5b83\u4e0d\u662f\u5c06\u63a8\u6587\u4ece\u4e0a\u5230\u4e0b\u6d41\u52a8\u7684\u7c7b\u578b\u3002\u8bf7\u52a1\u5fc5\u5c1d\u8bd5\u4f7f\u7528\u3002<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u7b80\u4ecb \u56e0\u4e3aDjango\u548cPython\u662f\u6211\u4f5c\u4e3a\u521d\u5b66\u8005\u521b\u5efa\u7684WEB\u5e94\u7528\u7a0b\u5e8f\uff0c\u5e76\u4e14\u5728\u5f15\u5165PWA\u65f6\uff0c\u867d\u7136\u6709\u4e00\u4e9b\u5173\u4e8ePW [&hellip;]<\/p>\n","protected":false},"author":10,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-49964","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>\u5728\u4f7f\u7528Django\u521b\u5efa\u7684WEB\u5e94\u7528\u4e2d\u5f15\u5165PWA\u7684\u65b9\u6cd5 - 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\/\u5728\u4f7f\u7528django\u521b\u5efa\u7684web\u5e94\u7528\u4e2d\u5f15\u5165pwa\u7684\u65b9\u6cd5\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u5728\u4f7f\u7528Django\u521b\u5efa\u7684WEB\u5e94\u7528\u4e2d\u5f15\u5165PWA\u7684\u65b9\u6cd5\" \/>\n<meta property=\"og:description\" content=\"\u7b80\u4ecb \u56e0\u4e3aDjango\u548cPython\u662f\u6211\u4f5c\u4e3a\u521d\u5b66\u8005\u521b\u5efa\u7684WEB\u5e94\u7528\u7a0b\u5e8f\uff0c\u5e76\u4e14\u5728\u5f15\u5165PWA\u65f6\uff0c\u867d\u7136\u6709\u4e00\u4e9b\u5173\u4e8ePW [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u5728\u4f7f\u7528django\u521b\u5efa\u7684web\u5e94\u7528\u4e2d\u5f15\u5165pwa\u7684\u65b9\u6cd5\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-01-08T00:34:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-28T17:57:41+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8ea7913a08637a6d6607\/45-0.png\" \/>\n<meta name=\"author\" content=\"\u5b87, \u534e\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u5b87, \u534e\" \/>\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\/%e5%9c%a8%e4%bd%bf%e7%94%a8django%e5%88%9b%e5%bb%ba%e7%9a%84web%e5%ba%94%e7%94%a8%e4%b8%ad%e5%bc%95%e5%85%a5pwa%e7%9a%84%e6%96%b9%e6%b3%95\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8%e4%bd%bf%e7%94%a8django%e5%88%9b%e5%bb%ba%e7%9a%84web%e5%ba%94%e7%94%a8%e4%b8%ad%e5%bc%95%e5%85%a5pwa%e7%9a%84%e6%96%b9%e6%b3%95\/\",\"name\":\"\u5728\u4f7f\u7528Django\u521b\u5efa\u7684WEB\u5e94\u7528\u4e2d\u5f15\u5165PWA\u7684\u65b9\u6cd5 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-01-08T00:34:00+00:00\",\"dateModified\":\"2024-04-28T17:57:41+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8%e4%bd%bf%e7%94%a8django%e5%88%9b%e5%bb%ba%e7%9a%84web%e5%ba%94%e7%94%a8%e4%b8%ad%e5%bc%95%e5%85%a5pwa%e7%9a%84%e6%96%b9%e6%b3%95\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8%e4%bd%bf%e7%94%a8django%e5%88%9b%e5%bb%ba%e7%9a%84web%e5%ba%94%e7%94%a8%e4%b8%ad%e5%bc%95%e5%85%a5pwa%e7%9a%84%e6%96%b9%e6%b3%95\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8%e4%bd%bf%e7%94%a8django%e5%88%9b%e5%bb%ba%e7%9a%84web%e5%ba%94%e7%94%a8%e4%b8%ad%e5%bc%95%e5%85%a5pwa%e7%9a%84%e6%96%b9%e6%b3%95\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u5728\u4f7f\u7528Django\u521b\u5efa\u7684WEB\u5e94\u7528\u4e2d\u5f15\u5165PWA\u7684\u65b9\u6cd5\"}]},{\"@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\/513018e4e121d3add1b7c5de8be21458\",\"name\":\"\u5b87, \u534e\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g\",\"caption\":\"\u5b87, \u534e\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yuhua\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8%e4%bd%bf%e7%94%a8django%e5%88%9b%e5%bb%ba%e7%9a%84web%e5%ba%94%e7%94%a8%e4%b8%ad%e5%bc%95%e5%85%a5pwa%e7%9a%84%e6%96%b9%e6%b3%95\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u5728\u4f7f\u7528Django\u521b\u5efa\u7684WEB\u5e94\u7528\u4e2d\u5f15\u5165PWA\u7684\u65b9\u6cd5 - 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\/\u5728\u4f7f\u7528django\u521b\u5efa\u7684web\u5e94\u7528\u4e2d\u5f15\u5165pwa\u7684\u65b9\u6cd5\/","og_locale":"zh_CN","og_type":"article","og_title":"\u5728\u4f7f\u7528Django\u521b\u5efa\u7684WEB\u5e94\u7528\u4e2d\u5f15\u5165PWA\u7684\u65b9\u6cd5","og_description":"\u7b80\u4ecb \u56e0\u4e3aDjango\u548cPython\u662f\u6211\u4f5c\u4e3a\u521d\u5b66\u8005\u521b\u5efa\u7684WEB\u5e94\u7528\u7a0b\u5e8f\uff0c\u5e76\u4e14\u5728\u5f15\u5165PWA\u65f6\uff0c\u867d\u7136\u6709\u4e00\u4e9b\u5173\u4e8ePW [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u5728\u4f7f\u7528django\u521b\u5efa\u7684web\u5e94\u7528\u4e2d\u5f15\u5165pwa\u7684\u65b9\u6cd5\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-01-08T00:34:00+00:00","article_modified_time":"2024-04-28T17:57:41+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8ea7913a08637a6d6607\/45-0.png"}],"author":"\u5b87, \u534e","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u5b87, \u534e","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"3 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8%e4%bd%bf%e7%94%a8django%e5%88%9b%e5%bb%ba%e7%9a%84web%e5%ba%94%e7%94%a8%e4%b8%ad%e5%bc%95%e5%85%a5pwa%e7%9a%84%e6%96%b9%e6%b3%95\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8%e4%bd%bf%e7%94%a8django%e5%88%9b%e5%bb%ba%e7%9a%84web%e5%ba%94%e7%94%a8%e4%b8%ad%e5%bc%95%e5%85%a5pwa%e7%9a%84%e6%96%b9%e6%b3%95\/","name":"\u5728\u4f7f\u7528Django\u521b\u5efa\u7684WEB\u5e94\u7528\u4e2d\u5f15\u5165PWA\u7684\u65b9\u6cd5 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-01-08T00:34:00+00:00","dateModified":"2024-04-28T17:57:41+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8%e4%bd%bf%e7%94%a8django%e5%88%9b%e5%bb%ba%e7%9a%84web%e5%ba%94%e7%94%a8%e4%b8%ad%e5%bc%95%e5%85%a5pwa%e7%9a%84%e6%96%b9%e6%b3%95\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8%e4%bd%bf%e7%94%a8django%e5%88%9b%e5%bb%ba%e7%9a%84web%e5%ba%94%e7%94%a8%e4%b8%ad%e5%bc%95%e5%85%a5pwa%e7%9a%84%e6%96%b9%e6%b3%95\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8%e4%bd%bf%e7%94%a8django%e5%88%9b%e5%bb%ba%e7%9a%84web%e5%ba%94%e7%94%a8%e4%b8%ad%e5%bc%95%e5%85%a5pwa%e7%9a%84%e6%96%b9%e6%b3%95\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u5728\u4f7f\u7528Django\u521b\u5efa\u7684WEB\u5e94\u7528\u4e2d\u5f15\u5165PWA\u7684\u65b9\u6cd5"}]},{"@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\/513018e4e121d3add1b7c5de8be21458","name":"\u5b87, \u534e","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g","caption":"\u5b87, \u534e"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yuhua\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%9c%a8%e4%bd%bf%e7%94%a8django%e5%88%9b%e5%bb%ba%e7%9a%84web%e5%ba%94%e7%94%a8%e4%b8%ad%e5%bc%95%e5%85%a5pwa%e7%9a%84%e6%96%b9%e6%b3%95\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/49964","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\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=49964"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/49964\/revisions"}],"predecessor-version":[{"id":73328,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/49964\/revisions\/73328"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=49964"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=49964"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=49964"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}