{"id":49272,"date":"2023-05-26T02:23:22","date_gmt":"2023-11-07T00:03:22","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/django%e5%85%a5%e9%97%a8-%e4%b8%80%e4%b8%aa%e7%ae%80%e5%8d%95%e7%9a%84%e8%ae%bf%e9%97%ae%e8%ae%b0%e5%bd%95%e5%b1%95%e7%a4%ba%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f\/"},"modified":"2024-04-30T05:58:26","modified_gmt":"2024-04-29T21:58:26","slug":"django%e5%85%a5%e9%97%a8-%e4%b8%80%e4%b8%aa%e7%ae%80%e5%8d%95%e7%9a%84%e8%ae%bf%e9%97%ae%e8%ae%b0%e5%bd%95%e5%b1%95%e7%a4%ba%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/django%e5%85%a5%e9%97%a8-%e4%b8%80%e4%b8%aa%e7%ae%80%e5%8d%95%e7%9a%84%e8%ae%bf%e9%97%ae%e8%ae%b0%e5%bd%95%e5%b1%95%e7%a4%ba%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f\/","title":{"rendered":"Django\u5165\u95e8 &#8211; \u4e00\u4e2a\u7b80\u5355\u7684\u8bbf\u95ee\u8bb0\u5f55\u5c55\u793a\u5e94\u7528\u7a0b\u5e8f"},"content":{"rendered":"<p>\u306f\u3058\u3081\u306b<\/p>\n<p>TL;DR<br \/>\n\u8a18\u4e8b\u306e\u5185\u5bb9\u306b\u3064\u3044\u3066<br \/>\n\u74b0\u5883<br \/>\n\u53c2\u8003\u30da\u30fc\u30b8<br \/>\n\u4f5c\u6210\u3057\u305f\u30b3\u30fc\u30c9<\/p>\n<p>Django\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<br \/>\n\u4eca\u56de\u306e\u30a2\u30d7\u30ea\u3092\u521d\u671f\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7<br \/>\n\u7c21\u5358\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u8ffd\u52a0\u3057\u3066\u52d5\u4f5c\u78ba\u8a8d<br \/>\n\u4f5c\u308a\u8fbc\u307f<br \/>\n\u52d5\u4f5c\u78ba\u8a8d<br \/>\n\u307e\u3068\u3081<br \/>\n2023\/05\/14 17:38\u8ffd\u8a18<\/p>\n<h2>\u9996\u5148<\/h2>\n<h3>\u6897\u6982\uff1b\u603b\u4e4b<\/h3>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Django\u306f\u7c21\u5358\u306a\u30a6\u30a7\u30d6\u30a2\u30d7\u30ea\u4f5c\u308b\u306e\u306b\u306f\u4fbf\u5229\u3067\u697d\u3002<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">Python\u89e6\u3063\u305f\u3053\u3068\u306a\u304f\u3066\u3082\u3042\u308b\u7a0b\u5ea6\u66f8\u3051\u308b\u3002<\/ul>\n<h3>\u5173\u4e8e\u8fd9\u7bc7\u6587\u7ae0\u7684\u5185\u5bb9<\/h3>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Java\u30a8\u30f3\u30b8\u30cb\u30a2\u304cDjango\u306b\u5165\u9580\u3057\u3066\u307f\u305f\u5185\u5bb9<\/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\">Django\u306e\u5165\u9580\u306b\u3042\u305f\u308a\u3001\u4ee5\u4e0b\u306e\u69d8\u306a\u306e\u7c21\u5358\u306a\u30a2\u30d7\u30ea\u3092\u4f5c\u6210<\/ul>\n<\/li>\n<\/ul>\n<p>\u30da\u30fc\u30b8\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u305f\u3073\u3001\u30a2\u30af\u30bb\u30b9\u5143IP\u3001\u30a2\u30af\u30bb\u30b9\u6642\u9593\u3092\u30da\u30fc\u30b8\u306b\u8868\u793a\u3059\u308b<br \/>\n\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u306fPostgreSQL\u3092\u4f7f\u7528\u3059\u308b<\/p>\n<p>Python\u6b741\u65e5(\u30bd\u30fc\u30b9\u8aad\u3093\u3060\u3060\u3051)\u3067\u306e\u30c1\u30e3\u30ec\u30f3\u30b8\u306a\u306e\u3067\u3001\u6587\u6cd5\u30fb\u8a18\u6cd5\u7684\u306a\u3068\u3053\u308d\u3067\u304a\u898b\u82e6\u3057\u3044\u3068\u3053\u308d\u304c\u3042\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u304c\u3001\u304a\u8a31\u3057\u304f\u3060\u3055\u3044(\u304a\u3059\u3059\u3081\u30da\u30fc\u30b8\u3068\u304b\u3042\u308c\u3070\u6559\u3048\u3066\u3044\u305f\u3060\u3051\u308b\u3068\u5e78\u3044\u3067\u3059\u3002)<\/p>\n<p>\u30bd\u30fc\u30b9\u3092\u8aad\u3093\u3060\u6642\u306e\u8a18\u4e8b(https:\/\/qiita.com\/ramune2371\/items\/e7e8044f88124a545e95)<\/p>\n<h3>\u73af\u5883<\/h3>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u7aef\u672b\uff1aMacBookAir M1<\/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\">Python\uff1a3.10.6<\/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\">pip\uff1a23.1.1<\/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\">psql:psql (PostgreSQL) 14.8 (Homebrew)<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">Docker:Docker Desktop 4.7.1 (77678)<\/ul>\n<h3>\u8bf7\u53c2\u8003\u4ee5\u4e0b\u7f51\u9875<\/h3>\n<p>&nbsp;<\/p>\n<h3>\u7f16\u5199\u7684\u4ee3\u7801\u3002<\/h3>\n<p>&nbsp;<\/p>\n<h2>Django\u7684\u5b89\u88c5<\/h2>\n<ul class=\"post-ul\">pip\u3092\u4f7f\u7528\u3057\u3066\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/ul>\n<pre class=\"post-pre\"><code><span class=\"gp\">$<\/span> pip <span class=\"nb\">install <\/span>Django\r\n<\/code><\/pre>\n<h2>\u8fdb\u884c\u6b64\u5e94\u7528\u7a0b\u5e8f\u7684\u521d\u59cb\u8bbe\u7f6e<\/h2>\n<p>\u901a\u8fc7\u4f7f\u7528 djang-admin startproject\uff0c\u53ef\u4ee5\u8f7b\u677e\u5730\u521b\u5efa Django \u7684\u521d\u59cb\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"gp\">$<\/span> django-admin startproject access_history \r\n<span class=\"gp\">$<\/span> <span class=\"nb\">ls<\/span> <span class=\"nt\">-alh<\/span>\r\n<span class=\"go\">total 24\r\ndrwxr-xr-x  21 username staff   672B  5 13 23:21 .\r\ndrwxr-xr-x+ 78 username staff   2.4K  5 13 23:22 ..\r\ndrwxr-xr-x   4 username staff   128B  5 13 23:21 access_history\r\n<\/span><span class=\"gp\">$<\/span> <span class=\"nb\">cd <\/span>access_history \r\n<span class=\"gp\">$<\/span> <span class=\"nb\">ls<\/span> <span class=\"nt\">-alh<\/span>\r\n<span class=\"go\">total 8\r\ndrwxr-xr-x   5 username staff   160B  5 13 23:24 .\r\ndrwxr-xr-x  21 username staff   672B  5 13 23:21 ..\r\ndrwxr-xr-x   8 username staff   256B  5 13 23:24 access_history\r\n-rwxr-xr-x   1 username staff   670B  5 13 23:21 manage.py\r\n<\/span><\/code><\/pre>\n<p>\u5f53\u67e5\u770b\u5df2\u521b\u5efa\u7684\u6587\u4ef6\u5939\u65f6\uff0c\u53d1\u73b0\u91cc\u9762\u6709\u4e00\u4e2a\u540d\u4e3amanage.py\u7684\u6587\u4ef6\uff0c\u4f3c\u4e4e\u7528\u4e8e\u542f\u52a8\u670d\u52a1\u5668\u7b49\u64cd\u4f5c\u3002<br \/>\n\u4e8e\u662f\u6211\u5c1d\u8bd5\u4e86\u4e00\u4e0b\u542f\u52a8\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"gp\">$<\/span> python manage.py runserver\r\n<span class=\"go\">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 18 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\nMay 13, 2023 - 14:27:43\r\nDjango version 4.2.1, using settings 'access_history.settings'\r\nStarting development server at http:\/\/127.0.0.1:8000\/\r\nQuit the server with CONTROL-C.\r\n<\/span><\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"go\">[13\/May\/2023 14:27:49] \"GET \/ HTTP\/1.1\" 200 10731\r\n[13\/May\/2023 14:27:50] \"GET \/static\/admin\/css\/fonts.css HTTP\/1.1\" 404 1816\r\n<\/span><\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8a4a913a08637a6c91bf\/21-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2023-05-13 23.27.54.png\" \/><\/div>\n<h2>\u7b80\u5355\u5730\u6dfb\u52a0\u6587\u4ef6\u5e76\u8fdb\u884c\u64cd\u4f5c\u786e\u8ba4\u3002<\/h2>\n<p>\u8bf7\u5c06\u4ee5\u4e0b\u6587\u4ef6\u6dfb\u52a0\u5230access_history\/access_history\u6587\u4ef6\u5939\u4e2d\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"kn\">from<\/span> <span class=\"n\">django.http<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">HttpResponse<\/span>\r\n\r\n<span class=\"k\">def<\/span> <span class=\"nf\">hello<\/span><span class=\"p\">(<\/span><span class=\"n\">request<\/span><span class=\"p\">):<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"nc\">HttpResponse<\/span><span class=\"p\">(<\/span><span class=\"sh\">\"<\/span><span class=\"s\">Hello World<\/span><span class=\"sh\">\"<\/span><span class=\"p\">)<\/span>\r\n<\/code><\/pre>\n<p>\u4fee\u6539 access_history\/access_history\/urls.py \u6587\u4ef6\u3002<\/p>\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>\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=\"p\">]<\/span>\r\n<\/code><\/pre>\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>\r\n<span class=\"kn\">from<\/span> <span class=\"n\">.<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">hello<\/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\">hello\/<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span> <span class=\"n\">hello<\/span><span class=\"p\">.<\/span><span class=\"n\">hello<\/span><span class=\"p\">,<\/span> <span class=\"n\">name<\/span><span class=\"o\">=<\/span><span class=\"sh\">'<\/span><span class=\"s\">hello<\/span><span class=\"sh\">'<\/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=\"p\">]<\/span>\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8a4a913a08637a6c91bf\/28-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2023-05-13 23.38.52.png\" \/><\/div>\n<p>\u6211\u6210\u529f\u8bbf\u95ee(&amp;\u5411\u5168\u4e16\u754c\u95ee\u597d)\u4e86\u3002<\/p>\n<h2>\u7cbe\u5fc3\u5236\u4f5c<\/h2>\n<p>\u9996\u5148\uff0c\u6211\u4eec\u9700\u8981\u5728Django\u9879\u76ee\u4e2d\u6dfb\u52a0\u529f\u80fd\uff0c\u4ee5\u4fbf\u4e8e\u521b\u5efa\u8bbf\u95ee\u5386\u53f2\u8bb0\u5f55\u7684\u5c55\u793a\u9875\u9762\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"gp\">$<\/span> python manage.py startapp <span class=\"nb\">history<\/span> \r\n<\/code><\/pre>\n<p>\u6839\u636e\u4ee5\u4e0b\u65b9\u5f0f\u5bf9\u5df2\u521b\u5efa\u7684\u6587\u4ef6\u8fdb\u884c\u4fee\u6b63\uff08\u56e0\u7bc7\u5e45\u8f83\u957f\uff0c\u8bf7\u6298\u53e0\u67e5\u770b\u2192\u6309\u987a\u5e8f\u8fdb\u884c\u66f4\u6539\u6216\u6dfb\u52a0\u6587\u4ef6\u3002\u6587\u4ef6\u540d\uff1a\u4ee5\uff08\u8ffd\u52a0\/\u66f4\u6539\uff09\u7684\u65b9\u5f0f\u5199\u5165\uff09\u3002<\/p>\n<details>\u4fee\u6b63\u5185\u5bb9history\/models.py(\u66f4\u6539)<br \/>\nfrom django.db import models<br \/>\nfrom django.core.exceptions import ValidationError<br \/>\nimport re<\/p>\n<p># IP\u5730\u5740\u7684\u9a8c\u8bc1<br \/>\npattern = &#8220;([0-9]{3}\\.){3}\\.[0-9]{3}&#8221;<br \/>\nmatcher = re.compile(pattern)<\/p>\n<p>def validate_ip(value):<br \/>\nif not matcher.match(value):<br \/>\nraise ValidationError(<br \/>\n_(&#8220;%{value} \u4e0d\u662f\u6709\u6548\u7684IP\u5730\u5740\uff01&#8221;),<br \/>\nparams={&#8220;value&#8221;,value}<br \/>\n)<\/p>\n<p>class AccessHistory(models.Model):<br \/>\n# \u6570\u636e\u8bbe\u7f6e<br \/>\nip=models.CharField(&#8220;IP&#8221;,max_length=200,validators=[validate_ip])<br \/>\naccess_time=models.DateTimeField(&#8220;\u8bbf\u95ee\u65f6\u95f4&#8221;)<\/p>\n<p># \u91cd\u5199 __str__ \u65b9\u6cd5<br \/>\n# \u5728\u9875\u9762\u663e\u793a\u65f6\u4f7f\u7528<br \/>\ndef __str__(self) -&gt; str:<br \/>\nreturn &#8220;IP\u5730\u5740\uff1a%s \/ \u8bbf\u95ee\u65f6\u95f4\uff1a%s&#8221; % (self.ip,self.access_time)<\/p>\n<p>history\/list_page.py(\u6dfb\u52a0)<br \/>\nfrom django.http import HttpResponse<br \/>\nfrom django.utils import timezone as tz<br \/>\nfrom history.models import AccessHistory<\/p>\n<p>class ListPage:<br \/>\ndef list(request):<br \/>\n# \u4ece\u8bf7\u6c42\u4e2d\u83b7\u53d6IP\u4fe1\u606f<br \/>\nip = request.META.get(&#8216;REMOTE_ADDR&#8217;)<\/p>\n<p># \u5b58\u50a8\u5230\u8868\u4e2d<br \/>\nAccessHistory(ip=ip,access_time=tz.datetime.now()).save()<\/p>\n<p># \u6784\u5efa\u54cd\u5e94<br \/>\nquery_set = AccessHistory.objects.all()<br \/>\nresponse_str=&#8221;<br \/>\nfor qs in query_set:<br \/>\nresponse_str = response_str + str(qs) + &#8221;<br \/>\n&#8221;<br \/>\n# \u8fd4\u56de\u54cd\u5e94<br \/>\nreturn HttpResponse(response_str)<\/p>\n<p>history\/urls.py(\u66f4\u6539)<br \/>\nfrom django.urls import path<br \/>\nfrom history.list_page import ListPage<\/p>\n<p>urlpatterns = [<br \/>\n# \u6ce8\u518c ListPage.list\uff0c\u4e0d\u5728 history \u5b50\u76ee\u5f55\u4e0b\u9700\u8981\u6307\u5b9a\u8def\u5f84<br \/>\npath(&#8221;, ListPage.list , name=&#8221;list&#8221;),<br \/>\n]<\/p>\n<p>access_history\/urls.py(\u66f4\u6539)<br \/>\nfrom django.contrib import admin<br \/>\nfrom django.urls import path,include<br \/>\nfrom . import hello<\/p>\n<p>urlpatterns = [<br \/>\npath(&#8216;hello\/&#8217;, hello.hello, name=&#8217;hello&#8217;),<br \/>\n# \u2193 \u6dfb\u52a0\u7684\u884c\u3002\u5728\u8fd9\u91cc\u6307\u5b9a\u8def\u5f84\uff0c\u6240\u4ee5\u5728 history\/urls.py \u4e2d\u4e0d\u6307\u5b9a\u8def\u5f84\u3002<br \/>\npath(&#8216;list\/&#8217;, include(&#8220;history.urls&#8221;)),<br \/>\npath(&#8216;admin\/&#8217;, admin.site.urls),<br \/>\n]<\/p>\n<p>\u4ee5\u4e0a\u662f\u529f\u80fd\u7684\u521b\u5efa\u3002<br \/>\n\u63a5\u4e0b\u6765\u5728 access_history\/settings.py \u4e2d\u6ce8\u518c\u529f\u80fd\uff0c\u5e76\u4e0e\u6570\u636e\u5e93\u5173\u8054<\/p>\n<p>access_history\/settings.py<br \/>\nINSTALLED_APPS = [<br \/>\n#\u2193 \u6dfb\u52a0\u7684\u884c\u3002history.apps.HistoryConfig \u662f\u5728 Django \u4e2d\u6ce8\u518c\u529f\u80fd\u6240\u4f7f\u7528\u7684\u7c7b<br \/>\n&#8216;history.apps.HistoryConfig&#8217;,<br \/>\n&#8216;django.contrib.admin&#8217;,<br \/>\n&#8216;django.contrib.auth&#8217;,<br \/>\n&#8216;django.contrib.contenttypes&#8217;,<br \/>\n&#8216;django.contrib.sessions&#8217;,<br \/>\n&#8216;django.contrib.messages&#8217;,<br \/>\n&#8216;django.contrib.staticfiles&#8217;,<br \/>\n]<\/p>\n<\/details>\n<p>\u5728Django\u4e2d\uff0c\u53ef\u4ee5\u5c06Model\u4e0e\u6570\u636e\u5e93\u5173\u8054\u8d77\u6765\u3002<br \/>\n\u5c31\u6211\u4eec\u8fd9\u6b21\u521b\u5efa\u7684AccessHistory\u800c\u8a00\uff0c\u5b83\u7684\u5b57\u6bb5ip\u548caccess_time\u53ef\u4ee5\u4e0e\u6570\u636e\u5e93\u4e00\u8d77\u5173\u8054\uff0c\u5e76\u9644\u5e26\u7c7b\u578b\u4fe1\u606f\u3002<br \/>\n\u7a0d\u540e\u4f1a\u63d0\u5230\uff0c\u6839\u636e\u8fd9\u4e2aModel\uff0c\u53ef\u4ee5\u81ea\u52a8\u521b\u5efa\u8868\u683c\u3002<\/p>\n<p>\u7531\u4e8e\u8fd9\u6b21\u60f3\u5728\u6570\u636e\u5e93\u4e2d\u4f7f\u7528PostgreSQL\uff0c\u9700\u8981\u5b89\u88c5\u989d\u5916\u7684\u5e93\u5e76\u8fdb\u884c\u4e00\u4e9b\u6587\u4ef6\u4fee\u6b63\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"o\">$<\/span> <span class=\"n\">pip<\/span> <span class=\"n\">install<\/span> <span class=\"n\">psycopg<\/span>\r\n<\/code><\/pre>\n<p>\u4e3a\u4e86\u5c1d\u8bd5\uff0c\u53ef\u4ee5\u4f7f\u7528Docker\u8bbe\u7f6e\u5e76\u542f\u52a8PostgreSQL\uff0c\u5e76\u5c06\u5176\u8bbe\u4e3a\u53ef\u4ee5\u8f7b\u677e\u4e22\u5f03\u7684\u72b6\u6001\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"gp\">$<\/span> docker run <span class=\"nt\">-d<\/span> <span class=\"nt\">--name<\/span> postgres <span class=\"nt\">-e<\/span> <span class=\"nv\">POSTGRES_PASSWORD<\/span><span class=\"o\">=<\/span><span class=\"s1\">'p@ssw0rd'<\/span> <span class=\"nt\">-p<\/span> 5432:5432  postgres:14.7-bullseye\r\n<span class=\"gp\">$<\/span> psql <span class=\"nt\">-h<\/span> localhost <span class=\"nt\">-U<\/span> postgres <span class=\"c\"># \u4eca\u56de\u4f7f\u7528\u3059\u308b\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u4f5c\u6210\u3059\u308b\u305f\u3081\u3001\u4e00\u5ea6\u63a5\u7d9a<\/span>\r\n<span class=\"gp\">Password for user postgres: &lt;p@ssw0rd\u3092\u5165\u529b\u3057Enter&gt;<\/span>\r\n<span class=\"go\">psql (11.20, server 11.3 (Debian 11.3-1.pgdg90+1))\r\nType \"help\" for help.\r\n\r\n<\/span><span class=\"gp\">postgres=#<\/span> create database access_history<span class=\"p\">;<\/span>\r\n<span class=\"go\">CREATE DATABASE\r\n<\/span><span class=\"gp\">postgres=#<\/span> <span class=\"se\">\\q<\/span>\r\n<\/code><\/pre>\n<p>\u4fee\u6539Django\u7684\u914d\u7f6e\u6587\u4ef6\uff0c\u4ee5\u4fbf\u53ef\u4ee5\u8fde\u63a5\u5230PostgreSQL\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"n\">DATABASES<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"sh\">'<\/span><span class=\"s\">default<\/span><span class=\"sh\">'<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"sh\">'<\/span><span class=\"s\">ENGINE<\/span><span class=\"sh\">'<\/span><span class=\"p\">:<\/span> <span class=\"sh\">'<\/span><span class=\"s\">django.db.backends.sqlite3<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"sh\">'<\/span><span class=\"s\">NAME<\/span><span class=\"sh\">'<\/span><span class=\"p\">:<\/span> <span class=\"n\">BASE_DIR<\/span> <span class=\"o\">\/<\/span> <span class=\"sh\">'<\/span><span class=\"s\">db.sqlite3<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"n\">DATABASES<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"sh\">'<\/span><span class=\"s\">default<\/span><span class=\"sh\">'<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"sh\">'<\/span><span class=\"s\">ENGINE<\/span><span class=\"sh\">'<\/span><span class=\"p\">:<\/span> <span class=\"sh\">'<\/span><span class=\"s\">django.db.backends.postgresql<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"sh\">'<\/span><span class=\"s\">NAME<\/span><span class=\"sh\">'<\/span><span class=\"p\">:<\/span> <span class=\"sh\">'<\/span><span class=\"s\">access_history<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"sh\">'<\/span><span class=\"s\">HOST<\/span><span class=\"sh\">'<\/span><span class=\"p\">:<\/span> <span class=\"sh\">'<\/span><span class=\"s\">localhost<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"sh\">'<\/span><span class=\"s\">USER<\/span><span class=\"sh\">'<\/span><span class=\"p\">:<\/span> <span class=\"sh\">'<\/span><span class=\"s\">postgres<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"sh\">'<\/span><span class=\"s\">PASSWORD<\/span><span class=\"sh\">'<\/span><span class=\"p\">:<\/span> <span class=\"sh\">'<\/span><span class=\"s\">p@ssw0rd<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"sh\">'<\/span><span class=\"s\">PORT<\/span><span class=\"sh\">'<\/span><span class=\"p\">:<\/span> <span class=\"sh\">'<\/span><span class=\"s\">5432<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u4f7f\u7528manage.py\u6765\u8fdb\u884c\u6570\u636e\u5e93\u8bbe\u7f6e\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"gp\">$<\/span> python manage.py makemigrations <span class=\"nb\">history<\/span> <span class=\"c\"># \u3053\u3044\u3064\u3067\u3001history\/models.py\u3092\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3068\u7d10\u4ed8\u3051<\/span>\r\n<span class=\"gp\">$<\/span> python manage.py migrate <span class=\"c\"># \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u521d\u671f\u5316(\u30c6\u30fc\u30d6\u30eb\u4f5c\u6210\u7b49)\u3002\u30a8\u30e9\u30fc\u304c\u51fa\u306a\u3051\u308c\u3070OK<\/span>\r\n<\/code><\/pre>\n<p>\u770b\u8d77\u6765\uff0c\u636e\u8bf4\u4ece models.py \u94fe\u63a5\u7684\u8868\u540d\u5c06\u4f1a\u662f&lt;\u521b\u5efaapp\u65f6\u7684\u540d\u79f0&gt;_&lt;\u5c06\u7c7b\u540d\u5c0f\u5199&gt;\u3002\u8fd9\u6b21\u7684\u8bdd\uff0c\u4f1a\u662f history_accesshistory\uff08\u6709\u70b9\u7b28\u62d9\uff0c\u4f46\u8fd8\u597d\u5427\u2026\u2026\u5c31\u8fd9\u6837\u5427\u2026\u2026\uff09<\/p>\n<h2>\u786e\u8ba4\u52a8\u4f5c (Confirm action)<\/h2>\n<pre class=\"post-pre\"><code><span class=\"gp\">$<\/span> paython manage.py runserver <span class=\"c\"># \u8d77\u52d5<\/span>\r\n<span class=\"go\">Watching for file changes with StatReloader\r\nPerforming system checks...\r\n\r\nSystem check identified no issues (0 silenced).\r\nMay 14, 2023 - 14:09:55\r\nDjango version 4.2.1, using settings 'access_history.settings'\r\nStarting development server at http:\/\/127.0.0.1:8000\/\r\nQuit the server with CONTROL-C.\r\n<\/span><\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8a4a913a08637a6c91bf\/48-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2023-05-14 14.11.02.png\" \/><\/div>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8a4a913a08637a6c91bf\/49-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2023-05-14 14.11.24.png\" \/><\/div>\n<p>\u6211\u9019\u6b21\u60f3\u8981\u5f9eDjango\u7684\u5f8c\u7aef\u89c0\u9ede\u4f86\u5b78\u7fd2\uff0c\u6240\u4ee5\u524d\u7aef\u7684\u958b\u767c\u6211\u6253\u7b97\u8996\u60c5\u6cc1\u518d\u505a\uff08\u5927\u6982\uff09\u3002\u7d50\u679c\u505a\u4e86\u4e00\u9ede\u9ede\uff0c\u53ef\u4ee5\u53c3\u8003\u9801\u9762\u5e95\u90e8\u7684\u9644\u8a3b\u3002<\/p>\n<h2>\u603b\u7ed3<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Django\u3001\u3059\u3054\u304f\u4fbf\u5229<\/ul>\n<\/li>\n<\/ul>\n<p>sql\u66f8\u304b\u305a\u306bPostgreSQL\u304c\u4f7f\u3048\u3066\u3057\u307e\u3063\u305f\u2026<br \/>\n\u6a5f\u80fd\u306e\u62e1\u5f35\u304c\u7c21\u5358<br \/>\n\u4ed6\u306b\u3082\u305f\u304f\u3055\u3093\u4fbf\u5229\u6a5f\u80fd\u304c\u3042\u308b\u3068\u3044\u3046\u306e\u3060\u304b\u3089\u9a5a\u304d<\/p>\n<p>Python\u304c\u601d\u3063\u305f\u3088\u308a\u66f8\u304d\u3084\u3059\u304b\u3063\u305f<\/p>\n<h2>2023\u5e7405\u670814\u65e517\u65f638\u5206\u8865\u5145\u8bf4\u660e<\/h2>\n<p>\u7531\u4e8e\u6211\u975e\u5e38\u5728\u610f\uff0c\u6240\u4ee5\u6211\u6dfb\u52a0\u4e86\u4ee5\u4e0b\u66f4\u6539\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\u3092Django\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u6a5f\u80fd\uff0bBootstrap\u3092\u4f7f\u7528\u3057\u3066\u3082\u3046\u5c11\u3057\u307e\u3068\u3082\u306b<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">Django\u3067\u306f\u3001DB\u306b\u767b\u9332\u3059\u308b\u969b\u306bUTC\u306b\u5909\u63db\u3055\u308c\u308b\u305f\u3081\u3001DB\u304b\u3089\u53d6\u5f97\u3057\u305f\u5024\u3092\u30d5\u30ed\u30f3\u30c8\u3067\u4f7f\u7528\u3059\u308b\u524d\u306bTZ\u306b\u5408\u308f\u305b\u305f\u3082\u306e\u306b\u5909\u66f4\u3059\u308b\u3088\u3046\u4fee\u6b63<\/ul>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8a4a913a08637a6c91bf\/56-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2023-05-14 17.33.26.png\" \/><\/div>\n<p>\u8bf7\u53c2\u8003\u4ee5\u4e0b\u63d0\u4ea4\u6765\u4fee\u6b63\u5185\u5bb9\uff1ahttps:\/\/github.com\/ramune2371\/access_history\/commit\/2b89566d98e71dc5bd883b108420cf86696f1538#diff-c62fe861387b8d587fd54e896c8cf2069cb178d8f15fa78429a8a6df22dea1c6<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u306f\u3058\u3081\u306b TL;DR \u8a18\u4e8b\u306e\u5185\u5bb9\u306b\u3064\u3044\u3066 \u74b0\u5883 \u53c2\u8003\u30da\u30fc\u30b8 \u4f5c\u6210\u3057\u305f\u30b3\u30fc\u30c9 Django\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb \u4eca\u56de\u306e [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-49272","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>Django\u5165\u95e8 - \u4e00\u4e2a\u7b80\u5355\u7684\u8bbf\u95ee\u8bb0\u5f55\u5c55\u793a\u5e94\u7528\u7a0b\u5e8f - 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\/django\u5165\u95e8-\u4e00\u4e2a\u7b80\u5355\u7684\u8bbf\u95ee\u8bb0\u5f55\u5c55\u793a\u5e94\u7528\u7a0b\u5e8f\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Django\u5165\u95e8 - \u4e00\u4e2a\u7b80\u5355\u7684\u8bbf\u95ee\u8bb0\u5f55\u5c55\u793a\u5e94\u7528\u7a0b\u5e8f\" \/>\n<meta property=\"og:description\" content=\"\u306f\u3058\u3081\u306b TL;DR \u8a18\u4e8b\u306e\u5185\u5bb9\u306b\u3064\u3044\u3066 \u74b0\u5883 \u53c2\u8003\u30da\u30fc\u30b8 \u4f5c\u6210\u3057\u305f\u30b3\u30fc\u30c9 Django\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb \u4eca\u56de\u306e [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/django\u5165\u95e8-\u4e00\u4e2a\u7b80\u5355\u7684\u8bbf\u95ee\u8bb0\u5f55\u5c55\u793a\u5e94\u7528\u7a0b\u5e8f\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-11-07T00:03:22+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-29T21:58:26+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8a4a913a08637a6c91bf\/21-0.png\" \/>\n<meta name=\"author\" content=\"\u79d1, \u9896\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u79d1, \u9896\" \/>\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\/django%e5%85%a5%e9%97%a8-%e4%b8%80%e4%b8%aa%e7%ae%80%e5%8d%95%e7%9a%84%e8%ae%bf%e9%97%ae%e8%ae%b0%e5%bd%95%e5%b1%95%e7%a4%ba%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/django%e5%85%a5%e9%97%a8-%e4%b8%80%e4%b8%aa%e7%ae%80%e5%8d%95%e7%9a%84%e8%ae%bf%e9%97%ae%e8%ae%b0%e5%bd%95%e5%b1%95%e7%a4%ba%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f\/\",\"name\":\"Django\u5165\u95e8 - \u4e00\u4e2a\u7b80\u5355\u7684\u8bbf\u95ee\u8bb0\u5f55\u5c55\u793a\u5e94\u7528\u7a0b\u5e8f - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-11-07T00:03:22+00:00\",\"dateModified\":\"2024-04-29T21:58:26+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/8ca01ba7f7362ad4edb7da206a12f29e\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/django%e5%85%a5%e9%97%a8-%e4%b8%80%e4%b8%aa%e7%ae%80%e5%8d%95%e7%9a%84%e8%ae%bf%e9%97%ae%e8%ae%b0%e5%bd%95%e5%b1%95%e7%a4%ba%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/django%e5%85%a5%e9%97%a8-%e4%b8%80%e4%b8%aa%e7%ae%80%e5%8d%95%e7%9a%84%e8%ae%bf%e9%97%ae%e8%ae%b0%e5%bd%95%e5%b1%95%e7%a4%ba%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/django%e5%85%a5%e9%97%a8-%e4%b8%80%e4%b8%aa%e7%ae%80%e5%8d%95%e7%9a%84%e8%ae%bf%e9%97%ae%e8%ae%b0%e5%bd%95%e5%b1%95%e7%a4%ba%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Django\u5165\u95e8 &#8211; \u4e00\u4e2a\u7b80\u5355\u7684\u8bbf\u95ee\u8bb0\u5f55\u5c55\u793a\u5e94\u7528\u7a0b\u5e8f\"}]},{\"@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\/8ca01ba7f7362ad4edb7da206a12f29e\",\"name\":\"\u79d1, \u9896\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/8a6fb3cc7ba2f69d2189ba532aec4633ea7ed75ac0af162ec367cb3abc0fb2af?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/8a6fb3cc7ba2f69d2189ba532aec4633ea7ed75ac0af162ec367cb3abc0fb2af?s=96&d=mm&r=g\",\"caption\":\"\u79d1, \u9896\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/keying\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/django%e5%85%a5%e9%97%a8-%e4%b8%80%e4%b8%aa%e7%ae%80%e5%8d%95%e7%9a%84%e8%ae%bf%e9%97%ae%e8%ae%b0%e5%bd%95%e5%b1%95%e7%a4%ba%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Django\u5165\u95e8 - \u4e00\u4e2a\u7b80\u5355\u7684\u8bbf\u95ee\u8bb0\u5f55\u5c55\u793a\u5e94\u7528\u7a0b\u5e8f - 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\/django\u5165\u95e8-\u4e00\u4e2a\u7b80\u5355\u7684\u8bbf\u95ee\u8bb0\u5f55\u5c55\u793a\u5e94\u7528\u7a0b\u5e8f\/","og_locale":"zh_CN","og_type":"article","og_title":"Django\u5165\u95e8 - \u4e00\u4e2a\u7b80\u5355\u7684\u8bbf\u95ee\u8bb0\u5f55\u5c55\u793a\u5e94\u7528\u7a0b\u5e8f","og_description":"\u306f\u3058\u3081\u306b TL;DR \u8a18\u4e8b\u306e\u5185\u5bb9\u306b\u3064\u3044\u3066 \u74b0\u5883 \u53c2\u8003\u30da\u30fc\u30b8 \u4f5c\u6210\u3057\u305f\u30b3\u30fc\u30c9 Django\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb \u4eca\u56de\u306e [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/django\u5165\u95e8-\u4e00\u4e2a\u7b80\u5355\u7684\u8bbf\u95ee\u8bb0\u5f55\u5c55\u793a\u5e94\u7528\u7a0b\u5e8f\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-11-07T00:03:22+00:00","article_modified_time":"2024-04-29T21:58:26+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8a4a913a08637a6c91bf\/21-0.png"}],"author":"\u79d1, \u9896","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u79d1, \u9896","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"3 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/django%e5%85%a5%e9%97%a8-%e4%b8%80%e4%b8%aa%e7%ae%80%e5%8d%95%e7%9a%84%e8%ae%bf%e9%97%ae%e8%ae%b0%e5%bd%95%e5%b1%95%e7%a4%ba%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/django%e5%85%a5%e9%97%a8-%e4%b8%80%e4%b8%aa%e7%ae%80%e5%8d%95%e7%9a%84%e8%ae%bf%e9%97%ae%e8%ae%b0%e5%bd%95%e5%b1%95%e7%a4%ba%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f\/","name":"Django\u5165\u95e8 - \u4e00\u4e2a\u7b80\u5355\u7684\u8bbf\u95ee\u8bb0\u5f55\u5c55\u793a\u5e94\u7528\u7a0b\u5e8f - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-11-07T00:03:22+00:00","dateModified":"2024-04-29T21:58:26+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/8ca01ba7f7362ad4edb7da206a12f29e"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/django%e5%85%a5%e9%97%a8-%e4%b8%80%e4%b8%aa%e7%ae%80%e5%8d%95%e7%9a%84%e8%ae%bf%e9%97%ae%e8%ae%b0%e5%bd%95%e5%b1%95%e7%a4%ba%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/django%e5%85%a5%e9%97%a8-%e4%b8%80%e4%b8%aa%e7%ae%80%e5%8d%95%e7%9a%84%e8%ae%bf%e9%97%ae%e8%ae%b0%e5%bd%95%e5%b1%95%e7%a4%ba%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/django%e5%85%a5%e9%97%a8-%e4%b8%80%e4%b8%aa%e7%ae%80%e5%8d%95%e7%9a%84%e8%ae%bf%e9%97%ae%e8%ae%b0%e5%bd%95%e5%b1%95%e7%a4%ba%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"Django\u5165\u95e8 &#8211; \u4e00\u4e2a\u7b80\u5355\u7684\u8bbf\u95ee\u8bb0\u5f55\u5c55\u793a\u5e94\u7528\u7a0b\u5e8f"}]},{"@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\/8ca01ba7f7362ad4edb7da206a12f29e","name":"\u79d1, \u9896","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/8a6fb3cc7ba2f69d2189ba532aec4633ea7ed75ac0af162ec367cb3abc0fb2af?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/8a6fb3cc7ba2f69d2189ba532aec4633ea7ed75ac0af162ec367cb3abc0fb2af?s=96&d=mm&r=g","caption":"\u79d1, \u9896"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/keying\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/django%e5%85%a5%e9%97%a8-%e4%b8%80%e4%b8%aa%e7%ae%80%e5%8d%95%e7%9a%84%e8%ae%bf%e9%97%ae%e8%ae%b0%e5%bd%95%e5%b1%95%e7%a4%ba%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/49272","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\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=49272"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/49272\/revisions"}],"predecessor-version":[{"id":90118,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/49272\/revisions\/90118"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=49272"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=49272"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=49272"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}