Thank you very much for your comments on this site
\n"
-" You can visit %(article_title)s\n"
-" to review your comments,\n"
-" Thank you again!\n"
-" \n"
-" If the link above cannot be opened, please copy this "
-"link to your browser.\n"
-" %(article_url)s"
-msgstr ""
-"
Thank you very much for your comments on this site
\n"
-" You can visit %(article_title)s\n"
-" to review your comments,\n"
-" Thank you again!\n"
-" \n"
-" If the link above cannot be opened, please copy this "
-"link to your browser.\n"
-" %(article_url)s"
-
-#: .\comments\utils.py:26
-#, python-format
-msgid ""
-"Your comment on "
-"%(article_title)s has \n"
-" received a reply. %(comment_body)s\n"
-" \n"
-" go check it out!\n"
-" \n"
-" If the link above cannot be opened, please copy this "
-"link to your browser.\n"
-" %(article_url)s\n"
-" "
-msgstr ""
-"Your comment on "
-"%(article_title)s has \n"
-" received a reply. %(comment_body)s\n"
-" \n"
-" go check it out!\n"
-" \n"
-" If the link above cannot be opened, please copy this "
-"link to your browser.\n"
-" %(article_url)s\n"
-" "
-
-#: .\djangoblog\logentryadmin.py:63
-msgid "object"
-msgstr "object"
-
-#: .\djangoblog\settings.py:140
-msgid "English"
-msgstr "English"
-
-#: .\djangoblog\settings.py:141
-msgid "Simplified Chinese"
-msgstr "Simplified Chinese"
-
-#: .\djangoblog\settings.py:142
-msgid "Traditional Chinese"
-msgstr "Traditional Chinese"
-
-#: .\oauth\models.py:30
-msgid "oauth user"
-msgstr "oauth user"
-
-#: .\oauth\models.py:37
-msgid "weibo"
-msgstr "weibo"
-
-#: .\oauth\models.py:38
-msgid "google"
-msgstr "google"
-
-#: .\oauth\models.py:48
-msgid "callback url"
-msgstr "callback url"
-
-#: .\oauth\models.py:59
-msgid "already exists"
-msgstr "already exists"
-
-#: .\oauth\views.py:154
-#, python-format
-msgid ""
-"\n"
-"
Congratulations, you have successfully bound your email address. You "
-"can use\n"
-" %(oauthuser_type)s to directly log in to this website without a "
-"password.
\n"
-" You are welcome to continue to follow this site, the address is\n"
-" %(site)s\n"
-" Thank you again!\n"
-" \n"
-" If the link above cannot be opened, please copy this link to your "
-"browser.\n"
-" %(site)s\n"
-" "
-msgstr ""
-"\n"
-"
Congratulations, you have successfully bound your email address. You "
-"can use\n"
-" %(oauthuser_type)s to directly log in to this website without a "
-"password.
\n"
-" You are welcome to continue to follow this site, the address is\n"
-" %(site)s\n"
-" Thank you again!\n"
-" \n"
-" If the link above cannot be opened, please copy this link to your "
-"browser.\n"
-" %(site)s\n"
-" "
-
-#: .\oauth\views.py:165
-msgid "Congratulations on your successful binding!"
-msgstr "Congratulations on your successful binding!"
-
-#: .\oauth\views.py:217
-#, python-format
-msgid ""
-"\n"
-"
Please click the link below to bind your email
\n"
-"\n"
-" %(url)s\n"
-"\n"
-" Thank you again!\n"
-" \n"
-" If the link above cannot be opened, please copy this link "
-"to your browser.\n"
-" \n"
-" %(url)s\n"
-" "
-msgstr ""
-"\n"
-"
Please click the link below to bind your email
\n"
-"\n"
-" %(url)s\n"
-"\n"
-" Thank you again!\n"
-" \n"
-" If the link above cannot be opened, please copy this link "
-"to your browser.\n"
-" \n"
-" %(url)s\n"
-" "
-
-#: .\oauth\views.py:228 .\oauth\views.py:240
-msgid "Bind your email"
-msgstr "Bind your email"
-
-#: .\oauth\views.py:242
-msgid ""
-"Congratulations, the binding is just one step away. Please log in to your "
-"email to check the email to complete the binding. Thank you."
-msgstr ""
-"Congratulations, the binding is just one step away. Please log in to your "
-"email to check the email to complete the binding. Thank you."
-
-#: .\oauth\views.py:245
-msgid "Binding successful"
-msgstr "Binding successful"
-
-#: .\oauth\views.py:247
-#, python-format
-msgid ""
-"Congratulations, you have successfully bound your email address. You can use "
-"%(oauthuser_type)s to directly log in to this website without a password. "
-"You are welcome to continue to follow this site."
-msgstr ""
-"Congratulations, you have successfully bound your email address. You can use "
-"%(oauthuser_type)s to directly log in to this website without a password. "
-"You are welcome to continue to follow this site."
-
-#: .\templates\account\forget_password.html:7
-msgid "forget the password"
-msgstr "forget the password"
-
-#: .\templates\account\forget_password.html:18
-msgid "get verification code"
-msgstr "get verification code"
-
-#: .\templates\account\forget_password.html:19
-msgid "submit"
-msgstr "submit"
-
-#: .\templates\account\login.html:36
-msgid "Create Account"
-msgstr "Create Account"
-
-#: .\templates\account\login.html:42
-#, fuzzy
-#| msgid "forget the password"
-msgid "Forget Password"
-msgstr "forget the password"
-
-#: .\templates\account\result.html:18 .\templates\blog\tags\sidebar.html:126
-msgid "login"
-msgstr "login"
-
-#: .\templates\account\result.html:22
-msgid "back to the homepage"
-msgstr "back to the homepage"
-
-#: .\templates\blog\article_archives.html:7
-#: .\templates\blog\article_archives.html:24
-msgid "article archive"
-msgstr "article archive"
-
-#: .\templates\blog\article_archives.html:32
-msgid "year"
-msgstr "year"
-
-#: .\templates\blog\article_archives.html:36
-msgid "month"
-msgstr "month"
-
-#: .\templates\blog\tags\article_info.html:12
-msgid "pin to top"
-msgstr "pin to top"
-
-#: .\templates\blog\tags\article_info.html:28
-msgid "comments"
-msgstr "comments"
-
-#: .\templates\blog\tags\article_info.html:58
-msgid "toc"
-msgstr "toc"
-
-#: .\templates\blog\tags\article_meta_info.html:6
-msgid "posted in"
-msgstr "posted in"
-
-#: .\templates\blog\tags\article_meta_info.html:14
-msgid "and tagged"
-msgstr "and tagged"
-
-#: .\templates\blog\tags\article_meta_info.html:25
-msgid "by "
-msgstr "by"
-
-#: .\templates\blog\tags\article_meta_info.html:29
-#, python-format
-msgid ""
-"\n"
-" title=\"View all articles published by "
-"%(article.author.username)s\"\n"
-" "
-msgstr ""
-"\n"
-" title=\"View all articles published by "
-"%(article.author.username)s\"\n"
-" "
-
-#: .\templates\blog\tags\article_meta_info.html:44
-msgid "on"
-msgstr "on"
-
-#: .\templates\blog\tags\article_meta_info.html:54
-msgid "edit"
-msgstr "edit"
-
-#: .\templates\blog\tags\article_pagination.html:4
-msgid "article navigation"
-msgstr "article navigation"
-
-#: .\templates\blog\tags\article_pagination.html:9
-msgid "earlier articles"
-msgstr "earlier articles"
-
-#: .\templates\blog\tags\article_pagination.html:12
-msgid "newer articles"
-msgstr "newer articles"
-
-#: .\templates\blog\tags\article_tag_list.html:5
-msgid "tags"
-msgstr "tags"
-
-#: .\templates\blog\tags\sidebar.html:7
-msgid "search"
-msgstr "search"
-
-#: .\templates\blog\tags\sidebar.html:50
-msgid "recent comments"
-msgstr "recent comments"
-
-#: .\templates\blog\tags\sidebar.html:57
-msgid "published on"
-msgstr "published on"
-
-#: .\templates\blog\tags\sidebar.html:65
-msgid "recent articles"
-msgstr "recent articles"
-
-#: .\templates\blog\tags\sidebar.html:77
-msgid "bookmark"
-msgstr "bookmark"
-
-#: .\templates\blog\tags\sidebar.html:96
-msgid "Tag Cloud"
-msgstr "Tag Cloud"
-
-#: .\templates\blog\tags\sidebar.html:107
-msgid "Welcome to star or fork the source code of this site"
-msgstr "Welcome to star or fork the source code of this site"
-
-#: .\templates\blog\tags\sidebar.html:118
-msgid "Function"
-msgstr "Function"
-
-#: .\templates\blog\tags\sidebar.html:120
-msgid "management site"
-msgstr "management site"
-
-#: .\templates\blog\tags\sidebar.html:122
-msgid "logout"
-msgstr "logout"
-
-#: .\templates\blog\tags\sidebar.html:129
-msgid "Track record"
-msgstr "Track record"
-
-#: .\templates\blog\tags\sidebar.html:135
-msgid "Click me to return to the top"
-msgstr "Click me to return to the top"
-
-#: .\templates\oauth\oauth_applications.html:5
-#| msgid "login"
-msgid "quick login"
-msgstr "quick login"
-
-#: .\templates\share_layout\nav.html:26
-msgid "Article archive"
-msgstr "Article archive"
diff --git a/src/locale/zh_Hans/LC_MESSAGES/django.mo b/src/locale/zh_Hans/LC_MESSAGES/django.mo
deleted file mode 100644
index a2d36e9..0000000
Binary files a/src/locale/zh_Hans/LC_MESSAGES/django.mo and /dev/null differ
diff --git a/src/locale/zh_Hans/LC_MESSAGES/django.po b/src/locale/zh_Hans/LC_MESSAGES/django.po
deleted file mode 100644
index 200b7e6..0000000
--- a/src/locale/zh_Hans/LC_MESSAGES/django.po
+++ /dev/null
@@ -1,667 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR , YEAR.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-13 16:02+0800\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME \n"
-"Language-Team: LANGUAGE \n"
-"Language: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
-
-#: .\accounts\admin.py:12
-msgid "password"
-msgstr "密码"
-
-#: .\accounts\admin.py:13
-msgid "Enter password again"
-msgstr "再次输入密码"
-
-#: .\accounts\admin.py:24 .\accounts\forms.py:89
-msgid "passwords do not match"
-msgstr "密码不匹配"
-
-#: .\accounts\forms.py:36
-msgid "email already exists"
-msgstr "邮箱已存在"
-
-#: .\accounts\forms.py:46 .\accounts\forms.py:50
-msgid "New password"
-msgstr "新密码"
-
-#: .\accounts\forms.py:60
-msgid "Confirm password"
-msgstr "确认密码"
-
-#: .\accounts\forms.py:70 .\accounts\forms.py:116
-msgid "Email"
-msgstr "邮箱"
-
-#: .\accounts\forms.py:76 .\accounts\forms.py:80
-msgid "Code"
-msgstr "验证码"
-
-#: .\accounts\forms.py:100 .\accounts\tests.py:194
-msgid "email does not exist"
-msgstr "邮箱不存在"
-
-#: .\accounts\models.py:12 .\oauth\models.py:17
-msgid "nick name"
-msgstr "昵称"
-
-#: .\accounts\models.py:13 .\blog\models.py:29 .\blog\models.py:266
-#: .\blog\models.py:284 .\comments\models.py:13 .\oauth\models.py:23
-#: .\oauth\models.py:53
-msgid "creation time"
-msgstr "创建时间"
-
-#: .\accounts\models.py:14 .\comments\models.py:14 .\oauth\models.py:24
-#: .\oauth\models.py:54
-msgid "last modify time"
-msgstr "最后修改时间"
-
-#: .\accounts\models.py:15
-msgid "create source"
-msgstr "来源"
-
-#: .\accounts\models.py:33 .\djangoblog\logentryadmin.py:81
-msgid "user"
-msgstr "用户"
-
-#: .\accounts\tests.py:216 .\accounts\utils.py:39
-msgid "Verification code error"
-msgstr "验证码错误"
-
-#: .\accounts\utils.py:13
-msgid "Verify Email"
-msgstr "验证邮箱"
-
-#: .\accounts\utils.py:21
-#, python-format
-msgid ""
-"You are resetting the password, the verification code is:%(code)s, valid "
-"within 5 minutes, please keep it properly"
-msgstr "您正在重置密码,验证码为:%(code)s,5分钟内有效 请妥善保管."
-
-#: .\blog\admin.py:13 .\blog\models.py:92 .\comments\models.py:17
-#: .\oauth\models.py:12
-msgid "author"
-msgstr "作者"
-
-#: .\blog\admin.py:53
-msgid "Publish selected articles"
-msgstr "发布选中的文章"
-
-#: .\blog\admin.py:54
-msgid "Draft selected articles"
-msgstr "选中文章设为草稿"
-
-#: .\blog\admin.py:55
-msgid "Close article comments"
-msgstr "关闭文章评论"
-
-#: .\blog\admin.py:56
-msgid "Open article comments"
-msgstr "打开文章评论"
-
-#: .\blog\admin.py:89 .\blog\models.py:101 .\blog\models.py:183
-#: .\templates\blog\tags\sidebar.html:40
-msgid "category"
-msgstr "分类目录"
-
-#: .\blog\models.py:20 .\blog\models.py:179 .\templates\share_layout\nav.html:8
-msgid "index"
-msgstr "首页"
-
-#: .\blog\models.py:21
-msgid "list"
-msgstr "列表"
-
-#: .\blog\models.py:22
-msgid "post"
-msgstr "文章"
-
-#: .\blog\models.py:23
-msgid "all"
-msgstr "所有"
-
-#: .\blog\models.py:24
-msgid "slide"
-msgstr "侧边栏"
-
-#: .\blog\models.py:30 .\blog\models.py:267 .\blog\models.py:285
-msgid "modify time"
-msgstr "修改时间"
-
-#: .\blog\models.py:63
-msgid "Draft"
-msgstr "草稿"
-
-#: .\blog\models.py:64
-msgid "Published"
-msgstr "发布"
-
-#: .\blog\models.py:67
-msgid "Open"
-msgstr "打开"
-
-#: .\blog\models.py:68
-msgid "Close"
-msgstr "关闭"
-
-#: .\blog\models.py:71 .\comments\admin.py:47
-msgid "Article"
-msgstr "文章"
-
-#: .\blog\models.py:72
-msgid "Page"
-msgstr "页面"
-
-#: .\blog\models.py:74 .\blog\models.py:280
-msgid "title"
-msgstr "标题"
-
-#: .\blog\models.py:75
-msgid "body"
-msgstr "内容"
-
-#: .\blog\models.py:77
-msgid "publish time"
-msgstr "发布时间"
-
-#: .\blog\models.py:79
-msgid "status"
-msgstr "状态"
-
-#: .\blog\models.py:84
-msgid "comment status"
-msgstr "评论状态"
-
-#: .\blog\models.py:88 .\oauth\models.py:43
-msgid "type"
-msgstr "类型"
-
-#: .\blog\models.py:89
-msgid "views"
-msgstr "阅读量"
-
-#: .\blog\models.py:97 .\blog\models.py:258 .\blog\models.py:282
-msgid "order"
-msgstr "排序"
-
-#: .\blog\models.py:98
-msgid "show toc"
-msgstr "显示目录"
-
-#: .\blog\models.py:105 .\blog\models.py:249
-msgid "tag"
-msgstr "标签"
-
-#: .\blog\models.py:115 .\comments\models.py:21
-msgid "article"
-msgstr "文章"
-
-#: .\blog\models.py:171
-msgid "category name"
-msgstr "分类名"
-
-#: .\blog\models.py:174
-msgid "parent category"
-msgstr "上级分类"
-
-#: .\blog\models.py:234
-msgid "tag name"
-msgstr "标签名"
-
-#: .\blog\models.py:256
-msgid "link name"
-msgstr "链接名"
-
-#: .\blog\models.py:257 .\blog\models.py:271
-msgid "link"
-msgstr "链接"
-
-#: .\blog\models.py:260
-msgid "is show"
-msgstr "是否显示"
-
-#: .\blog\models.py:262
-msgid "show type"
-msgstr "显示类型"
-
-#: .\blog\models.py:281
-msgid "content"
-msgstr "内容"
-
-#: .\blog\models.py:283 .\oauth\models.py:52
-msgid "is enable"
-msgstr "是否启用"
-
-#: .\blog\models.py:289
-msgid "sidebar"
-msgstr "侧边栏"
-
-#: .\blog\models.py:299
-msgid "site name"
-msgstr "站点名称"
-
-#: .\blog\models.py:305
-msgid "site description"
-msgstr "站点描述"
-
-#: .\blog\models.py:311
-msgid "site seo description"
-msgstr "站点SEO描述"
-
-#: .\blog\models.py:313
-msgid "site keywords"
-msgstr "关键字"
-
-#: .\blog\models.py:318
-msgid "article sub length"
-msgstr "文章摘要长度"
-
-#: .\blog\models.py:319
-msgid "sidebar article count"
-msgstr "侧边栏文章数目"
-
-#: .\blog\models.py:320
-msgid "sidebar comment count"
-msgstr "侧边栏评论数目"
-
-#: .\blog\models.py:321
-msgid "article comment count"
-msgstr "文章页面默认显示评论数目"
-
-#: .\blog\models.py:322
-msgid "show adsense"
-msgstr "是否显示广告"
-
-#: .\blog\models.py:324
-msgid "adsense code"
-msgstr "广告内容"
-
-#: .\blog\models.py:325
-msgid "open site comment"
-msgstr "公共头部"
-
-#: .\blog\models.py:352
-msgid "Website configuration"
-msgstr "网站配置"
-
-#: .\blog\models.py:360
-msgid "There can only be one configuration"
-msgstr "只能有一个配置"
-
-#: .\blog\views.py:348
-msgid ""
-"Sorry, the page you requested is not found, please click the home page to "
-"see other?"
-msgstr "抱歉,你所访问的页面找不到,请点击首页看看别的?"
-
-#: .\blog\views.py:356
-msgid "Sorry, the server is busy, please click the home page to see other?"
-msgstr "抱歉,服务出错了,请点击首页看看别的?"
-
-#: .\blog\views.py:369
-msgid "Sorry, you do not have permission to access this page?"
-msgstr "抱歉,你没用权限访问此页面。"
-
-#: .\comments\admin.py:15
-msgid "Disable comments"
-msgstr "禁用评论"
-
-#: .\comments\admin.py:16
-msgid "Enable comments"
-msgstr "启用评论"
-
-#: .\comments\admin.py:46
-msgid "User"
-msgstr "用户"
-
-#: .\comments\models.py:25
-msgid "parent comment"
-msgstr "上级评论"
-
-#: .\comments\models.py:29
-msgid "enable"
-msgstr "启用"
-
-#: .\comments\models.py:34 .\templates\blog\tags\article_info.html:30
-msgid "comment"
-msgstr "评论"
-
-#: .\comments\utils.py:13
-msgid "Thanks for your comment"
-msgstr "感谢你的评论"
-
-#: .\comments\utils.py:15
-#, python-format
-msgid ""
-"
Thank you very much for your comments on this site
\n"
-" You can visit %(article_title)s\n"
-" to review your comments,\n"
-" Thank you again!\n"
-" \n"
-" If the link above cannot be opened, please copy this "
-"link to your browser.\n"
-" %(article_url)s"
-msgstr ""
-"
Congratulations, you have successfully bound your email address. You "
-"can use\n"
-" %(oauthuser_type)s to directly log in to this website without a "
-"password.
\n"
-" You are welcome to continue to follow this site, the address is\n"
-" %(site)s\n"
-" Thank you again!\n"
-" \n"
-" If the link above cannot be opened, please copy this link to your "
-"browser.\n"
-" %(site)s\n"
-" "
-msgstr ""
-"\n"
-"
\n"
-"\n"
-" %(url)s\n"
-"\n"
-" Thank you again!\n"
-" \n"
-" If the link above cannot be opened, please copy this link "
-"to your browser.\n"
-" \n"
-" %(url)s\n"
-" "
-msgstr ""
-"\n"
-"
Thank you very much for your comments on this site
\n"
-" You can visit %(article_title)s\n"
-" to review your comments,\n"
-" Thank you again!\n"
-" \n"
-" If the link above cannot be opened, please copy this "
-"link to your browser.\n"
-" %(article_url)s"
-msgstr ""
-"
Congratulations, you have successfully bound your email address. You "
-"can use\n"
-" %(oauthuser_type)s to directly log in to this website without a "
-"password.
\n"
-" You are welcome to continue to follow this site, the address is\n"
-" %(site)s\n"
-" Thank you again!\n"
-" \n"
-" If the link above cannot be opened, please copy this link to your "
-"browser.\n"
-" %(site)s\n"
-" "
-msgstr ""
-"\n"
-"
\n"
-"\n"
-" %(url)s\n"
-"\n"
-" Thank you again!\n"
-" \n"
-" If the link above cannot be opened, please copy this link "
-"to your browser.\n"
-" \n"
-" %(url)s\n"
-" "
-msgstr ""
-"\n"
-"
請點擊下面的鏈接綁定您的郵箱
\n"
-"\n"
-" %(url)s\n"
-"\n"
-"再次感謝您!\n"
-" \n"
-"如果上面的鏈接打不開,請復製此鏈接到您的瀏覽器。\n"
-"%(url)s\n"
-" "
-
-#: .\oauth\views.py:228 .\oauth\views.py:240
-msgid "Bind your email"
-msgstr "綁定郵箱"
-
-#: .\oauth\views.py:242
-msgid ""
-"Congratulations, the binding is just one step away. Please log in to your "
-"email to check the email to complete the binding. Thank you."
-msgstr "恭喜您,還差一步就綁定成功了,請登錄您的郵箱查看郵件完成綁定,謝謝。"
-
-#: .\oauth\views.py:245
-msgid "Binding successful"
-msgstr "綁定成功"
-
-#: .\oauth\views.py:247
-#, python-format
-msgid ""
-"Congratulations, you have successfully bound your email address. You can use "
-"%(oauthuser_type)s to directly log in to this website without a password. "
-"You are welcome to continue to follow this site."
-msgstr ""
-"恭喜您綁定成功,您以後可以使用%(oauthuser_type)s來直接免密碼登錄本站啦,感謝"
-"您對本站對關註。"
-
-#: .\templates\account\forget_password.html:7
-msgid "forget the password"
-msgstr "忘記密碼"
-
-#: .\templates\account\forget_password.html:18
-msgid "get verification code"
-msgstr "獲取驗證碼"
-
-#: .\templates\account\forget_password.html:19
-msgid "submit"
-msgstr "提交"
-
-#: .\templates\account\login.html:36
-msgid "Create Account"
-msgstr "創建賬號"
-
-#: .\templates\account\login.html:42
-#, fuzzy
-#| msgid "forget the password"
-msgid "Forget Password"
-msgstr "忘記密碼"
-
-#: .\templates\account\result.html:18 .\templates\blog\tags\sidebar.html:126
-msgid "login"
-msgstr "登錄"
-
-#: .\templates\account\result.html:22
-msgid "back to the homepage"
-msgstr "返回首頁吧"
-
-#: .\templates\blog\article_archives.html:7
-#: .\templates\blog\article_archives.html:24
-msgid "article archive"
-msgstr "文章歸檔"
-
-#: .\templates\blog\article_archives.html:32
-msgid "year"
-msgstr "年"
-
-#: .\templates\blog\article_archives.html:36
-msgid "month"
-msgstr "月"
-
-#: .\templates\blog\tags\article_info.html:12
-msgid "pin to top"
-msgstr "置頂"
-
-#: .\templates\blog\tags\article_info.html:28
-msgid "comments"
-msgstr "評論"
-
-#: .\templates\blog\tags\article_info.html:58
-msgid "toc"
-msgstr "目錄"
-
-#: .\templates\blog\tags\article_meta_info.html:6
-msgid "posted in"
-msgstr "發布於"
-
-#: .\templates\blog\tags\article_meta_info.html:14
-msgid "and tagged"
-msgstr "並標記為"
-
-#: .\templates\blog\tags\article_meta_info.html:25
-msgid "by "
-msgstr "由"
-
-#: .\templates\blog\tags\article_meta_info.html:29
-#, python-format
-msgid ""
-"\n"
-" title=\"View all articles published by "
-"%(article.author.username)s\"\n"
-" "
-msgstr ""
-"\n"
-" title=\"查看所有由 %(article.author.username)s\"發布的文章\n"
-" "
-
-#: .\templates\blog\tags\article_meta_info.html:44
-msgid "on"
-msgstr "在"
-
-#: .\templates\blog\tags\article_meta_info.html:54
-msgid "edit"
-msgstr "編輯"
-
-#: .\templates\blog\tags\article_pagination.html:4
-msgid "article navigation"
-msgstr "文章導航"
-
-#: .\templates\blog\tags\article_pagination.html:9
-msgid "earlier articles"
-msgstr "早期文章"
-
-#: .\templates\blog\tags\article_pagination.html:12
-msgid "newer articles"
-msgstr "較新文章"
-
-#: .\templates\blog\tags\article_tag_list.html:5
-msgid "tags"
-msgstr "標簽"
-
-#: .\templates\blog\tags\sidebar.html:7
-msgid "search"
-msgstr "搜索"
-
-#: .\templates\blog\tags\sidebar.html:50
-msgid "recent comments"
-msgstr "近期評論"
-
-#: .\templates\blog\tags\sidebar.html:57
-msgid "published on"
-msgstr "發表於"
-
-#: .\templates\blog\tags\sidebar.html:65
-msgid "recent articles"
-msgstr "近期文章"
-
-#: .\templates\blog\tags\sidebar.html:77
-msgid "bookmark"
-msgstr "書簽"
-
-#: .\templates\blog\tags\sidebar.html:96
-msgid "Tag Cloud"
-msgstr "標簽雲"
-
-#: .\templates\blog\tags\sidebar.html:107
-msgid "Welcome to star or fork the source code of this site"
-msgstr "歡迎您STAR或者FORK本站源代碼"
-
-#: .\templates\blog\tags\sidebar.html:118
-msgid "Function"
-msgstr "功能"
-
-#: .\templates\blog\tags\sidebar.html:120
-msgid "management site"
-msgstr "管理站點"
-
-#: .\templates\blog\tags\sidebar.html:122
-msgid "logout"
-msgstr "登出"
-
-#: .\templates\blog\tags\sidebar.html:129
-msgid "Track record"
-msgstr "運動軌跡記錄"
-
-#: .\templates\blog\tags\sidebar.html:135
-msgid "Click me to return to the top"
-msgstr "點我返回頂部"
-
-#: .\templates\oauth\oauth_applications.html:5
-#| msgid "login"
-msgid "quick login"
-msgstr "快捷登錄"
-
-#: .\templates\share_layout\nav.html:26
-msgid "Article archive"
-msgstr "文章歸檔"
diff --git a/src/logs/djangoblog.log b/src/logs/djangoblog.log
new file mode 100644
index 0000000..493da88
--- /dev/null
+++ b/src/logs/djangoblog.log
@@ -0,0 +1,939 @@
+[2025-10-14 20:36:01,516] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章结尾版权声明 initialized.
+[2025-10-14 20:36:01,516] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章结尾版权声明 initialized.
+[2025-10-14 20:36:01,518] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: article_copyright - 文章结尾版权声明
+[2025-10-14 20:36:01,518] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: article_copyright - 文章结尾版权声明
+[2025-10-14 20:36:01,519] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 阅读时间预测 initialized.
+[2025-10-14 20:36:01,519] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 阅读时间预测 initialized.
+[2025-10-14 20:36:01,520] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: reading_time - 阅读时间预测
+[2025-10-14 20:36:01,520] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: reading_time - 阅读时间预测
+[2025-10-14 20:36:01,521] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 外部链接处理器 initialized.
+[2025-10-14 20:36:01,521] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 外部链接处理器 initialized.
+[2025-10-14 20:36:01,521] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: external_links - 外部链接处理器
+[2025-10-14 20:36:01,521] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: external_links - 外部链接处理器
+[2025-10-14 20:36:01,523] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章浏览次数统计 initialized.
+[2025-10-14 20:36:01,523] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章浏览次数统计 initialized.
+[2025-10-14 20:36:01,523] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: view_count - 文章浏览次数统计
+[2025-10-14 20:36:01,523] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: view_count - 文章浏览次数统计
+[2025-10-14 20:36:01,525] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] SEO 优化器 initialized.
+[2025-10-14 20:36:01,525] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] SEO 优化器 initialized.
+[2025-10-14 20:36:01,525] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: seo_optimizer - SEO 优化器
+[2025-10-14 20:36:01,525] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: seo_optimizer - SEO 优化器
+[2025-10-14 20:36:01,527] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 图片性能优化插件 initialized.
+[2025-10-14 20:36:01,527] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 图片性能优化插件 initialized.
+[2025-10-14 20:36:01,527] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: image_lazy_loading - 图片性能优化插件
+[2025-10-14 20:36:01,527] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: image_lazy_loading - 图片性能优化插件
+[2025-10-14 20:36:01,528] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章推荐 initialized.
+[2025-10-14 20:36:01,528] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章推荐 initialized.
+[2025-10-14 20:36:01,529] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: article_recommendation - 文章推荐
+[2025-10-14 20:36:01,529] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: article_recommendation - 文章推荐
+[2025-10-14 20:36:02,586] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章结尾版权声明 initialized.
+[2025-10-14 20:36:02,586] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章结尾版权声明 initialized.
+[2025-10-14 20:36:02,587] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: article_copyright - 文章结尾版权声明
+[2025-10-14 20:36:02,587] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: article_copyright - 文章结尾版权声明
+[2025-10-14 20:36:02,588] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 阅读时间预测 initialized.
+[2025-10-14 20:36:02,588] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 阅读时间预测 initialized.
+[2025-10-14 20:36:02,588] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: reading_time - 阅读时间预测
+[2025-10-14 20:36:02,588] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: reading_time - 阅读时间预测
+[2025-10-14 20:36:02,590] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 外部链接处理器 initialized.
+[2025-10-14 20:36:02,590] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 外部链接处理器 initialized.
+[2025-10-14 20:36:02,590] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: external_links - 外部链接处理器
+[2025-10-14 20:36:02,590] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: external_links - 外部链接处理器
+[2025-10-14 20:36:02,591] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章浏览次数统计 initialized.
+[2025-10-14 20:36:02,591] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章浏览次数统计 initialized.
+[2025-10-14 20:36:02,591] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: view_count - 文章浏览次数统计
+[2025-10-14 20:36:02,591] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: view_count - 文章浏览次数统计
+[2025-10-14 20:36:02,593] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] SEO 优化器 initialized.
+[2025-10-14 20:36:02,593] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] SEO 优化器 initialized.
+[2025-10-14 20:36:02,593] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: seo_optimizer - SEO 优化器
+[2025-10-14 20:36:02,593] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: seo_optimizer - SEO 优化器
+[2025-10-14 20:36:02,594] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 图片性能优化插件 initialized.
+[2025-10-14 20:36:02,594] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 图片性能优化插件 initialized.
+[2025-10-14 20:36:02,594] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: image_lazy_loading - 图片性能优化插件
+[2025-10-14 20:36:02,594] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: image_lazy_loading - 图片性能优化插件
+[2025-10-14 20:36:02,596] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章推荐 initialized.
+[2025-10-14 20:36:02,596] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章推荐 initialized.
+[2025-10-14 20:36:02,596] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: article_recommendation - 文章推荐
+[2025-10-14 20:36:02,596] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: article_recommendation - 文章推荐
+[2025-10-14 20:36:02,607] INFO [django.utils.autoreload.run_with_reloader:668 autoreload] Watching for file changes with StatReloader
+[2025-10-14 20:36:12,997] INFO [blog.views.get_queryset_from_cache:75 views] set view cache.key:index_1
+[2025-10-14 20:36:13,031] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-14 20:36:13,184] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:36:13,184] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:36:13,667] INFO [blog.templatetags.blog_tags.load_sidebar:213 blog_tags] load sidebar
+[2025-10-14 20:36:13,828] INFO [blog.templatetags.blog_tags.load_sidebar:257 blog_tags] set sidebar cache.key:sidebari
+[2025-10-14 20:37:37,355] INFO [blog.views.get_queryset_from_cache:75 views] set view cache.key:index_1
+[2025-10-14 20:37:43,208] INFO [blog.views.get_queryset_from_cache:75 views] set view cache.key:index_1
+[2025-10-14 20:37:58,772] INFO [blog.views.get_queryset_from_cache:75 views] set view cache.key:index_1
+[2025-10-14 20:38:57,032] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/tag/c.html"]}
+[2025-10-14 20:38:57,032] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/tag/c.html"]}
+[2025-10-14 20:38:57,310] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-14 20:38:57,345] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:38:57,345] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:39:00,721] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/tag/c.html"]}
+[2025-10-14 20:39:00,721] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/tag/c.html"]}
+[2025-10-14 20:39:00,977] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-14 20:39:01,013] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:39:01,013] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:39:04,783] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/tag/java.html"]}
+[2025-10-14 20:39:04,783] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/tag/java.html"]}
+[2025-10-14 20:39:05,045] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-14 20:39:05,086] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:39:05,086] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:39:07,299] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/tag/python.html"]}
+[2025-10-14 20:39:07,299] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/tag/python.html"]}
+[2025-10-14 20:39:07,544] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-14 20:39:07,577] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:39:07,577] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:39:14,925] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/tag/ji-zhu-fen-xiang.html"]}
+[2025-10-14 20:39:14,925] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/tag/ji-zhu-fen-xiang.html"]}
+[2025-10-14 20:39:15,174] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-14 20:39:15,208] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:39:15,208] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:39:22,570] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/tag/ji-zhu-qiu-zhu.html"]}
+[2025-10-14 20:39:22,570] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/tag/ji-zhu-qiu-zhu.html"]}
+[2025-10-14 20:39:22,855] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-14 20:39:22,894] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:39:22,894] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:40:35,655] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/test.html"]}
+[2025-10-14 20:40:35,655] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/test.html"]}
+[2025-10-14 20:40:36,018] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-14 20:40:36,051] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:40:36,051] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:42:18,929] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/article/2025/10/14/1.html"]}
+[2025-10-14 20:42:18,929] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/article/2025/10/14/1.html"]}
+[2025-10-14 20:42:19,272] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-14 20:42:19,305] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:42:19,305] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:43:00,493] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/test.html"]}
+[2025-10-14 20:43:00,493] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/test.html"]}
+[2025-10-14 20:43:00,821] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-14 20:43:00,862] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:43:00,862] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:43:32,291] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/article/2025/10/14/1.html"]}
+[2025-10-14 20:43:32,291] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/article/2025/10/14/1.html"]}
+[2025-10-14 20:43:32,592] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-14 20:43:32,626] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:43:32,626] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:43:37,686] INFO [blog.views.get_queryset_from_cache:75 views] set view cache.key:index_1
+[2025-10-14 20:43:38,551] INFO [blog.templatetags.blog_tags.load_sidebar:213 blog_tags] load sidebar
+[2025-10-14 20:43:38,779] INFO [blog.templatetags.blog_tags.load_sidebar:257 blog_tags] set sidebar cache.key:sidebari
+[2025-10-14 20:44:13,528] INFO [blog.views.get_queryset_from_cache:70 views] get view cache.key:index_1
+[2025-10-14 20:44:18,070] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] admin@admin123.com
+[2025-10-14 20:44:18,070] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] admin@admin123.com
+[2025-10-14 20:44:18,071] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:44:18,071] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:44:18,072] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:44:18,072] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:44:18,073] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:44:18,073] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:44:18,074] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:44:18,074] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:44:18,075] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:44:18,075] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:44:18,158] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:44:18,158] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:44:18,159] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:44:18,159] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:44:18,159] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:44:18,159] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:44:18,159] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:44:18,159] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:44:18,159] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:44:18,159] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:44:25,308] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:44:25,308] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:44:25,309] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:44:25,309] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:44:25,309] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:44:25,309] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:44:25,310] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:44:25,310] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:44:25,310] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:44:25,310] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:44:25,310] INFO [accounts.views.form_valid:123 views] next
+[2025-10-14 20:44:25,492] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/test.html"]}
+[2025-10-14 20:44:25,492] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/test.html"]}
+[2025-10-14 20:44:25,494] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] test@test.com
+[2025-10-14 20:44:25,494] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] test@test.com
+[2025-10-14 20:44:25,495] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:44:25,495] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:44:25,495] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:44:25,495] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:44:25,496] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:44:25,496] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:44:25,496] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:44:25,496] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:44:25,496] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:44:25,496] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:44:25,705] INFO [blog.views.get_queryset_from_cache:75 views] set view cache.key:index_1
+[2025-10-14 20:44:25,707] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-14 20:44:25,740] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:44:25,740] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:44:26,025] INFO [blog.templatetags.blog_tags.load_sidebar:213 blog_tags] load sidebar
+[2025-10-14 20:44:26,259] INFO [blog.templatetags.blog_tags.load_sidebar:257 blog_tags] set sidebar cache.key:sidebari
+[2025-10-14 20:44:39,270] INFO [blog.models.comment_list:151 models] set article comments:1
+[2025-10-14 20:44:39,386] INFO [plugins.article_recommendation.plugin.get_recommendations:191 plugin] 原始推荐数量: 0, 有效推荐数量: 0
+[2025-10-14 20:44:39,762] INFO [plugins.article_recommendation.plugin.get_recommendations:191 plugin] 原始推荐数量: 0, 有效推荐数量: 0
+[2025-10-14 20:44:39,803] INFO [blog.templatetags.blog_tags.load_sidebar:213 blog_tags] load sidebar
+[2025-10-14 20:44:40,092] INFO [blog.templatetags.blog_tags.load_sidebar:257 blog_tags] set sidebar cache.key:sidebarp
+[2025-10-14 20:44:49,669] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:44:49,669] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:44:49,670] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:44:49,670] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:44:49,671] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:44:49,671] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:44:49,671] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:44:49,671] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:44:49,671] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:44:49,671] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:44:49,835] INFO [blog.models.comment_list:151 models] set article comments:1
+[2025-10-14 20:44:49,922] ERROR [djangoblog.blog_signals.send_email_signal_handler:49 blog_signals] 失败邮箱号: ['test@test.com'], (500, b'Error: bad syntax', 'None')
+[2025-10-14 20:44:49,922] ERROR [djangoblog.blog_signals.send_email_signal_handler:49 blog_signals] 失败邮箱号: ['test@test.com'], (500, b'Error: bad syntax', 'None')
+[2025-10-14 20:44:49,967] INFO [plugins.article_recommendation.plugin.get_recommendations:191 plugin] 原始推荐数量: 0, 有效推荐数量: 0
+[2025-10-14 20:44:49,987] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-14 20:44:50,452] INFO [plugins.article_recommendation.plugin.get_recommendations:191 plugin] 原始推荐数量: 0, 有效推荐数量: 0
+[2025-10-14 20:44:50,517] INFO [blog.templatetags.blog_tags.gravatar_url:396 blog_tags] Using default avatar for test@test.com
+[2025-10-14 20:44:50,666] INFO [blog.templatetags.blog_tags.load_sidebar:213 blog_tags] load sidebar
+[2025-10-14 20:44:50,803] INFO [blog.templatetags.blog_tags.load_sidebar:257 blog_tags] set sidebar cache.key:sidebarp
+[2025-10-14 20:45:40,205] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/admin.html"]}
+[2025-10-14 20:45:40,205] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/admin.html"]}
+[2025-10-14 20:45:40,206] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] admin@admin123.com
+[2025-10-14 20:45:40,206] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] admin@admin123.com
+[2025-10-14 20:45:40,208] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:45:40,208] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:45:40,209] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:45:40,209] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:45:40,211] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:45:40,211] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:45:40,212] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:45:40,212] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:45:40,212] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:45:40,212] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:45:40,483] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-14 20:45:40,526] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:45:40,526] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:47:32,528] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/test.html"]}
+[2025-10-14 20:47:32,528] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/test.html"]}
+[2025-10-14 20:47:32,859] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-14 20:47:32,897] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:47:32,897] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:47:42,168] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/test.html"]}
+[2025-10-14 20:47:42,168] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/test.html"]}
+[2025-10-14 20:47:42,519] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-14 20:47:42,552] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:47:42,552] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:48:28,419] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/test.html"]}
+[2025-10-14 20:48:28,419] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/test.html"]}
+[2025-10-14 20:48:28,759] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-14 20:48:28,865] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:48:28,865] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:49:18,735] INFO [blog.views.get_queryset_from_cache:75 views] set view cache.key:index_1
+[2025-10-14 20:49:19,036] INFO [blog.templatetags.blog_tags.load_sidebar:213 blog_tags] load sidebar
+[2025-10-14 20:49:19,296] INFO [blog.templatetags.blog_tags.load_sidebar:257 blog_tags] set sidebar cache.key:sidebari
+[2025-10-14 20:49:23,302] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] admin@admin123.com
+[2025-10-14 20:49:23,302] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] admin@admin123.com
+[2025-10-14 20:49:23,303] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:49:23,303] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:49:23,303] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:49:23,303] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:49:23,304] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:49:23,304] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:49:23,304] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:49:23,304] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:49:23,306] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:49:23,306] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:49:23,389] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:49:23,389] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:49:23,389] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:49:23,389] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:49:23,391] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:49:23,391] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:49:23,391] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:49:23,391] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:49:23,392] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:49:23,392] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:49:30,946] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:49:30,946] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:49:30,947] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:49:30,947] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:49:30,947] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:49:30,947] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:49:30,948] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:49:30,948] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:49:30,948] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:49:30,948] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:49:30,949] INFO [accounts.views.form_valid:123 views] next
+[2025-10-14 20:49:31,411] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/test.html"]}
+[2025-10-14 20:49:31,411] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/test.html"]}
+[2025-10-14 20:49:31,412] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] test@test.com
+[2025-10-14 20:49:31,412] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] test@test.com
+[2025-10-14 20:49:31,422] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:49:31,422] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:49:31,422] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:49:31,422] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:49:31,423] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:49:31,423] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:49:31,425] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:49:31,425] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:49:31,425] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:49:31,425] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:49:31,663] INFO [blog.views.get_queryset_from_cache:75 views] set view cache.key:index_1
+[2025-10-14 20:49:31,664] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-14 20:49:31,697] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:49:31,697] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:49:32,003] INFO [blog.templatetags.blog_tags.load_sidebar:213 blog_tags] load sidebar
+[2025-10-14 20:49:32,239] INFO [blog.templatetags.blog_tags.load_sidebar:257 blog_tags] set sidebar cache.key:sidebari
+[2025-10-14 20:49:45,839] INFO [blog.models.comment_list:151 models] set article comments:1
+[2025-10-14 20:49:45,956] INFO [plugins.article_recommendation.plugin.get_recommendations:191 plugin] 原始推荐数量: 0, 有效推荐数量: 0
+[2025-10-14 20:49:46,334] INFO [plugins.article_recommendation.plugin.get_recommendations:191 plugin] 原始推荐数量: 0, 有效推荐数量: 0
+[2025-10-14 20:49:46,417] INFO [blog.templatetags.blog_tags.gravatar_url:396 blog_tags] Using default avatar for test@test.com
+[2025-10-14 20:49:46,439] INFO [blog.templatetags.blog_tags.load_sidebar:213 blog_tags] load sidebar
+[2025-10-14 20:49:46,571] INFO [blog.templatetags.blog_tags.load_sidebar:257 blog_tags] set sidebar cache.key:sidebarp
+[2025-10-14 20:50:01,693] INFO [blog.views.get_queryset_from_cache:75 views] set view cache.key:category_list_Java_1
+[2025-10-14 20:50:01,850] INFO [blog.templatetags.blog_tags.load_sidebar:213 blog_tags] load sidebar
+[2025-10-14 20:50:01,992] INFO [blog.templatetags.blog_tags.load_sidebar:257 blog_tags] set sidebar cache.key:sidebarl
+[2025-10-14 20:50:03,227] INFO [blog.views.get_queryset_from_cache:75 views] set view cache.key:category_list_Python_1
+[2025-10-14 20:50:05,550] INFO [blog.views.get_queryset_from_cache:75 views] set view cache.key:category_list_C_1
+[2025-10-14 20:50:06,429] INFO [blog.views.get_queryset_from_cache:75 views] set view cache.key:archives
+[2025-10-14 20:50:08,712] INFO [blog.views.get_queryset_from_cache:70 views] get view cache.key:index_1
+[2025-10-14 20:50:39,655] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/admin.html"]}
+[2025-10-14 20:50:39,655] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/admin.html"]}
+[2025-10-14 20:50:39,656] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] admin@admin123.com
+[2025-10-14 20:50:39,656] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] admin@admin123.com
+[2025-10-14 20:50:39,656] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:50:39,656] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:50:39,656] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:50:39,656] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:50:39,658] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:50:39,658] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:50:39,658] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:50:39,658] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:50:39,658] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:50:39,658] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:50:39,885] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-14 20:50:39,919] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:50:39,919] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:51:09,293] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/test.html"]}
+[2025-10-14 20:51:09,293] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/test.html"]}
+[2025-10-14 20:51:09,603] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-14 20:51:09,713] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:51:09,713] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:51:43,081] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/test.html"]}
+[2025-10-14 20:51:43,081] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/test.html"]}
+[2025-10-14 20:51:43,421] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-14 20:51:43,457] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:51:43,457] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:52:10,181] INFO [blog.views.get_queryset_from_cache:75 views] set view cache.key:index_1
+[2025-10-14 20:52:10,497] INFO [blog.templatetags.blog_tags.load_sidebar:213 blog_tags] load sidebar
+[2025-10-14 20:52:10,766] INFO [blog.templatetags.blog_tags.load_sidebar:257 blog_tags] set sidebar cache.key:sidebari
+[2025-10-14 20:52:14,279] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] admin@admin123.com
+[2025-10-14 20:52:14,279] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] admin@admin123.com
+[2025-10-14 20:52:14,281] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:52:14,281] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:52:14,281] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:52:14,281] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:52:14,282] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:52:14,282] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:52:14,283] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:52:14,283] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:52:14,283] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:52:14,283] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:52:14,380] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:52:14,380] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:52:14,381] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:52:14,381] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:52:14,382] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:52:14,382] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:52:14,382] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:52:14,382] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:52:14,383] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:52:14,383] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:52:21,293] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:52:21,293] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:52:21,294] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:52:21,294] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:52:21,295] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:52:21,295] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:52:21,295] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:52:21,295] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:52:21,295] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:52:21,295] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:52:21,296] INFO [accounts.views.form_valid:123 views] next
+[2025-10-14 20:52:21,964] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/test.html"]}
+[2025-10-14 20:52:21,964] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/test.html"]}
+[2025-10-14 20:52:21,965] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] test@test.com
+[2025-10-14 20:52:21,965] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] test@test.com
+[2025-10-14 20:52:21,965] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:52:21,965] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:52:21,965] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:52:21,965] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:52:21,965] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:52:21,965] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:52:21,965] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:52:21,965] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:52:21,966] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:52:21,966] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:52:22,169] INFO [blog.views.get_queryset_from_cache:75 views] set view cache.key:index_1
+[2025-10-14 20:52:22,170] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-14 20:52:22,203] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:52:22,203] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:52:22,562] INFO [blog.templatetags.blog_tags.load_sidebar:213 blog_tags] load sidebar
+[2025-10-14 20:52:22,819] INFO [blog.templatetags.blog_tags.load_sidebar:257 blog_tags] set sidebar cache.key:sidebari
+[2025-10-14 20:52:47,474] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/admin.html"]}
+[2025-10-14 20:52:47,474] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/admin.html"]}
+[2025-10-14 20:52:47,476] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] admin@admin123.com
+[2025-10-14 20:52:47,476] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] admin@admin123.com
+[2025-10-14 20:52:47,476] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:52:47,476] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:52:47,477] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:52:47,477] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:52:47,477] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:52:47,477] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:52:47,477] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:52:47,477] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:52:47,478] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:52:47,478] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:52:47,772] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-14 20:52:47,810] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:52:47,810] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:53:23,185] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/test.html"]}
+[2025-10-14 20:53:23,185] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/test.html"]}
+[2025-10-14 20:53:23,549] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-14 20:53:23,587] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:53:23,587] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:53:58,012] INFO [blog.views.get_queryset_from_cache:75 views] set view cache.key:index_1
+[2025-10-14 20:53:58,300] INFO [blog.templatetags.blog_tags.load_sidebar:213 blog_tags] load sidebar
+[2025-10-14 20:53:58,541] INFO [blog.templatetags.blog_tags.load_sidebar:257 blog_tags] set sidebar cache.key:sidebari
+[2025-10-14 20:54:04,534] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] admin@admin123.com
+[2025-10-14 20:54:04,534] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] admin@admin123.com
+[2025-10-14 20:54:04,535] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:54:04,535] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:54:04,537] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:54:04,537] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:54:04,539] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:54:04,539] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:54:04,539] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:54:04,539] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:54:04,540] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:54:04,540] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:54:04,635] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:54:04,635] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:54:04,636] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:54:04,636] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:54:04,636] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:54:04,636] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:54:04,637] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:54:04,637] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:54:04,637] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:54:04,637] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:54:11,538] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:54:11,538] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:54:11,540] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:54:11,540] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:54:11,540] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:54:11,540] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:54:11,540] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:54:11,540] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:54:11,541] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:54:11,541] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:54:11,542] INFO [accounts.views.form_valid:123 views] next
+[2025-10-14 20:54:11,992] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/test.html"]}
+[2025-10-14 20:54:11,992] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/test.html"]}
+[2025-10-14 20:54:11,997] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] test@test.com
+[2025-10-14 20:54:11,997] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] test@test.com
+[2025-10-14 20:54:11,997] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:54:11,997] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:54:11,997] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:54:11,997] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:54:11,998] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:54:11,998] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:54:11,998] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:54:11,998] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:54:11,999] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:54:11,999] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:54:12,207] INFO [blog.views.get_queryset_from_cache:75 views] set view cache.key:index_1
+[2025-10-14 20:54:12,211] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-14 20:54:12,330] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:54:12,330] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:54:12,640] INFO [blog.templatetags.blog_tags.load_sidebar:213 blog_tags] load sidebar
+[2025-10-14 20:54:12,872] INFO [blog.templatetags.blog_tags.load_sidebar:257 blog_tags] set sidebar cache.key:sidebari
+[2025-10-14 20:54:46,370] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/admin.html"]}
+[2025-10-14 20:54:46,370] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/admin.html"]}
+[2025-10-14 20:54:46,372] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] admin@admin123.com
+[2025-10-14 20:54:46,372] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] admin@admin123.com
+[2025-10-14 20:54:46,372] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:54:46,372] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 20:54:46,373] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:54:46,373] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 20:54:46,374] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:54:46,374] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 20:54:46,375] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:54:46,375] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 20:54:46,379] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:54:46,379] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 20:54:46,657] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-14 20:54:46,694] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:54:46,694] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 20:55:22,218] INFO [blog.views.get_queryset_from_cache:75 views] set view cache.key:index_1
+[2025-10-14 20:55:22,516] INFO [blog.templatetags.blog_tags.load_sidebar:213 blog_tags] load sidebar
+[2025-10-14 20:55:22,776] INFO [blog.templatetags.blog_tags.load_sidebar:257 blog_tags] set sidebar cache.key:sidebari
+[2025-10-14 21:00:59,799] INFO [blog.views.get_queryset_from_cache:70 views] get view cache.key:index_1
+[2025-10-14 21:01:04,366] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] admin@admin123.com
+[2025-10-14 21:01:04,366] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] admin@admin123.com
+[2025-10-14 21:01:04,367] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 21:01:04,367] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 21:01:04,367] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 21:01:04,367] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 21:01:04,367] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 21:01:04,367] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 21:01:04,368] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 21:01:04,368] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 21:01:04,368] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 21:01:04,368] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 21:01:04,455] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 21:01:04,455] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 21:01:04,455] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 21:01:04,455] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 21:01:04,456] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 21:01:04,456] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 21:01:04,457] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 21:01:04,457] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 21:01:04,459] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 21:01:04,459] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 21:01:20,204] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 21:01:20,204] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 21:01:20,205] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 21:01:20,205] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 21:01:20,205] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 21:01:20,205] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 21:01:20,206] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 21:01:20,206] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 21:01:20,206] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 21:01:20,206] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 21:01:20,207] INFO [accounts.views.form_valid:123 views] next
+[2025-10-14 21:01:20,674] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/test.html"]}
+[2025-10-14 21:01:20,674] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/test.html"]}
+[2025-10-14 21:01:20,676] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] test@test.com
+[2025-10-14 21:01:20,676] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] test@test.com
+[2025-10-14 21:01:20,676] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 21:01:20,676] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 21:01:20,677] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 21:01:20,677] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 21:01:20,677] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 21:01:20,677] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 21:01:20,678] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 21:01:20,678] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 21:01:20,678] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 21:01:20,678] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 21:01:20,885] INFO [blog.views.get_queryset_from_cache:75 views] set view cache.key:index_1
+[2025-10-14 21:01:20,886] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-14 21:01:20,921] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 21:01:20,921] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 21:01:21,242] INFO [blog.templatetags.blog_tags.load_sidebar:213 blog_tags] load sidebar
+[2025-10-14 21:01:21,272] WARNING [django.security.csrf.log_response:241 log] Forbidden (CSRF token from POST incorrect.): /login/
+[2025-10-14 21:01:21,497] INFO [blog.templatetags.blog_tags.load_sidebar:257 blog_tags] set sidebar cache.key:sidebari
+[2025-10-14 21:01:31,631] WARNING [django.security.csrf.log_response:241 log] Forbidden (CSRF token from POST incorrect.): /login/
+[2025-10-14 21:01:37,036] INFO [blog.views.get_queryset_from_cache:70 views] get view cache.key:index_1
+[2025-10-14 21:01:40,679] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] test@test.com
+[2025-10-14 21:01:40,679] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] test@test.com
+[2025-10-14 21:01:40,680] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 21:01:40,680] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 21:01:40,680] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 21:01:40,680] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 21:01:40,681] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 21:01:40,681] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 21:01:40,681] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 21:01:40,681] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 21:01:40,681] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 21:01:40,681] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 21:01:40,773] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 21:01:40,773] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 21:01:40,774] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 21:01:40,774] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 21:01:40,775] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 21:01:40,775] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 21:01:40,776] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 21:01:40,776] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 21:01:40,777] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 21:01:40,777] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 21:01:43,125] INFO [blog.views.get_queryset_from_cache:70 views] get view cache.key:index_1
+[2025-10-14 21:01:43,491] INFO [blog.templatetags.blog_tags.load_sidebar:213 blog_tags] load sidebar
+[2025-10-14 21:01:43,636] INFO [blog.templatetags.blog_tags.load_sidebar:257 blog_tags] set sidebar cache.key:sidebari
+[2025-10-14 21:02:00,786] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 21:02:00,786] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 21:02:00,790] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 21:02:00,790] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 21:02:00,790] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 21:02:00,790] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 21:02:00,790] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 21:02:00,790] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 21:02:00,791] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 21:02:00,791] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 21:02:00,794] INFO [accounts.views.form_valid:123 views] next
+[2025-10-14 21:02:01,271] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/test.html"]}
+[2025-10-14 21:02:01,271] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/test.html"]}
+[2025-10-14 21:02:01,273] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] test@test.com
+[2025-10-14 21:02:01,273] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] test@test.com
+[2025-10-14 21:02:01,274] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 21:02:01,274] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 21:02:01,275] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 21:02:01,275] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 21:02:01,276] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 21:02:01,276] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 21:02:01,277] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 21:02:01,277] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 21:02:01,277] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 21:02:01,277] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 21:02:01,498] INFO [blog.views.get_queryset_from_cache:75 views] set view cache.key:index_1
+[2025-10-14 21:02:01,499] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-14 21:02:01,589] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 21:02:01,589] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 21:02:01,927] INFO [blog.templatetags.blog_tags.load_sidebar:213 blog_tags] load sidebar
+[2025-10-14 21:02:02,199] INFO [blog.templatetags.blog_tags.load_sidebar:257 blog_tags] set sidebar cache.key:sidebari
+[2025-10-14 21:02:33,526] INFO [blog.models.comment_list:151 models] set article comments:1
+[2025-10-14 21:02:33,665] INFO [plugins.article_recommendation.plugin.get_recommendations:191 plugin] 原始推荐数量: 0, 有效推荐数量: 0
+[2025-10-14 21:02:34,078] INFO [plugins.article_recommendation.plugin.get_recommendations:191 plugin] 原始推荐数量: 0, 有效推荐数量: 0
+[2025-10-14 21:02:34,164] INFO [blog.templatetags.blog_tags.gravatar_url:396 blog_tags] Using default avatar for test@test.com
+[2025-10-14 21:02:34,184] INFO [blog.templatetags.blog_tags.load_sidebar:213 blog_tags] load sidebar
+[2025-10-14 21:02:34,323] INFO [blog.templatetags.blog_tags.load_sidebar:257 blog_tags] set sidebar cache.key:sidebarp
+[2025-10-14 21:02:36,040] INFO [blog.views.get_queryset_from_cache:75 views] set view cache.key:author_admin_1
+[2025-10-14 21:02:36,350] INFO [blog.templatetags.blog_tags.load_sidebar:213 blog_tags] load sidebar
+[2025-10-14 21:02:36,495] INFO [blog.templatetags.blog_tags.load_sidebar:257 blog_tags] set sidebar cache.key:sidebarl
+[2025-10-14 21:02:55,147] INFO [blog.models.comment_list:146 models] get article comments:1
+[2025-10-14 21:02:55,262] INFO [plugins.article_recommendation.plugin.get_recommendations:191 plugin] 原始推荐数量: 0, 有效推荐数量: 0
+[2025-10-14 21:02:55,650] INFO [plugins.article_recommendation.plugin.get_recommendations:191 plugin] 原始推荐数量: 0, 有效推荐数量: 0
+[2025-10-14 21:03:06,539] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] test@test.com
+[2025-10-14 21:03:06,539] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] test@test.com
+[2025-10-14 21:03:06,539] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 21:03:06,539] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 21:03:06,540] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 21:03:06,540] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 21:03:06,540] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 21:03:06,540] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 21:03:06,540] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 21:03:06,540] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 21:03:06,540] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 21:03:06,540] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 21:03:06,623] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 21:03:06,623] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 21:03:06,624] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 21:03:06,624] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 21:03:06,625] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 21:03:06,625] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 21:03:06,626] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 21:03:06,626] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 21:03:06,626] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 21:03:06,626] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 21:04:24,608] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/test1.html"]}
+[2025-10-14 21:04:24,608] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/test1.html"]}
+[2025-10-14 21:04:24,776] ERROR [djangoblog.blog_signals.send_email_signal_handler:49 blog_signals] 失败邮箱号: ['test1@test1.com'], (500, b'Error: bad syntax', 'None')
+[2025-10-14 21:04:24,776] ERROR [djangoblog.blog_signals.send_email_signal_handler:49 blog_signals] 失败邮箱号: ['test1@test1.com'], (500, b'Error: bad syntax', 'None')
+[2025-10-14 21:04:24,939] INFO [accounts.views.account_result:150 views] register
+[2025-10-14 21:04:24,945] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-14 21:04:24,978] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 21:04:24,978] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 21:06:30,066] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 21:06:30,066] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 21:06:30,068] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 21:06:30,068] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 21:06:30,069] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 21:06:30,069] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 21:06:30,069] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 21:06:30,069] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 21:06:30,069] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 21:06:30,069] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 21:06:30,070] INFO [accounts.views.form_valid:123 views] next
+[2025-10-14 21:06:30,529] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/admin.html"]}
+[2025-10-14 21:06:30,529] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/admin.html"]}
+[2025-10-14 21:06:30,531] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] admin@admin123.com
+[2025-10-14 21:06:30,531] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] admin@admin123.com
+[2025-10-14 21:06:30,531] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 21:06:30,531] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 21:06:30,533] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 21:06:30,533] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 21:06:30,534] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 21:06:30,534] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 21:06:30,534] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 21:06:30,534] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 21:06:30,534] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 21:06:30,534] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 21:06:30,748] INFO [blog.views.get_queryset_from_cache:75 views] set view cache.key:index_1
+[2025-10-14 21:06:30,754] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-14 21:06:30,791] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 21:06:30,791] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 21:06:31,125] INFO [blog.templatetags.blog_tags.load_sidebar:213 blog_tags] load sidebar
+[2025-10-14 21:06:31,391] INFO [blog.templatetags.blog_tags.load_sidebar:257 blog_tags] set sidebar cache.key:sidebari
+[2025-10-14 21:10:00,425] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/test1.html"]}
+[2025-10-14 21:10:00,425] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/test1.html"]}
+[2025-10-14 21:10:00,746] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-14 21:10:00,780] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 21:10:00,780] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 21:10:13,725] INFO [blog.views.get_queryset_from_cache:75 views] set view cache.key:index_1
+[2025-10-14 21:10:14,017] INFO [blog.templatetags.blog_tags.load_sidebar:213 blog_tags] load sidebar
+[2025-10-14 21:10:14,279] INFO [blog.templatetags.blog_tags.load_sidebar:257 blog_tags] set sidebar cache.key:sidebari
+[2025-10-14 21:10:17,053] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] admin@admin123.com
+[2025-10-14 21:10:17,053] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] admin@admin123.com
+[2025-10-14 21:10:17,056] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 21:10:17,056] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 21:10:17,057] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 21:10:17,057] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 21:10:17,058] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 21:10:17,058] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 21:10:17,059] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 21:10:17,059] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 21:10:17,061] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 21:10:17,061] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 21:10:17,148] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 21:10:17,148] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 21:10:17,149] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 21:10:17,149] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 21:10:17,150] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 21:10:17,150] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 21:10:17,150] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 21:10:17,150] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 21:10:17,151] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 21:10:17,151] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 21:10:50,705] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 21:10:50,705] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 21:10:50,706] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 21:10:50,706] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 21:10:50,706] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 21:10:50,706] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 21:10:50,706] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 21:10:50,706] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 21:10:50,707] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 21:10:50,707] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 21:10:50,707] INFO [accounts.views.form_valid:123 views] next
+[2025-10-14 21:10:50,891] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/test.html"]}
+[2025-10-14 21:10:50,891] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/test.html"]}
+[2025-10-14 21:10:50,894] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] test@test.com
+[2025-10-14 21:10:50,894] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] test@test.com
+[2025-10-14 21:10:50,895] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 21:10:50,895] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-14 21:10:50,895] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 21:10:50,895] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-14 21:10:50,896] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 21:10:50,896] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-14 21:10:50,896] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 21:10:50,896] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-14 21:10:50,896] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 21:10:50,896] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-14 21:10:51,103] INFO [blog.views.get_queryset_from_cache:75 views] set view cache.key:index_1
+[2025-10-14 21:10:51,104] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-14 21:10:51,141] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 21:10:51,141] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-14 21:10:51,498] INFO [blog.templatetags.blog_tags.load_sidebar:213 blog_tags] load sidebar
+[2025-10-14 21:10:51,790] INFO [blog.templatetags.blog_tags.load_sidebar:257 blog_tags] set sidebar cache.key:sidebari
+[2025-10-14 21:13:21,061] INFO [blog.views.get_queryset_from_cache:70 views] get view cache.key:index_1
+[2025-10-14 21:14:06,379] INFO [blog.models.comment_list:151 models] set article comments:1
+[2025-10-14 21:14:06,507] INFO [plugins.article_recommendation.plugin.get_recommendations:191 plugin] 原始推荐数量: 0, 有效推荐数量: 0
+[2025-10-14 21:14:06,921] INFO [plugins.article_recommendation.plugin.get_recommendations:191 plugin] 原始推荐数量: 0, 有效推荐数量: 0
+[2025-10-14 21:14:07,017] INFO [blog.templatetags.blog_tags.gravatar_url:396 blog_tags] Using default avatar for test@test.com
+[2025-10-14 21:14:07,044] INFO [blog.templatetags.blog_tags.load_sidebar:213 blog_tags] load sidebar
+[2025-10-14 21:14:07,190] INFO [blog.templatetags.blog_tags.load_sidebar:257 blog_tags] set sidebar cache.key:sidebarp
+[2025-10-15 19:06:42,893] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章结尾版权声明 initialized.
+[2025-10-15 19:06:42,893] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章结尾版权声明 initialized.
+[2025-10-15 19:06:42,894] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: article_copyright - 文章结尾版权声明
+[2025-10-15 19:06:42,894] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: article_copyright - 文章结尾版权声明
+[2025-10-15 19:06:42,896] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 阅读时间预测 initialized.
+[2025-10-15 19:06:42,896] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 阅读时间预测 initialized.
+[2025-10-15 19:06:42,897] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: reading_time - 阅读时间预测
+[2025-10-15 19:06:42,897] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: reading_time - 阅读时间预测
+[2025-10-15 19:06:42,898] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 外部链接处理器 initialized.
+[2025-10-15 19:06:42,898] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 外部链接处理器 initialized.
+[2025-10-15 19:06:42,898] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: external_links - 外部链接处理器
+[2025-10-15 19:06:42,898] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: external_links - 外部链接处理器
+[2025-10-15 19:06:42,900] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章浏览次数统计 initialized.
+[2025-10-15 19:06:42,900] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章浏览次数统计 initialized.
+[2025-10-15 19:06:42,900] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: view_count - 文章浏览次数统计
+[2025-10-15 19:06:42,900] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: view_count - 文章浏览次数统计
+[2025-10-15 19:06:42,903] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] SEO 优化器 initialized.
+[2025-10-15 19:06:42,903] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] SEO 优化器 initialized.
+[2025-10-15 19:06:42,903] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: seo_optimizer - SEO 优化器
+[2025-10-15 19:06:42,903] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: seo_optimizer - SEO 优化器
+[2025-10-15 19:06:42,904] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 图片性能优化插件 initialized.
+[2025-10-15 19:06:42,904] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 图片性能优化插件 initialized.
+[2025-10-15 19:06:42,905] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: image_lazy_loading - 图片性能优化插件
+[2025-10-15 19:06:42,905] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: image_lazy_loading - 图片性能优化插件
+[2025-10-15 19:06:42,907] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章推荐 initialized.
+[2025-10-15 19:06:42,907] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章推荐 initialized.
+[2025-10-15 19:06:42,907] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: article_recommendation - 文章推荐
+[2025-10-15 19:06:42,907] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: article_recommendation - 文章推荐
+[2025-10-15 19:06:51,100] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章结尾版权声明 initialized.
+[2025-10-15 19:06:51,100] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章结尾版权声明 initialized.
+[2025-10-15 19:06:51,100] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: article_copyright - 文章结尾版权声明
+[2025-10-15 19:06:51,100] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: article_copyright - 文章结尾版权声明
+[2025-10-15 19:06:51,101] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 阅读时间预测 initialized.
+[2025-10-15 19:06:51,101] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 阅读时间预测 initialized.
+[2025-10-15 19:06:51,103] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: reading_time - 阅读时间预测
+[2025-10-15 19:06:51,103] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: reading_time - 阅读时间预测
+[2025-10-15 19:06:51,104] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 外部链接处理器 initialized.
+[2025-10-15 19:06:51,104] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 外部链接处理器 initialized.
+[2025-10-15 19:06:51,104] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: external_links - 外部链接处理器
+[2025-10-15 19:06:51,104] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: external_links - 外部链接处理器
+[2025-10-15 19:06:51,105] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章浏览次数统计 initialized.
+[2025-10-15 19:06:51,105] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章浏览次数统计 initialized.
+[2025-10-15 19:06:51,106] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: view_count - 文章浏览次数统计
+[2025-10-15 19:06:51,106] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: view_count - 文章浏览次数统计
+[2025-10-15 19:06:51,108] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] SEO 优化器 initialized.
+[2025-10-15 19:06:51,108] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] SEO 优化器 initialized.
+[2025-10-15 19:06:51,108] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: seo_optimizer - SEO 优化器
+[2025-10-15 19:06:51,108] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: seo_optimizer - SEO 优化器
+[2025-10-15 19:06:51,109] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 图片性能优化插件 initialized.
+[2025-10-15 19:06:51,109] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 图片性能优化插件 initialized.
+[2025-10-15 19:06:51,109] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: image_lazy_loading - 图片性能优化插件
+[2025-10-15 19:06:51,109] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: image_lazy_loading - 图片性能优化插件
+[2025-10-15 19:06:51,111] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章推荐 initialized.
+[2025-10-15 19:06:51,111] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章推荐 initialized.
+[2025-10-15 19:06:51,111] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: article_recommendation - 文章推荐
+[2025-10-15 19:06:51,111] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: article_recommendation - 文章推荐
+[2025-10-15 19:06:52,148] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章结尾版权声明 initialized.
+[2025-10-15 19:06:52,148] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章结尾版权声明 initialized.
+[2025-10-15 19:06:52,149] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: article_copyright - 文章结尾版权声明
+[2025-10-15 19:06:52,149] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: article_copyright - 文章结尾版权声明
+[2025-10-15 19:06:52,150] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 阅读时间预测 initialized.
+[2025-10-15 19:06:52,150] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 阅读时间预测 initialized.
+[2025-10-15 19:06:52,151] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: reading_time - 阅读时间预测
+[2025-10-15 19:06:52,151] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: reading_time - 阅读时间预测
+[2025-10-15 19:06:52,153] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 外部链接处理器 initialized.
+[2025-10-15 19:06:52,153] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 外部链接处理器 initialized.
+[2025-10-15 19:06:52,153] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: external_links - 外部链接处理器
+[2025-10-15 19:06:52,153] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: external_links - 外部链接处理器
+[2025-10-15 19:06:52,155] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章浏览次数统计 initialized.
+[2025-10-15 19:06:52,155] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章浏览次数统计 initialized.
+[2025-10-15 19:06:52,156] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: view_count - 文章浏览次数统计
+[2025-10-15 19:06:52,156] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: view_count - 文章浏览次数统计
+[2025-10-15 19:06:52,157] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] SEO 优化器 initialized.
+[2025-10-15 19:06:52,157] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] SEO 优化器 initialized.
+[2025-10-15 19:06:52,158] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: seo_optimizer - SEO 优化器
+[2025-10-15 19:06:52,158] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: seo_optimizer - SEO 优化器
+[2025-10-15 19:06:52,160] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 图片性能优化插件 initialized.
+[2025-10-15 19:06:52,160] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 图片性能优化插件 initialized.
+[2025-10-15 19:06:52,160] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: image_lazy_loading - 图片性能优化插件
+[2025-10-15 19:06:52,160] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: image_lazy_loading - 图片性能优化插件
+[2025-10-15 19:06:52,162] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章推荐 initialized.
+[2025-10-15 19:06:52,162] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章推荐 initialized.
+[2025-10-15 19:06:52,162] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: article_recommendation - 文章推荐
+[2025-10-15 19:06:52,162] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: article_recommendation - 文章推荐
+[2025-10-15 19:06:52,179] INFO [django.utils.autoreload.run_with_reloader:668 autoreload] Watching for file changes with StatReloader
+[2025-10-15 19:07:03,571] INFO [blog.views.get_queryset_from_cache:75 views] set view cache.key:index_1
+[2025-10-15 19:07:03,600] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-15 19:07:04,004] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-15 19:07:04,004] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-15 19:07:07,984] INFO [blog.templatetags.blog_tags.load_sidebar:213 blog_tags] load sidebar
+[2025-10-15 19:07:10,022] INFO [blog.templatetags.blog_tags.load_sidebar:257 blog_tags] set sidebar cache.key:sidebari
+[2025-10-15 19:07:25,823] INFO [blog.models.comment_list:151 models] set article comments:1
+[2025-10-15 19:07:26,719] INFO [plugins.article_recommendation.plugin.get_recommendations:191 plugin] 原始推荐数量: 0, 有效推荐数量: 0
+[2025-10-15 19:07:30,321] INFO [plugins.article_recommendation.plugin.get_recommendations:191 plugin] 原始推荐数量: 0, 有效推荐数量: 0
+[2025-10-15 19:07:31,108] INFO [blog.templatetags.blog_tags.gravatar_url:396 blog_tags] Using default avatar for test@test.com
+[2025-10-15 19:07:31,567] INFO [blog.templatetags.blog_tags.load_sidebar:213 blog_tags] load sidebar
+[2025-10-15 19:07:32,878] INFO [blog.templatetags.blog_tags.load_sidebar:257 blog_tags] set sidebar cache.key:sidebarp
+[2025-10-15 20:19:20,626] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章结尾版权声明 initialized.
+[2025-10-15 20:19:20,626] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章结尾版权声明 initialized.
+[2025-10-15 20:19:20,626] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: article_copyright - 文章结尾版权声明
+[2025-10-15 20:19:20,626] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: article_copyright - 文章结尾版权声明
+[2025-10-15 20:19:20,629] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 阅读时间预测 initialized.
+[2025-10-15 20:19:20,629] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 阅读时间预测 initialized.
+[2025-10-15 20:19:20,630] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: reading_time - 阅读时间预测
+[2025-10-15 20:19:20,630] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: reading_time - 阅读时间预测
+[2025-10-15 20:19:20,632] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 外部链接处理器 initialized.
+[2025-10-15 20:19:20,632] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 外部链接处理器 initialized.
+[2025-10-15 20:19:20,633] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: external_links - 外部链接处理器
+[2025-10-15 20:19:20,633] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: external_links - 外部链接处理器
+[2025-10-15 20:19:20,635] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章浏览次数统计 initialized.
+[2025-10-15 20:19:20,635] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章浏览次数统计 initialized.
+[2025-10-15 20:19:20,635] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: view_count - 文章浏览次数统计
+[2025-10-15 20:19:20,635] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: view_count - 文章浏览次数统计
+[2025-10-15 20:19:20,637] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] SEO 优化器 initialized.
+[2025-10-15 20:19:20,637] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] SEO 优化器 initialized.
+[2025-10-15 20:19:20,639] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: seo_optimizer - SEO 优化器
+[2025-10-15 20:19:20,639] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: seo_optimizer - SEO 优化器
+[2025-10-15 20:19:20,640] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 图片性能优化插件 initialized.
+[2025-10-15 20:19:20,640] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 图片性能优化插件 initialized.
+[2025-10-15 20:19:20,641] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: image_lazy_loading - 图片性能优化插件
+[2025-10-15 20:19:20,641] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: image_lazy_loading - 图片性能优化插件
+[2025-10-15 20:19:20,643] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章推荐 initialized.
+[2025-10-15 20:19:20,643] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章推荐 initialized.
+[2025-10-15 20:19:20,644] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: article_recommendation - 文章推荐
+[2025-10-15 20:19:20,644] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: article_recommendation - 文章推荐
+[2025-10-15 20:19:21,775] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章结尾版权声明 initialized.
+[2025-10-15 20:19:21,775] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章结尾版权声明 initialized.
+[2025-10-15 20:19:21,775] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: article_copyright - 文章结尾版权声明
+[2025-10-15 20:19:21,775] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: article_copyright - 文章结尾版权声明
+[2025-10-15 20:19:21,777] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 阅读时间预测 initialized.
+[2025-10-15 20:19:21,777] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 阅读时间预测 initialized.
+[2025-10-15 20:19:21,778] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: reading_time - 阅读时间预测
+[2025-10-15 20:19:21,778] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: reading_time - 阅读时间预测
+[2025-10-15 20:19:21,779] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 外部链接处理器 initialized.
+[2025-10-15 20:19:21,779] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 外部链接处理器 initialized.
+[2025-10-15 20:19:21,780] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: external_links - 外部链接处理器
+[2025-10-15 20:19:21,780] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: external_links - 外部链接处理器
+[2025-10-15 20:19:21,781] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章浏览次数统计 initialized.
+[2025-10-15 20:19:21,781] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章浏览次数统计 initialized.
+[2025-10-15 20:19:21,781] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: view_count - 文章浏览次数统计
+[2025-10-15 20:19:21,781] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: view_count - 文章浏览次数统计
+[2025-10-15 20:19:21,783] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] SEO 优化器 initialized.
+[2025-10-15 20:19:21,783] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] SEO 优化器 initialized.
+[2025-10-15 20:19:21,783] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: seo_optimizer - SEO 优化器
+[2025-10-15 20:19:21,783] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: seo_optimizer - SEO 优化器
+[2025-10-15 20:19:21,784] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 图片性能优化插件 initialized.
+[2025-10-15 20:19:21,784] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 图片性能优化插件 initialized.
+[2025-10-15 20:19:21,784] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: image_lazy_loading - 图片性能优化插件
+[2025-10-15 20:19:21,784] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: image_lazy_loading - 图片性能优化插件
+[2025-10-15 20:19:21,785] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章推荐 initialized.
+[2025-10-15 20:19:21,785] INFO [djangoblog.plugin_manage.base_plugin.init_plugin:48 base_plugin] 文章推荐 initialized.
+[2025-10-15 20:19:21,786] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: article_recommendation - 文章推荐
+[2025-10-15 20:19:21,786] INFO [djangoblog.plugin_manage.loader.load_plugins:29 loader] Successfully loaded plugin: article_recommendation - 文章推荐
+[2025-10-15 20:19:21,800] INFO [django.utils.autoreload.run_with_reloader:668 autoreload] Watching for file changes with StatReloader
+[2025-10-15 20:20:24,225] INFO [blog.views.get_queryset_from_cache:75 views] set view cache.key:index_1
+[2025-10-15 20:20:24,279] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-15 20:20:24,359] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-15 20:20:24,359] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-15 20:20:26,465] INFO [blog.templatetags.blog_tags.load_sidebar:213 blog_tags] load sidebar
+[2025-10-15 20:20:27,034] INFO [blog.templatetags.blog_tags.load_sidebar:257 blog_tags] set sidebar cache.key:sidebari
+[2025-10-15 20:20:41,073] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-15 20:20:41,073] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-15 20:20:41,074] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-15 20:20:41,074] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-15 20:20:41,075] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-15 20:20:41,075] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-15 20:20:41,076] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-15 20:20:41,076] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-15 20:20:41,076] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-15 20:20:41,076] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-15 20:20:41,076] INFO [accounts.views.form_valid:123 views] next
+[2025-10-15 20:20:42,074] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/admin.html"]}
+[2025-10-15 20:20:42,074] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/author/admin.html"]}
+[2025-10-15 20:20:42,075] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] admin@admin123.com
+[2025-10-15 20:20:42,075] INFO [djangoblog.blog_signals.user_auth_callback:120 blog_signals] admin@admin123.com
+[2025-10-15 20:20:42,075] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-15 20:20:42,075] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebari
+[2025-10-15 20:20:42,075] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-15 20:20:42,075] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarl
+[2025-10-15 20:20:42,077] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-15 20:20:42,077] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebarp
+[2025-10-15 20:20:42,077] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-15 20:20:42,077] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebara
+[2025-10-15 20:20:42,078] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-15 20:20:42,078] INFO [djangoblog.utils.delete_sidebar_cache:208 utils] delete sidebar key:sidebars
+[2025-10-15 20:20:42,514] INFO [blog.views.get_queryset_from_cache:75 views] set view cache.key:index_1
+[2025-10-15 20:20:42,516] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-15 20:20:42,575] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-15 20:20:42,575] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-15 20:20:43,118] INFO [blog.templatetags.blog_tags.load_sidebar:213 blog_tags] load sidebar
+[2025-10-15 20:20:43,638] INFO [blog.templatetags.blog_tags.load_sidebar:257 blog_tags] set sidebar cache.key:sidebari
+[2025-10-15 20:23:08,795] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/article/2025/10/15/2.html"]}
+[2025-10-15 20:23:08,795] INFO [djangoblog.spider_notify.baidu_notify:15 spider_notify] {"remain":10,"success":0,"not_same_site":["https://example.com/article/2025/10/15/2.html"]}
+[2025-10-15 20:23:09,719] INFO [blog.context_processors.seo_processor:17 context_processors] set processor cache.
+[2025-10-15 20:23:09,870] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-15 20:23:09,870] INFO [djangoblog.utils.get_blog_setting:171 utils] set cache get_blog_setting
+[2025-10-15 20:23:16,292] INFO [blog.views.get_queryset_from_cache:75 views] set view cache.key:index_1
+[2025-10-15 20:23:17,191] INFO [blog.templatetags.blog_tags.load_sidebar:213 blog_tags] load sidebar
+[2025-10-15 20:23:17,887] INFO [blog.templatetags.blog_tags.load_sidebar:257 blog_tags] set sidebar cache.key:sidebari
+[2025-10-15 20:23:23,601] INFO [blog.models.comment_list:151 models] set article comments:2
+[2025-10-15 20:23:23,776] INFO [plugins.article_recommendation.plugin.get_recommendations:191 plugin] 原始推荐数量: 1, 有效推荐数量: 1
+[2025-10-15 20:23:23,776] INFO [plugins.article_recommendation.plugin.get_recommendations:193 plugin] 推荐 1: ID=1, 标题='震惊!代码出现重大bug!!!', 长度=15
+[2025-10-15 20:23:24,628] INFO [plugins.article_recommendation.plugin.get_recommendations:191 plugin] 原始推荐数量: 1, 有效推荐数量: 1
+[2025-10-15 20:23:24,628] INFO [plugins.article_recommendation.plugin.get_recommendations:193 plugin] 推荐 1: ID=1, 标题='震惊!代码出现重大bug!!!', 长度=15
+[2025-10-15 20:23:24,753] INFO [blog.templatetags.blog_tags.load_sidebar:213 blog_tags] load sidebar
+[2025-10-15 20:23:24,964] INFO [blog.templatetags.blog_tags.load_sidebar:257 blog_tags] set sidebar cache.key:sidebarp
diff --git a/src/manage.py b/src/manage.py
deleted file mode 100644
index 919ba74..0000000
--- a/src/manage.py
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/usr/bin/env python
-import os
-import sys
-
-if __name__ == "__main__":
- os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djangoblog.settings")
- try:
- from django.core.management import execute_from_command_line
- except ImportError:
- # The above import may fail for some other reason. Ensure that the
- # issue is really that Django is missing to avoid masking other
- # exceptions on Python 2.
- try:
- import django
- except ImportError:
- raise ImportError(
- "Couldn't import Django. Are you sure it's installed and "
- "available on your PYTHONPATH environment variable? Did you "
- "forget to activate a virtual environment?"
- )
- raise
- execute_from_command_line(sys.argv)
diff --git a/src/oauth/__init__.py b/src/oauth/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/src/oauth/__pycache__/__init__.cpython-311.pyc b/src/oauth/__pycache__/__init__.cpython-311.pyc
new file mode 100644
index 0000000..ea150ab
Binary files /dev/null and b/src/oauth/__pycache__/__init__.cpython-311.pyc differ
diff --git a/src/oauth/__pycache__/admin.cpython-311.pyc b/src/oauth/__pycache__/admin.cpython-311.pyc
new file mode 100644
index 0000000..944b692
Binary files /dev/null and b/src/oauth/__pycache__/admin.cpython-311.pyc differ
diff --git a/src/oauth/__pycache__/apps.cpython-311.pyc b/src/oauth/__pycache__/apps.cpython-311.pyc
new file mode 100644
index 0000000..7544da2
Binary files /dev/null and b/src/oauth/__pycache__/apps.cpython-311.pyc differ
diff --git a/src/oauth/__pycache__/forms.cpython-311.pyc b/src/oauth/__pycache__/forms.cpython-311.pyc
new file mode 100644
index 0000000..2765c9a
Binary files /dev/null and b/src/oauth/__pycache__/forms.cpython-311.pyc differ
diff --git a/src/oauth/__pycache__/models.cpython-311.pyc b/src/oauth/__pycache__/models.cpython-311.pyc
new file mode 100644
index 0000000..14be4c6
Binary files /dev/null and b/src/oauth/__pycache__/models.cpython-311.pyc differ
diff --git a/src/oauth/__pycache__/oauthmanager.cpython-311.pyc b/src/oauth/__pycache__/oauthmanager.cpython-311.pyc
new file mode 100644
index 0000000..e122471
Binary files /dev/null and b/src/oauth/__pycache__/oauthmanager.cpython-311.pyc differ
diff --git a/src/oauth/__pycache__/urls.cpython-311.pyc b/src/oauth/__pycache__/urls.cpython-311.pyc
new file mode 100644
index 0000000..93f5f7b
Binary files /dev/null and b/src/oauth/__pycache__/urls.cpython-311.pyc differ
diff --git a/src/oauth/__pycache__/views.cpython-311.pyc b/src/oauth/__pycache__/views.cpython-311.pyc
new file mode 100644
index 0000000..1503f3c
Binary files /dev/null and b/src/oauth/__pycache__/views.cpython-311.pyc differ
diff --git a/src/oauth/admin.py b/src/oauth/admin.py
deleted file mode 100644
index 57eab5f..0000000
--- a/src/oauth/admin.py
+++ /dev/null
@@ -1,54 +0,0 @@
-import logging
-
-from django.contrib import admin
-# Register your models here.
-from django.urls import reverse
-from django.utils.html import format_html
-
-logger = logging.getLogger(__name__)
-
-
-class OAuthUserAdmin(admin.ModelAdmin):
- search_fields = ('nickname', 'email')
- list_per_page = 20
- list_display = (
- 'id',
- 'nickname',
- 'link_to_usermodel',
- 'show_user_image',
- 'type',
- 'email',
- )
- list_display_links = ('id', 'nickname')
- list_filter = ('author', 'type',)
- readonly_fields = []
-
- def get_readonly_fields(self, request, obj=None):
- return list(self.readonly_fields) + \
- [field.name for field in obj._meta.fields] + \
- [field.name for field in obj._meta.many_to_many]
-
- def has_add_permission(self, request):
- return False
-
- def link_to_usermodel(self, obj):
- if obj.author:
- info = (obj.author._meta.app_label, obj.author._meta.model_name)
- link = reverse('admin:%s_%s_change' % info, args=(obj.author.id,))
- return format_html(
- u'%s' %
- (link, obj.author.nickname if obj.author.nickname else obj.author.email))
-
- def show_user_image(self, obj):
- img = obj.picture
- return format_html(
- u'' %
- (img))
-
- link_to_usermodel.short_description = '用户'
- show_user_image.short_description = '用户头像'
-
-
-class OAuthConfigAdmin(admin.ModelAdmin):
- list_display = ('type', 'appkey', 'appsecret', 'is_enable')
- list_filter = ('type',)
diff --git a/src/oauth/apps.py b/src/oauth/apps.py
deleted file mode 100644
index 17fcea2..0000000
--- a/src/oauth/apps.py
+++ /dev/null
@@ -1,5 +0,0 @@
-from django.apps import AppConfig
-
-
-class OauthConfig(AppConfig):
- name = 'oauth'
diff --git a/src/oauth/forms.py b/src/oauth/forms.py
deleted file mode 100644
index 0e4ede3..0000000
--- a/src/oauth/forms.py
+++ /dev/null
@@ -1,12 +0,0 @@
-from django.contrib.auth.forms import forms
-from django.forms import widgets
-
-
-class RequireEmailForm(forms.Form):
- email = forms.EmailField(label='电子邮箱', required=True)
- oauthid = forms.IntegerField(widget=forms.HiddenInput, required=False)
-
- def __init__(self, *args, **kwargs):
- super(RequireEmailForm, self).__init__(*args, **kwargs)
- self.fields['email'].widget = widgets.EmailInput(
- attrs={'placeholder': "email", "class": "form-control"})
diff --git a/src/oauth/migrations/0001_initial.py b/src/oauth/migrations/0001_initial.py
deleted file mode 100644
index 3aa3e03..0000000
--- a/src/oauth/migrations/0001_initial.py
+++ /dev/null
@@ -1,57 +0,0 @@
-# Generated by Django 4.1.7 on 2023-03-07 09:53
-
-from django.conf import settings
-from django.db import migrations, models
-import django.db.models.deletion
-import django.utils.timezone
-
-
-class Migration(migrations.Migration):
-
- initial = True
-
- dependencies = [
- migrations.swappable_dependency(settings.AUTH_USER_MODEL),
- ]
-
- operations = [
- migrations.CreateModel(
- name='OAuthConfig',
- fields=[
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('type', models.CharField(choices=[('weibo', '微博'), ('google', '谷歌'), ('github', 'GitHub'), ('facebook', 'FaceBook'), ('qq', 'QQ')], default='a', max_length=10, verbose_name='类型')),
- ('appkey', models.CharField(max_length=200, verbose_name='AppKey')),
- ('appsecret', models.CharField(max_length=200, verbose_name='AppSecret')),
- ('callback_url', models.CharField(default='http://www.baidu.com', max_length=200, verbose_name='回调地址')),
- ('is_enable', models.BooleanField(default=True, verbose_name='是否显示')),
- ('created_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间')),
- ('last_mod_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='修改时间')),
- ],
- options={
- 'verbose_name': 'oauth配置',
- 'verbose_name_plural': 'oauth配置',
- 'ordering': ['-created_time'],
- },
- ),
- migrations.CreateModel(
- name='OAuthUser',
- fields=[
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('openid', models.CharField(max_length=50)),
- ('nickname', models.CharField(max_length=50, verbose_name='昵称')),
- ('token', models.CharField(blank=True, max_length=150, null=True)),
- ('picture', models.CharField(blank=True, max_length=350, null=True)),
- ('type', models.CharField(max_length=50)),
- ('email', models.CharField(blank=True, max_length=50, null=True)),
- ('metadata', models.TextField(blank=True, null=True)),
- ('created_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间')),
- ('last_mod_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='修改时间')),
- ('author', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='用户')),
- ],
- options={
- 'verbose_name': 'oauth用户',
- 'verbose_name_plural': 'oauth用户',
- 'ordering': ['-created_time'],
- },
- ),
- ]
diff --git a/src/oauth/migrations/0002_alter_oauthconfig_options_alter_oauthuser_options_and_more.py b/src/oauth/migrations/0002_alter_oauthconfig_options_alter_oauthuser_options_and_more.py
deleted file mode 100644
index d5cc70e..0000000
--- a/src/oauth/migrations/0002_alter_oauthconfig_options_alter_oauthuser_options_and_more.py
+++ /dev/null
@@ -1,86 +0,0 @@
-# Generated by Django 4.2.5 on 2023-09-06 13:13
-
-from django.conf import settings
-from django.db import migrations, models
-import django.db.models.deletion
-import django.utils.timezone
-
-
-class Migration(migrations.Migration):
-
- dependencies = [
- migrations.swappable_dependency(settings.AUTH_USER_MODEL),
- ('oauth', '0001_initial'),
- ]
-
- operations = [
- migrations.AlterModelOptions(
- name='oauthconfig',
- options={'ordering': ['-creation_time'], 'verbose_name': 'oauth配置', 'verbose_name_plural': 'oauth配置'},
- ),
- migrations.AlterModelOptions(
- name='oauthuser',
- options={'ordering': ['-creation_time'], 'verbose_name': 'oauth user', 'verbose_name_plural': 'oauth user'},
- ),
- migrations.RemoveField(
- model_name='oauthconfig',
- name='created_time',
- ),
- migrations.RemoveField(
- model_name='oauthconfig',
- name='last_mod_time',
- ),
- migrations.RemoveField(
- model_name='oauthuser',
- name='created_time',
- ),
- migrations.RemoveField(
- model_name='oauthuser',
- name='last_mod_time',
- ),
- migrations.AddField(
- model_name='oauthconfig',
- name='creation_time',
- field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='creation time'),
- ),
- migrations.AddField(
- model_name='oauthconfig',
- name='last_modify_time',
- field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='last modify time'),
- ),
- migrations.AddField(
- model_name='oauthuser',
- name='creation_time',
- field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='creation time'),
- ),
- migrations.AddField(
- model_name='oauthuser',
- name='last_modify_time',
- field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='last modify time'),
- ),
- migrations.AlterField(
- model_name='oauthconfig',
- name='callback_url',
- field=models.CharField(default='', max_length=200, verbose_name='callback url'),
- ),
- migrations.AlterField(
- model_name='oauthconfig',
- name='is_enable',
- field=models.BooleanField(default=True, verbose_name='is enable'),
- ),
- migrations.AlterField(
- model_name='oauthconfig',
- name='type',
- field=models.CharField(choices=[('weibo', 'weibo'), ('google', 'google'), ('github', 'GitHub'), ('facebook', 'FaceBook'), ('qq', 'QQ')], default='a', max_length=10, verbose_name='type'),
- ),
- migrations.AlterField(
- model_name='oauthuser',
- name='author',
- field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='author'),
- ),
- migrations.AlterField(
- model_name='oauthuser',
- name='nickname',
- field=models.CharField(max_length=50, verbose_name='nickname'),
- ),
- ]
diff --git a/src/oauth/migrations/0003_alter_oauthuser_nickname.py b/src/oauth/migrations/0003_alter_oauthuser_nickname.py
deleted file mode 100644
index 6af08eb..0000000
--- a/src/oauth/migrations/0003_alter_oauthuser_nickname.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# Generated by Django 4.2.7 on 2024-01-26 02:41
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
- dependencies = [
- ('oauth', '0002_alter_oauthconfig_options_alter_oauthuser_options_and_more'),
- ]
-
- operations = [
- migrations.AlterField(
- model_name='oauthuser',
- name='nickname',
- field=models.CharField(max_length=50, verbose_name='nick name'),
- ),
- ]
diff --git a/src/oauth/migrations/__init__.py b/src/oauth/migrations/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/src/oauth/migrations/__pycache__/0001_initial.cpython-311.pyc b/src/oauth/migrations/__pycache__/0001_initial.cpython-311.pyc
new file mode 100644
index 0000000..13fca2f
Binary files /dev/null and b/src/oauth/migrations/__pycache__/0001_initial.cpython-311.pyc differ
diff --git a/src/oauth/migrations/__pycache__/0002_alter_oauthconfig_options_alter_oauthuser_options_and_more.cpython-311.pyc b/src/oauth/migrations/__pycache__/0002_alter_oauthconfig_options_alter_oauthuser_options_and_more.cpython-311.pyc
new file mode 100644
index 0000000..114bdd2
Binary files /dev/null and b/src/oauth/migrations/__pycache__/0002_alter_oauthconfig_options_alter_oauthuser_options_and_more.cpython-311.pyc differ
diff --git a/src/oauth/migrations/__pycache__/0003_alter_oauthuser_nickname.cpython-311.pyc b/src/oauth/migrations/__pycache__/0003_alter_oauthuser_nickname.cpython-311.pyc
new file mode 100644
index 0000000..d1b7c08
Binary files /dev/null and b/src/oauth/migrations/__pycache__/0003_alter_oauthuser_nickname.cpython-311.pyc differ
diff --git a/src/oauth/migrations/__pycache__/__init__.cpython-311.pyc b/src/oauth/migrations/__pycache__/__init__.cpython-311.pyc
new file mode 100644
index 0000000..7f5dc49
Binary files /dev/null and b/src/oauth/migrations/__pycache__/__init__.cpython-311.pyc differ
diff --git a/src/oauth/models.py b/src/oauth/models.py
deleted file mode 100644
index be838ed..0000000
--- a/src/oauth/models.py
+++ /dev/null
@@ -1,67 +0,0 @@
-# Create your models here.
-from django.conf import settings
-from django.core.exceptions import ValidationError
-from django.db import models
-from django.utils.timezone import now
-from django.utils.translation import gettext_lazy as _
-
-
-class OAuthUser(models.Model):
- author = models.ForeignKey(
- settings.AUTH_USER_MODEL,
- verbose_name=_('author'),
- blank=True,
- null=True,
- on_delete=models.CASCADE)
- openid = models.CharField(max_length=50)
- nickname = models.CharField(max_length=50, verbose_name=_('nick name'))
- token = models.CharField(max_length=150, null=True, blank=True)
- picture = models.CharField(max_length=350, blank=True, null=True)
- type = models.CharField(blank=False, null=False, max_length=50)
- email = models.CharField(max_length=50, null=True, blank=True)
- metadata = models.TextField(null=True, blank=True)
- creation_time = models.DateTimeField(_('creation time'), default=now)
- last_modify_time = models.DateTimeField(_('last modify time'), default=now)
-
- def __str__(self):
- return self.nickname
-
- class Meta:
- verbose_name = _('oauth user')
- verbose_name_plural = verbose_name
- ordering = ['-creation_time']
-
-
-class OAuthConfig(models.Model):
- TYPE = (
- ('weibo', _('weibo')),
- ('google', _('google')),
- ('github', 'GitHub'),
- ('facebook', 'FaceBook'),
- ('qq', 'QQ'),
- )
- type = models.CharField(_('type'), max_length=10, choices=TYPE, default='a')
- appkey = models.CharField(max_length=200, verbose_name='AppKey')
- appsecret = models.CharField(max_length=200, verbose_name='AppSecret')
- callback_url = models.CharField(
- max_length=200,
- verbose_name=_('callback url'),
- blank=False,
- default='')
- is_enable = models.BooleanField(
- _('is enable'), default=True, blank=False, null=False)
- creation_time = models.DateTimeField(_('creation time'), default=now)
- last_modify_time = models.DateTimeField(_('last modify time'), default=now)
-
- def clean(self):
- if OAuthConfig.objects.filter(
- type=self.type).exclude(id=self.id).count():
- raise ValidationError(_(self.type + _('already exists')))
-
- def __str__(self):
- return self.type
-
- class Meta:
- verbose_name = 'oauth配置'
- verbose_name_plural = verbose_name
- ordering = ['-creation_time']
diff --git a/src/oauth/oauthmanager.py b/src/oauth/oauthmanager.py
deleted file mode 100644
index 2e7ceef..0000000
--- a/src/oauth/oauthmanager.py
+++ /dev/null
@@ -1,504 +0,0 @@
-import json
-import logging
-import os
-import urllib.parse
-from abc import ABCMeta, abstractmethod
-
-import requests
-
-from djangoblog.utils import cache_decorator
-from oauth.models import OAuthUser, OAuthConfig
-
-logger = logging.getLogger(__name__)
-
-
-class OAuthAccessTokenException(Exception):
- '''
- oauth授权失败异常
- '''
-
-
-class BaseOauthManager(metaclass=ABCMeta):
- """获取用户授权"""
- AUTH_URL = None
- """获取token"""
- TOKEN_URL = None
- """获取用户信息"""
- API_URL = None
- '''icon图标名'''
- ICON_NAME = None
-
- def __init__(self, access_token=None, openid=None):
- self.access_token = access_token
- self.openid = openid
-
- @property
- def is_access_token_set(self):
- return self.access_token is not None
-
- @property
- def is_authorized(self):
- return self.is_access_token_set and self.access_token is not None and self.openid is not None
-
- @abstractmethod
- def get_authorization_url(self, nexturl='/'):
- pass
-
- @abstractmethod
- def get_access_token_by_code(self, code):
- pass
-
- @abstractmethod
- def get_oauth_userinfo(self):
- pass
-
- @abstractmethod
- def get_picture(self, metadata):
- pass
-
- def do_get(self, url, params, headers=None):
- rsp = requests.get(url=url, params=params, headers=headers)
- logger.info(rsp.text)
- return rsp.text
-
- def do_post(self, url, params, headers=None):
- rsp = requests.post(url, params, headers=headers)
- logger.info(rsp.text)
- return rsp.text
-
- def get_config(self):
- value = OAuthConfig.objects.filter(type=self.ICON_NAME)
- return value[0] if value else None
-
-
-class WBOauthManager(BaseOauthManager):
- AUTH_URL = 'https://api.weibo.com/oauth2/authorize'
- TOKEN_URL = 'https://api.weibo.com/oauth2/access_token'
- API_URL = 'https://api.weibo.com/2/users/show.json'
- ICON_NAME = 'weibo'
-
- def __init__(self, access_token=None, openid=None):
- config = self.get_config()
- self.client_id = config.appkey if config else ''
- self.client_secret = config.appsecret if config else ''
- self.callback_url = config.callback_url if config else ''
- super(
- WBOauthManager,
- self).__init__(
- access_token=access_token,
- openid=openid)
-
- def get_authorization_url(self, nexturl='/'):
- params = {
- 'client_id': self.client_id,
- 'response_type': 'code',
- 'redirect_uri': self.callback_url + '&next_url=' + nexturl
- }
- url = self.AUTH_URL + "?" + urllib.parse.urlencode(params)
- return url
-
- def get_access_token_by_code(self, code):
-
- params = {
- 'client_id': self.client_id,
- 'client_secret': self.client_secret,
- 'grant_type': 'authorization_code',
- 'code': code,
- 'redirect_uri': self.callback_url
- }
- rsp = self.do_post(self.TOKEN_URL, params)
-
- obj = json.loads(rsp)
- if 'access_token' in obj:
- self.access_token = str(obj['access_token'])
- self.openid = str(obj['uid'])
- return self.get_oauth_userinfo()
- else:
- raise OAuthAccessTokenException(rsp)
-
- def get_oauth_userinfo(self):
- if not self.is_authorized:
- return None
- params = {
- 'uid': self.openid,
- 'access_token': self.access_token
- }
- rsp = self.do_get(self.API_URL, params)
- try:
- datas = json.loads(rsp)
- user = OAuthUser()
- user.metadata = rsp
- user.picture = datas['avatar_large']
- user.nickname = datas['screen_name']
- user.openid = datas['id']
- user.type = 'weibo'
- user.token = self.access_token
- if 'email' in datas and datas['email']:
- user.email = datas['email']
- return user
- except Exception as e:
- logger.error(e)
- logger.error('weibo oauth error.rsp:' + rsp)
- return None
-
- def get_picture(self, metadata):
- datas = json.loads(metadata)
- return datas['avatar_large']
-
-
-class ProxyManagerMixin:
- def __init__(self, *args, **kwargs):
- if os.environ.get("HTTP_PROXY"):
- self.proxies = {
- "http": os.environ.get("HTTP_PROXY"),
- "https": os.environ.get("HTTP_PROXY")
- }
- else:
- self.proxies = None
-
- def do_get(self, url, params, headers=None):
- rsp = requests.get(url=url, params=params, headers=headers, proxies=self.proxies)
- logger.info(rsp.text)
- return rsp.text
-
- def do_post(self, url, params, headers=None):
- rsp = requests.post(url, params, headers=headers, proxies=self.proxies)
- logger.info(rsp.text)
- return rsp.text
-
-
-class GoogleOauthManager(ProxyManagerMixin, BaseOauthManager):
- AUTH_URL = 'https://accounts.google.com/o/oauth2/v2/auth'
- TOKEN_URL = 'https://www.googleapis.com/oauth2/v4/token'
- API_URL = 'https://www.googleapis.com/oauth2/v3/userinfo'
- ICON_NAME = 'google'
-
- def __init__(self, access_token=None, openid=None):
- config = self.get_config()
- self.client_id = config.appkey if config else ''
- self.client_secret = config.appsecret if config else ''
- self.callback_url = config.callback_url if config else ''
- super(
- GoogleOauthManager,
- self).__init__(
- access_token=access_token,
- openid=openid)
-
- def get_authorization_url(self, nexturl='/'):
- params = {
- 'client_id': self.client_id,
- 'response_type': 'code',
- 'redirect_uri': self.callback_url,
- 'scope': 'openid email',
- }
- url = self.AUTH_URL + "?" + urllib.parse.urlencode(params)
- return url
-
- def get_access_token_by_code(self, code):
- params = {
- 'client_id': self.client_id,
- 'client_secret': self.client_secret,
- 'grant_type': 'authorization_code',
- 'code': code,
-
- 'redirect_uri': self.callback_url
- }
- rsp = self.do_post(self.TOKEN_URL, params)
-
- obj = json.loads(rsp)
-
- if 'access_token' in obj:
- self.access_token = str(obj['access_token'])
- self.openid = str(obj['id_token'])
- logger.info(self.ICON_NAME + ' oauth ' + rsp)
- return self.access_token
- else:
- raise OAuthAccessTokenException(rsp)
-
- def get_oauth_userinfo(self):
- if not self.is_authorized:
- return None
- params = {
- 'access_token': self.access_token
- }
- rsp = self.do_get(self.API_URL, params)
- try:
-
- datas = json.loads(rsp)
- user = OAuthUser()
- user.metadata = rsp
- user.picture = datas['picture']
- user.nickname = datas['name']
- user.openid = datas['sub']
- user.token = self.access_token
- user.type = 'google'
- if datas['email']:
- user.email = datas['email']
- return user
- except Exception as e:
- logger.error(e)
- logger.error('google oauth error.rsp:' + rsp)
- return None
-
- def get_picture(self, metadata):
- datas = json.loads(metadata)
- return datas['picture']
-
-
-class GitHubOauthManager(ProxyManagerMixin, BaseOauthManager):
- AUTH_URL = 'https://github.com/login/oauth/authorize'
- TOKEN_URL = 'https://github.com/login/oauth/access_token'
- API_URL = 'https://api.github.com/user'
- ICON_NAME = 'github'
-
- def __init__(self, access_token=None, openid=None):
- config = self.get_config()
- self.client_id = config.appkey if config else ''
- self.client_secret = config.appsecret if config else ''
- self.callback_url = config.callback_url if config else ''
- super(
- GitHubOauthManager,
- self).__init__(
- access_token=access_token,
- openid=openid)
-
- def get_authorization_url(self, next_url='/'):
- params = {
- 'client_id': self.client_id,
- 'response_type': 'code',
- 'redirect_uri': f'{self.callback_url}&next_url={next_url}',
- 'scope': 'user'
- }
- url = self.AUTH_URL + "?" + urllib.parse.urlencode(params)
- return url
-
- def get_access_token_by_code(self, code):
- params = {
- 'client_id': self.client_id,
- 'client_secret': self.client_secret,
- 'grant_type': 'authorization_code',
- 'code': code,
-
- 'redirect_uri': self.callback_url
- }
- rsp = self.do_post(self.TOKEN_URL, params)
-
- from urllib import parse
- r = parse.parse_qs(rsp)
- if 'access_token' in r:
- self.access_token = (r['access_token'][0])
- return self.access_token
- else:
- raise OAuthAccessTokenException(rsp)
-
- def get_oauth_userinfo(self):
-
- rsp = self.do_get(self.API_URL, params={}, headers={
- "Authorization": "token " + self.access_token
- })
- try:
- datas = json.loads(rsp)
- user = OAuthUser()
- user.picture = datas['avatar_url']
- user.nickname = datas['name']
- user.openid = datas['id']
- user.type = 'github'
- user.token = self.access_token
- user.metadata = rsp
- if 'email' in datas and datas['email']:
- user.email = datas['email']
- return user
- except Exception as e:
- logger.error(e)
- logger.error('github oauth error.rsp:' + rsp)
- return None
-
- def get_picture(self, metadata):
- datas = json.loads(metadata)
- return datas['avatar_url']
-
-
-class FaceBookOauthManager(ProxyManagerMixin, BaseOauthManager):
- AUTH_URL = 'https://www.facebook.com/v16.0/dialog/oauth'
- TOKEN_URL = 'https://graph.facebook.com/v16.0/oauth/access_token'
- API_URL = 'https://graph.facebook.com/me'
- ICON_NAME = 'facebook'
-
- def __init__(self, access_token=None, openid=None):
- config = self.get_config()
- self.client_id = config.appkey if config else ''
- self.client_secret = config.appsecret if config else ''
- self.callback_url = config.callback_url if config else ''
- super(
- FaceBookOauthManager,
- self).__init__(
- access_token=access_token,
- openid=openid)
-
- def get_authorization_url(self, next_url='/'):
- params = {
- 'client_id': self.client_id,
- 'response_type': 'code',
- 'redirect_uri': self.callback_url,
- 'scope': 'email,public_profile'
- }
- url = self.AUTH_URL + "?" + urllib.parse.urlencode(params)
- return url
-
- def get_access_token_by_code(self, code):
- params = {
- 'client_id': self.client_id,
- 'client_secret': self.client_secret,
- # 'grant_type': 'authorization_code',
- 'code': code,
-
- 'redirect_uri': self.callback_url
- }
- rsp = self.do_post(self.TOKEN_URL, params)
-
- obj = json.loads(rsp)
- if 'access_token' in obj:
- token = str(obj['access_token'])
- self.access_token = token
- return self.access_token
- else:
- raise OAuthAccessTokenException(rsp)
-
- def get_oauth_userinfo(self):
- params = {
- 'access_token': self.access_token,
- 'fields': 'id,name,picture,email'
- }
- try:
- rsp = self.do_get(self.API_URL, params)
- datas = json.loads(rsp)
- user = OAuthUser()
- user.nickname = datas['name']
- user.openid = datas['id']
- user.type = 'facebook'
- user.token = self.access_token
- user.metadata = rsp
- if 'email' in datas and datas['email']:
- user.email = datas['email']
- if 'picture' in datas and datas['picture'] and datas['picture']['data'] and datas['picture']['data']['url']:
- user.picture = str(datas['picture']['data']['url'])
- return user
- except Exception as e:
- logger.error(e)
- return None
-
- def get_picture(self, metadata):
- datas = json.loads(metadata)
- return str(datas['picture']['data']['url'])
-
-
-class QQOauthManager(BaseOauthManager):
- AUTH_URL = 'https://graph.qq.com/oauth2.0/authorize'
- TOKEN_URL = 'https://graph.qq.com/oauth2.0/token'
- API_URL = 'https://graph.qq.com/user/get_user_info'
- OPEN_ID_URL = 'https://graph.qq.com/oauth2.0/me'
- ICON_NAME = 'qq'
-
- def __init__(self, access_token=None, openid=None):
- config = self.get_config()
- self.client_id = config.appkey if config else ''
- self.client_secret = config.appsecret if config else ''
- self.callback_url = config.callback_url if config else ''
- super(
- QQOauthManager,
- self).__init__(
- access_token=access_token,
- openid=openid)
-
- def get_authorization_url(self, next_url='/'):
- params = {
- 'response_type': 'code',
- 'client_id': self.client_id,
- 'redirect_uri': self.callback_url + '&next_url=' + next_url,
- }
- url = self.AUTH_URL + "?" + urllib.parse.urlencode(params)
- return url
-
- def get_access_token_by_code(self, code):
- params = {
- 'grant_type': 'authorization_code',
- 'client_id': self.client_id,
- 'client_secret': self.client_secret,
- 'code': code,
- 'redirect_uri': self.callback_url
- }
- rsp = self.do_get(self.TOKEN_URL, params)
- if rsp:
- d = urllib.parse.parse_qs(rsp)
- if 'access_token' in d:
- token = d['access_token']
- self.access_token = token[0]
- return token
- else:
- raise OAuthAccessTokenException(rsp)
-
- def get_open_id(self):
- if self.is_access_token_set:
- params = {
- 'access_token': self.access_token
- }
- rsp = self.do_get(self.OPEN_ID_URL, params)
- if rsp:
- rsp = rsp.replace(
- 'callback(', '').replace(
- ')', '').replace(
- ';', '')
- obj = json.loads(rsp)
- openid = str(obj['openid'])
- self.openid = openid
- return openid
-
- def get_oauth_userinfo(self):
- openid = self.get_open_id()
- if openid:
- params = {
- 'access_token': self.access_token,
- 'oauth_consumer_key': self.client_id,
- 'openid': self.openid
- }
- rsp = self.do_get(self.API_URL, params)
- logger.info(rsp)
- obj = json.loads(rsp)
- user = OAuthUser()
- user.nickname = obj['nickname']
- user.openid = openid
- user.type = 'qq'
- user.token = self.access_token
- user.metadata = rsp
- if 'email' in obj:
- user.email = obj['email']
- if 'figureurl' in obj:
- user.picture = str(obj['figureurl'])
- return user
-
- def get_picture(self, metadata):
- datas = json.loads(metadata)
- return str(datas['figureurl'])
-
-
-@cache_decorator(expiration=100 * 60)
-def get_oauth_apps():
- configs = OAuthConfig.objects.filter(is_enable=True).all()
- if not configs:
- return []
- configtypes = [x.type for x in configs]
- applications = BaseOauthManager.__subclasses__()
- apps = [x() for x in applications if x().ICON_NAME.lower() in configtypes]
- return apps
-
-
-def get_manager_by_type(type):
- applications = get_oauth_apps()
- if applications:
- finds = list(
- filter(
- lambda x: x.ICON_NAME.lower() == type.lower(),
- applications))
- if finds:
- return finds[0]
- return None
diff --git a/src/oauth/templatetags/__init__.py b/src/oauth/templatetags/__init__.py
deleted file mode 100644
index 8b13789..0000000
--- a/src/oauth/templatetags/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/src/oauth/templatetags/__pycache__/__init__.cpython-311.pyc b/src/oauth/templatetags/__pycache__/__init__.cpython-311.pyc
new file mode 100644
index 0000000..6d11ed2
Binary files /dev/null and b/src/oauth/templatetags/__pycache__/__init__.cpython-311.pyc differ
diff --git a/src/oauth/templatetags/__pycache__/oauth_tags.cpython-311.pyc b/src/oauth/templatetags/__pycache__/oauth_tags.cpython-311.pyc
new file mode 100644
index 0000000..7f2bb07
Binary files /dev/null and b/src/oauth/templatetags/__pycache__/oauth_tags.cpython-311.pyc differ
diff --git a/src/oauth/templatetags/oauth_tags.py b/src/oauth/templatetags/oauth_tags.py
deleted file mode 100644
index 7b687d5..0000000
--- a/src/oauth/templatetags/oauth_tags.py
+++ /dev/null
@@ -1,22 +0,0 @@
-from django import template
-from django.urls import reverse
-
-from oauth.oauthmanager import get_oauth_apps
-
-register = template.Library()
-
-
-@register.inclusion_tag('oauth/oauth_applications.html')
-def load_oauth_applications(request):
- applications = get_oauth_apps()
- if applications:
- baseurl = reverse('oauth:oauthlogin')
- path = request.get_full_path()
-
- apps = list(map(lambda x: (x.ICON_NAME, '{baseurl}?type={type}&next_url={next}'.format(
- baseurl=baseurl, type=x.ICON_NAME, next=path)), applications))
- else:
- apps = []
- return {
- 'apps': apps
- }
diff --git a/src/oauth/tests.py b/src/oauth/tests.py
deleted file mode 100644
index bb23b9b..0000000
--- a/src/oauth/tests.py
+++ /dev/null
@@ -1,249 +0,0 @@
-import json
-from unittest.mock import patch
-
-from django.conf import settings
-from django.contrib import auth
-from django.test import Client, RequestFactory, TestCase
-from django.urls import reverse
-
-from djangoblog.utils import get_sha256
-from oauth.models import OAuthConfig
-from oauth.oauthmanager import BaseOauthManager
-
-
-# Create your tests here.
-class OAuthConfigTest(TestCase):
- def setUp(self):
- self.client = Client()
- self.factory = RequestFactory()
-
- def test_oauth_login_test(self):
- c = OAuthConfig()
- c.type = 'weibo'
- c.appkey = 'appkey'
- c.appsecret = 'appsecret'
- c.save()
-
- response = self.client.get('/oauth/oauthlogin?type=weibo')
- self.assertEqual(response.status_code, 302)
- self.assertTrue("api.weibo.com" in response.url)
-
- response = self.client.get('/oauth/authorize?type=weibo&code=code')
- self.assertEqual(response.status_code, 302)
- self.assertEqual(response.url, '/')
-
-
-class OauthLoginTest(TestCase):
- def setUp(self) -> None:
- self.client = Client()
- self.factory = RequestFactory()
- self.apps = self.init_apps()
-
- def init_apps(self):
- applications = [p() for p in BaseOauthManager.__subclasses__()]
- for application in applications:
- c = OAuthConfig()
- c.type = application.ICON_NAME.lower()
- c.appkey = 'appkey'
- c.appsecret = 'appsecret'
- c.save()
- return applications
-
- def get_app_by_type(self, type):
- for app in self.apps:
- if app.ICON_NAME.lower() == type:
- return app
-
- @patch("oauth.oauthmanager.WBOauthManager.do_post")
- @patch("oauth.oauthmanager.WBOauthManager.do_get")
- def test_weibo_login(self, mock_do_get, mock_do_post):
- weibo_app = self.get_app_by_type('weibo')
- assert weibo_app
- url = weibo_app.get_authorization_url()
- mock_do_post.return_value = json.dumps({"access_token": "access_token",
- "uid": "uid"
- })
- mock_do_get.return_value = json.dumps({
- "avatar_large": "avatar_large",
- "screen_name": "screen_name",
- "id": "id",
- "email": "email",
- })
- userinfo = weibo_app.get_access_token_by_code('code')
- self.assertEqual(userinfo.token, 'access_token')
- self.assertEqual(userinfo.openid, 'id')
-
- @patch("oauth.oauthmanager.GoogleOauthManager.do_post")
- @patch("oauth.oauthmanager.GoogleOauthManager.do_get")
- def test_google_login(self, mock_do_get, mock_do_post):
- google_app = self.get_app_by_type('google')
- assert google_app
- url = google_app.get_authorization_url()
- mock_do_post.return_value = json.dumps({
- "access_token": "access_token",
- "id_token": "id_token",
- })
- mock_do_get.return_value = json.dumps({
- "picture": "picture",
- "name": "name",
- "sub": "sub",
- "email": "email",
- })
- token = google_app.get_access_token_by_code('code')
- userinfo = google_app.get_oauth_userinfo()
- self.assertEqual(userinfo.token, 'access_token')
- self.assertEqual(userinfo.openid, 'sub')
-
- @patch("oauth.oauthmanager.GitHubOauthManager.do_post")
- @patch("oauth.oauthmanager.GitHubOauthManager.do_get")
- def test_github_login(self, mock_do_get, mock_do_post):
- github_app = self.get_app_by_type('github')
- assert github_app
- url = github_app.get_authorization_url()
- self.assertTrue("github.com" in url)
- self.assertTrue("client_id" in url)
- mock_do_post.return_value = "access_token=gho_16C7e42F292c6912E7710c838347Ae178B4a&scope=repo%2Cgist&token_type=bearer"
- mock_do_get.return_value = json.dumps({
- "avatar_url": "avatar_url",
- "name": "name",
- "id": "id",
- "email": "email",
- })
- token = github_app.get_access_token_by_code('code')
- userinfo = github_app.get_oauth_userinfo()
- self.assertEqual(userinfo.token, 'gho_16C7e42F292c6912E7710c838347Ae178B4a')
- self.assertEqual(userinfo.openid, 'id')
-
- @patch("oauth.oauthmanager.FaceBookOauthManager.do_post")
- @patch("oauth.oauthmanager.FaceBookOauthManager.do_get")
- def test_facebook_login(self, mock_do_get, mock_do_post):
- facebook_app = self.get_app_by_type('facebook')
- assert facebook_app
- url = facebook_app.get_authorization_url()
- self.assertTrue("facebook.com" in url)
- mock_do_post.return_value = json.dumps({
- "access_token": "access_token",
- })
- mock_do_get.return_value = json.dumps({
- "name": "name",
- "id": "id",
- "email": "email",
- "picture": {
- "data": {
- "url": "url"
- }
- }
- })
- token = facebook_app.get_access_token_by_code('code')
- userinfo = facebook_app.get_oauth_userinfo()
- self.assertEqual(userinfo.token, 'access_token')
-
- @patch("oauth.oauthmanager.QQOauthManager.do_get", side_effect=[
- 'access_token=access_token&expires_in=3600',
- 'callback({"client_id":"appid","openid":"openid"} );',
- json.dumps({
- "nickname": "nickname",
- "email": "email",
- "figureurl": "figureurl",
- "openid": "openid",
- })
- ])
- def test_qq_login(self, mock_do_get):
- qq_app = self.get_app_by_type('qq')
- assert qq_app
- url = qq_app.get_authorization_url()
- self.assertTrue("qq.com" in url)
- token = qq_app.get_access_token_by_code('code')
- userinfo = qq_app.get_oauth_userinfo()
- self.assertEqual(userinfo.token, 'access_token')
-
- @patch("oauth.oauthmanager.WBOauthManager.do_post")
- @patch("oauth.oauthmanager.WBOauthManager.do_get")
- def test_weibo_authoriz_login_with_email(self, mock_do_get, mock_do_post):
-
- mock_do_post.return_value = json.dumps({"access_token": "access_token",
- "uid": "uid"
- })
- mock_user_info = {
- "avatar_large": "avatar_large",
- "screen_name": "screen_name1",
- "id": "id",
- "email": "email",
- }
- mock_do_get.return_value = json.dumps(mock_user_info)
-
- response = self.client.get('/oauth/oauthlogin?type=weibo')
- self.assertEqual(response.status_code, 302)
- self.assertTrue("api.weibo.com" in response.url)
-
- response = self.client.get('/oauth/authorize?type=weibo&code=code')
- self.assertEqual(response.status_code, 302)
- self.assertEqual(response.url, '/')
-
- user = auth.get_user(self.client)
- assert user.is_authenticated
- self.assertTrue(user.is_authenticated)
- self.assertEqual(user.username, mock_user_info['screen_name'])
- self.assertEqual(user.email, mock_user_info['email'])
- self.client.logout()
-
- response = self.client.get('/oauth/authorize?type=weibo&code=code')
- self.assertEqual(response.status_code, 302)
- self.assertEqual(response.url, '/')
-
- user = auth.get_user(self.client)
- assert user.is_authenticated
- self.assertTrue(user.is_authenticated)
- self.assertEqual(user.username, mock_user_info['screen_name'])
- self.assertEqual(user.email, mock_user_info['email'])
-
- @patch("oauth.oauthmanager.WBOauthManager.do_post")
- @patch("oauth.oauthmanager.WBOauthManager.do_get")
- def test_weibo_authoriz_login_without_email(self, mock_do_get, mock_do_post):
-
- mock_do_post.return_value = json.dumps({"access_token": "access_token",
- "uid": "uid"
- })
- mock_user_info = {
- "avatar_large": "avatar_large",
- "screen_name": "screen_name1",
- "id": "id",
- }
- mock_do_get.return_value = json.dumps(mock_user_info)
-
- response = self.client.get('/oauth/oauthlogin?type=weibo')
- self.assertEqual(response.status_code, 302)
- self.assertTrue("api.weibo.com" in response.url)
-
- response = self.client.get('/oauth/authorize?type=weibo&code=code')
-
- self.assertEqual(response.status_code, 302)
-
- oauth_user_id = int(response.url.split('/')[-1].split('.')[0])
- self.assertEqual(response.url, f'/oauth/requireemail/{oauth_user_id}.html')
-
- response = self.client.post(response.url, {'email': 'test@gmail.com', 'oauthid': oauth_user_id})
-
- self.assertEqual(response.status_code, 302)
- sign = get_sha256(settings.SECRET_KEY +
- str(oauth_user_id) + settings.SECRET_KEY)
-
- url = reverse('oauth:bindsuccess', kwargs={
- 'oauthid': oauth_user_id,
- })
- self.assertEqual(response.url, f'{url}?type=email')
-
- path = reverse('oauth:email_confirm', kwargs={
- 'id': oauth_user_id,
- 'sign': sign
- })
- response = self.client.get(path)
- self.assertEqual(response.status_code, 302)
- self.assertEqual(response.url, f'/oauth/bindsuccess/{oauth_user_id}.html?type=success')
- user = auth.get_user(self.client)
- from oauth.models import OAuthUser
- oauth_user = OAuthUser.objects.get(author=user)
- self.assertTrue(user.is_authenticated)
- self.assertEqual(user.username, mock_user_info['screen_name'])
- self.assertEqual(user.email, 'test@gmail.com')
- self.assertEqual(oauth_user.pk, oauth_user_id)
diff --git a/src/oauth/urls.py b/src/oauth/urls.py
deleted file mode 100644
index c4a12a0..0000000
--- a/src/oauth/urls.py
+++ /dev/null
@@ -1,25 +0,0 @@
-from django.urls import path
-
-from . import views
-
-app_name = "oauth"
-urlpatterns = [
- path(
- r'oauth/authorize',
- views.authorize),
- path(
- r'oauth/requireemail/.html',
- views.RequireEmailView.as_view(),
- name='require_email'),
- path(
- r'oauth/emailconfirm//.html',
- views.emailconfirm,
- name='email_confirm'),
- path(
- r'oauth/bindsuccess/.html',
- views.bindsuccess,
- name='bindsuccess'),
- path(
- r'oauth/oauthlogin',
- views.oauthlogin,
- name='oauthlogin')]
diff --git a/src/oauth/views.py b/src/oauth/views.py
deleted file mode 100644
index 12e3a6e..0000000
--- a/src/oauth/views.py
+++ /dev/null
@@ -1,253 +0,0 @@
-import logging
-# Create your views here.
-from urllib.parse import urlparse
-
-from django.conf import settings
-from django.contrib.auth import get_user_model
-from django.contrib.auth import login
-from django.core.exceptions import ObjectDoesNotExist
-from django.db import transaction
-from django.http import HttpResponseForbidden
-from django.http import HttpResponseRedirect
-from django.shortcuts import get_object_or_404
-from django.shortcuts import render
-from django.urls import reverse
-from django.utils import timezone
-from django.utils.translation import gettext_lazy as _
-from django.views.generic import FormView
-
-from djangoblog.blog_signals import oauth_user_login_signal
-from djangoblog.utils import get_current_site
-from djangoblog.utils import send_email, get_sha256
-from oauth.forms import RequireEmailForm
-from .models import OAuthUser
-from .oauthmanager import get_manager_by_type, OAuthAccessTokenException
-
-logger = logging.getLogger(__name__)
-
-
-def get_redirecturl(request):
- nexturl = request.GET.get('next_url', None)
- if not nexturl or nexturl == '/login/' or nexturl == '/login':
- nexturl = '/'
- return nexturl
- p = urlparse(nexturl)
- if p.netloc:
- site = get_current_site().domain
- if not p.netloc.replace('www.', '') == site.replace('www.', ''):
- logger.info('非法url:' + nexturl)
- return "/"
- return nexturl
-
-
-def oauthlogin(request):
- type = request.GET.get('type', None)
- if not type:
- return HttpResponseRedirect('/')
- manager = get_manager_by_type(type)
- if not manager:
- return HttpResponseRedirect('/')
- nexturl = get_redirecturl(request)
- authorizeurl = manager.get_authorization_url(nexturl)
- return HttpResponseRedirect(authorizeurl)
-
-
-def authorize(request):
- type = request.GET.get('type', None)
- if not type:
- return HttpResponseRedirect('/')
- manager = get_manager_by_type(type)
- if not manager:
- return HttpResponseRedirect('/')
- code = request.GET.get('code', None)
- try:
- rsp = manager.get_access_token_by_code(code)
- except OAuthAccessTokenException as e:
- logger.warning("OAuthAccessTokenException:" + str(e))
- return HttpResponseRedirect('/')
- except Exception as e:
- logger.error(e)
- rsp = None
- nexturl = get_redirecturl(request)
- if not rsp:
- return HttpResponseRedirect(manager.get_authorization_url(nexturl))
- user = manager.get_oauth_userinfo()
- if user:
- if not user.nickname or not user.nickname.strip():
- user.nickname = "djangoblog" + timezone.now().strftime('%y%m%d%I%M%S')
- try:
- temp = OAuthUser.objects.get(type=type, openid=user.openid)
- temp.picture = user.picture
- temp.metadata = user.metadata
- temp.nickname = user.nickname
- user = temp
- except ObjectDoesNotExist:
- pass
- # facebook的token过长
- if type == 'facebook':
- user.token = ''
- if user.email:
- with transaction.atomic():
- author = None
- try:
- author = get_user_model().objects.get(id=user.author_id)
- except ObjectDoesNotExist:
- pass
- if not author:
- result = get_user_model().objects.get_or_create(email=user.email)
- author = result[0]
- if result[1]:
- try:
- get_user_model().objects.get(username=user.nickname)
- except ObjectDoesNotExist:
- author.username = user.nickname
- else:
- author.username = "djangoblog" + timezone.now().strftime('%y%m%d%I%M%S')
- author.source = 'authorize'
- author.save()
-
- user.author = author
- user.save()
-
- oauth_user_login_signal.send(
- sender=authorize.__class__, id=user.id)
- login(request, author)
- return HttpResponseRedirect(nexturl)
- else:
- user.save()
- url = reverse('oauth:require_email', kwargs={
- 'oauthid': user.id
- })
-
- return HttpResponseRedirect(url)
- else:
- return HttpResponseRedirect(nexturl)
-
-
-def emailconfirm(request, id, sign):
- if not sign:
- return HttpResponseForbidden()
- if not get_sha256(settings.SECRET_KEY +
- str(id) +
- settings.SECRET_KEY).upper() == sign.upper():
- return HttpResponseForbidden()
- oauthuser = get_object_or_404(OAuthUser, pk=id)
- with transaction.atomic():
- if oauthuser.author:
- author = get_user_model().objects.get(pk=oauthuser.author_id)
- else:
- result = get_user_model().objects.get_or_create(email=oauthuser.email)
- author = result[0]
- if result[1]:
- author.source = 'emailconfirm'
- author.username = oauthuser.nickname.strip() if oauthuser.nickname.strip(
- ) else "djangoblog" + timezone.now().strftime('%y%m%d%I%M%S')
- author.save()
- oauthuser.author = author
- oauthuser.save()
- oauth_user_login_signal.send(
- sender=emailconfirm.__class__,
- id=oauthuser.id)
- login(request, author)
-
- site = 'http://' + get_current_site().domain
- content = _('''
-
Congratulations, you have successfully bound your email address. You can use
- %(oauthuser_type)s to directly log in to this website without a password.
- You are welcome to continue to follow this site, the address is
- %(site)s
- Thank you again!
-
- If the link above cannot be opened, please copy this link to your browser.
- %(site)s
- ''') % {'oauthuser_type': oauthuser.type, 'site': site}
-
- send_email(emailto=[oauthuser.email, ], title=_('Congratulations on your successful binding!'), content=content)
- url = reverse('oauth:bindsuccess', kwargs={
- 'oauthid': id
- })
- url = url + '?type=success'
- return HttpResponseRedirect(url)
-
-
-class RequireEmailView(FormView):
- form_class = RequireEmailForm
- template_name = 'oauth/require_email.html'
-
- def get(self, request, *args, **kwargs):
- oauthid = self.kwargs['oauthid']
- oauthuser = get_object_or_404(OAuthUser, pk=oauthid)
- if oauthuser.email:
- pass
- # return HttpResponseRedirect('/')
-
- return super(RequireEmailView, self).get(request, *args, **kwargs)
-
- def get_initial(self):
- oauthid = self.kwargs['oauthid']
- return {
- 'email': '',
- 'oauthid': oauthid
- }
-
- def get_context_data(self, **kwargs):
- oauthid = self.kwargs['oauthid']
- oauthuser = get_object_or_404(OAuthUser, pk=oauthid)
- if oauthuser.picture:
- kwargs['picture'] = oauthuser.picture
- return super(RequireEmailView, self).get_context_data(**kwargs)
-
- def form_valid(self, form):
- email = form.cleaned_data['email']
- oauthid = form.cleaned_data['oauthid']
- oauthuser = get_object_or_404(OAuthUser, pk=oauthid)
- oauthuser.email = email
- oauthuser.save()
- sign = get_sha256(settings.SECRET_KEY +
- str(oauthuser.id) + settings.SECRET_KEY)
- site = get_current_site().domain
- if settings.DEBUG:
- site = '127.0.0.1:8000'
- path = reverse('oauth:email_confirm', kwargs={
- 'id': oauthid,
- 'sign': sign
- })
- url = "http://{site}{path}".format(site=site, path=path)
-
- content = _("""
-
Please click the link below to bind your email
-
- %(url)s
-
- Thank you again!
-
- If the link above cannot be opened, please copy this link to your browser.
-
- %(url)s
- """) % {'url': url}
- send_email(emailto=[email, ], title=_('Bind your email'), content=content)
- url = reverse('oauth:bindsuccess', kwargs={
- 'oauthid': oauthid
- })
- url = url + '?type=email'
- return HttpResponseRedirect(url)
-
-
-def bindsuccess(request, oauthid):
- type = request.GET.get('type', None)
- oauthuser = get_object_or_404(OAuthUser, pk=oauthid)
- if type == 'email':
- title = _('Bind your email')
- content = _(
- 'Congratulations, the binding is just one step away. '
- 'Please log in to your email to check the email to complete the binding. Thank you.')
- else:
- title = _('Binding successful')
- content = _(
- "Congratulations, you have successfully bound your email address. You can use %(oauthuser_type)s"
- " to directly log in to this website without a password. You are welcome to continue to follow this site." % {
- 'oauthuser_type': oauthuser.type})
- return render(request, 'oauth/bindsuccess.html', {
- 'title': title,
- 'content': content
- })
diff --git a/src/owntracks/__init__.py b/src/owntracks/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/src/owntracks/__pycache__/__init__.cpython-311.pyc b/src/owntracks/__pycache__/__init__.cpython-311.pyc
new file mode 100644
index 0000000..fe145ca
Binary files /dev/null and b/src/owntracks/__pycache__/__init__.cpython-311.pyc differ
diff --git a/src/owntracks/__pycache__/admin.cpython-311.pyc b/src/owntracks/__pycache__/admin.cpython-311.pyc
new file mode 100644
index 0000000..a166500
Binary files /dev/null and b/src/owntracks/__pycache__/admin.cpython-311.pyc differ
diff --git a/src/owntracks/__pycache__/apps.cpython-311.pyc b/src/owntracks/__pycache__/apps.cpython-311.pyc
new file mode 100644
index 0000000..d489fa2
Binary files /dev/null and b/src/owntracks/__pycache__/apps.cpython-311.pyc differ
diff --git a/src/owntracks/__pycache__/models.cpython-311.pyc b/src/owntracks/__pycache__/models.cpython-311.pyc
new file mode 100644
index 0000000..eb4a923
Binary files /dev/null and b/src/owntracks/__pycache__/models.cpython-311.pyc differ
diff --git a/src/owntracks/__pycache__/urls.cpython-311.pyc b/src/owntracks/__pycache__/urls.cpython-311.pyc
new file mode 100644
index 0000000..3e667fe
Binary files /dev/null and b/src/owntracks/__pycache__/urls.cpython-311.pyc differ
diff --git a/src/owntracks/__pycache__/views.cpython-311.pyc b/src/owntracks/__pycache__/views.cpython-311.pyc
new file mode 100644
index 0000000..c1aeb6b
Binary files /dev/null and b/src/owntracks/__pycache__/views.cpython-311.pyc differ
diff --git a/src/owntracks/admin.py b/src/owntracks/admin.py
deleted file mode 100644
index 655b535..0000000
--- a/src/owntracks/admin.py
+++ /dev/null
@@ -1,7 +0,0 @@
-from django.contrib import admin
-
-# Register your models here.
-
-
-class OwnTrackLogsAdmin(admin.ModelAdmin):
- pass
diff --git a/src/owntracks/apps.py b/src/owntracks/apps.py
deleted file mode 100644
index 1bc5f12..0000000
--- a/src/owntracks/apps.py
+++ /dev/null
@@ -1,5 +0,0 @@
-from django.apps import AppConfig
-
-
-class OwntracksConfig(AppConfig):
- name = 'owntracks'
diff --git a/src/owntracks/migrations/0001_initial.py b/src/owntracks/migrations/0001_initial.py
deleted file mode 100644
index 9eee55c..0000000
--- a/src/owntracks/migrations/0001_initial.py
+++ /dev/null
@@ -1,31 +0,0 @@
-# Generated by Django 4.1.7 on 2023-03-02 07:14
-
-from django.db import migrations, models
-import django.utils.timezone
-
-
-class Migration(migrations.Migration):
-
- initial = True
-
- dependencies = [
- ]
-
- operations = [
- migrations.CreateModel(
- name='OwnTrackLog',
- fields=[
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('tid', models.CharField(max_length=100, verbose_name='用户')),
- ('lat', models.FloatField(verbose_name='纬度')),
- ('lon', models.FloatField(verbose_name='经度')),
- ('created_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间')),
- ],
- options={
- 'verbose_name': 'OwnTrackLogs',
- 'verbose_name_plural': 'OwnTrackLogs',
- 'ordering': ['created_time'],
- 'get_latest_by': 'created_time',
- },
- ),
- ]
diff --git a/src/owntracks/migrations/0002_alter_owntracklog_options_and_more.py b/src/owntracks/migrations/0002_alter_owntracklog_options_and_more.py
deleted file mode 100644
index b4f8dec..0000000
--- a/src/owntracks/migrations/0002_alter_owntracklog_options_and_more.py
+++ /dev/null
@@ -1,22 +0,0 @@
-# Generated by Django 4.2.5 on 2023-09-06 13:19
-
-from django.db import migrations
-
-
-class Migration(migrations.Migration):
-
- dependencies = [
- ('owntracks', '0001_initial'),
- ]
-
- operations = [
- migrations.AlterModelOptions(
- name='owntracklog',
- options={'get_latest_by': 'creation_time', 'ordering': ['creation_time'], 'verbose_name': 'OwnTrackLogs', 'verbose_name_plural': 'OwnTrackLogs'},
- ),
- migrations.RenameField(
- model_name='owntracklog',
- old_name='created_time',
- new_name='creation_time',
- ),
- ]
diff --git a/src/owntracks/migrations/__init__.py b/src/owntracks/migrations/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/src/owntracks/migrations/__pycache__/0001_initial.cpython-311.pyc b/src/owntracks/migrations/__pycache__/0001_initial.cpython-311.pyc
new file mode 100644
index 0000000..57892bb
Binary files /dev/null and b/src/owntracks/migrations/__pycache__/0001_initial.cpython-311.pyc differ
diff --git a/src/owntracks/migrations/__pycache__/0002_alter_owntracklog_options_and_more.cpython-311.pyc b/src/owntracks/migrations/__pycache__/0002_alter_owntracklog_options_and_more.cpython-311.pyc
new file mode 100644
index 0000000..1fed633
Binary files /dev/null and b/src/owntracks/migrations/__pycache__/0002_alter_owntracklog_options_and_more.cpython-311.pyc differ
diff --git a/src/owntracks/migrations/__pycache__/__init__.cpython-311.pyc b/src/owntracks/migrations/__pycache__/__init__.cpython-311.pyc
new file mode 100644
index 0000000..a01f9cb
Binary files /dev/null and b/src/owntracks/migrations/__pycache__/__init__.cpython-311.pyc differ
diff --git a/src/owntracks/models.py b/src/owntracks/models.py
deleted file mode 100644
index 760942c..0000000
--- a/src/owntracks/models.py
+++ /dev/null
@@ -1,20 +0,0 @@
-from django.db import models
-from django.utils.timezone import now
-
-
-# Create your models here.
-
-class OwnTrackLog(models.Model):
- tid = models.CharField(max_length=100, null=False, verbose_name='用户')
- lat = models.FloatField(verbose_name='纬度')
- lon = models.FloatField(verbose_name='经度')
- creation_time = models.DateTimeField('创建时间', default=now)
-
- def __str__(self):
- return self.tid
-
- class Meta:
- ordering = ['creation_time']
- verbose_name = "OwnTrackLogs"
- verbose_name_plural = verbose_name
- get_latest_by = 'creation_time'
diff --git a/src/owntracks/tests.py b/src/owntracks/tests.py
deleted file mode 100644
index 3b4b9d8..0000000
--- a/src/owntracks/tests.py
+++ /dev/null
@@ -1,64 +0,0 @@
-import json
-
-from django.test import Client, RequestFactory, TestCase
-
-from accounts.models import BlogUser
-from .models import OwnTrackLog
-
-
-# Create your tests here.
-
-class OwnTrackLogTest(TestCase):
- def setUp(self):
- self.client = Client()
- self.factory = RequestFactory()
-
- def test_own_track_log(self):
- o = {
- 'tid': 12,
- 'lat': 123.123,
- 'lon': 134.341
- }
-
- self.client.post(
- '/owntracks/logtracks',
- json.dumps(o),
- content_type='application/json')
- length = len(OwnTrackLog.objects.all())
- self.assertEqual(length, 1)
-
- o = {
- 'tid': 12,
- 'lat': 123.123
- }
-
- self.client.post(
- '/owntracks/logtracks',
- json.dumps(o),
- content_type='application/json')
- length = len(OwnTrackLog.objects.all())
- self.assertEqual(length, 1)
-
- rsp = self.client.get('/owntracks/show_maps')
- self.assertEqual(rsp.status_code, 302)
-
- user = BlogUser.objects.create_superuser(
- email="liangliangyy1@gmail.com",
- username="liangliangyy1",
- password="liangliangyy1")
-
- self.client.login(username='liangliangyy1', password='liangliangyy1')
- s = OwnTrackLog()
- s.tid = 12
- s.lon = 123.234
- s.lat = 34.234
- s.save()
-
- rsp = self.client.get('/owntracks/show_dates')
- self.assertEqual(rsp.status_code, 200)
- rsp = self.client.get('/owntracks/show_maps')
- self.assertEqual(rsp.status_code, 200)
- rsp = self.client.get('/owntracks/get_datas')
- self.assertEqual(rsp.status_code, 200)
- rsp = self.client.get('/owntracks/get_datas?date=2018-02-26')
- self.assertEqual(rsp.status_code, 200)
diff --git a/src/owntracks/urls.py b/src/owntracks/urls.py
deleted file mode 100644
index c19ada8..0000000
--- a/src/owntracks/urls.py
+++ /dev/null
@@ -1,12 +0,0 @@
-from django.urls import path
-
-from . import views
-
-app_name = "owntracks"
-
-urlpatterns = [
- path('owntracks/logtracks', views.manage_owntrack_log, name='logtracks'),
- path('owntracks/show_maps', views.show_maps, name='show_maps'),
- path('owntracks/get_datas', views.get_datas, name='get_datas'),
- path('owntracks/show_dates', views.show_log_dates, name='show_dates')
-]
diff --git a/src/plugins/__init__.py b/src/plugins/__init__.py
deleted file mode 100644
index e88afca..0000000
--- a/src/plugins/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-# This file makes this a Python package
diff --git a/src/plugins/__pycache__/__init__.cpython-311.pyc b/src/plugins/__pycache__/__init__.cpython-311.pyc
new file mode 100644
index 0000000..9c02a78
Binary files /dev/null and b/src/plugins/__pycache__/__init__.cpython-311.pyc differ
diff --git a/src/plugins/article_copyright/__init__.py b/src/plugins/article_copyright/__init__.py
deleted file mode 100644
index e88afca..0000000
--- a/src/plugins/article_copyright/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-# This file makes this a Python package
diff --git a/src/plugins/article_copyright/__pycache__/__init__.cpython-311.pyc b/src/plugins/article_copyright/__pycache__/__init__.cpython-311.pyc
new file mode 100644
index 0000000..84122cb
Binary files /dev/null and b/src/plugins/article_copyright/__pycache__/__init__.cpython-311.pyc differ
diff --git a/src/plugins/article_copyright/__pycache__/plugin.cpython-311.pyc b/src/plugins/article_copyright/__pycache__/plugin.cpython-311.pyc
new file mode 100644
index 0000000..61a1311
Binary files /dev/null and b/src/plugins/article_copyright/__pycache__/plugin.cpython-311.pyc differ
diff --git a/src/plugins/article_copyright/plugin.py b/src/plugins/article_copyright/plugin.py
index 317fed2..5dba3b3 100644
--- a/src/plugins/article_copyright/plugin.py
+++ b/src/plugins/article_copyright/plugin.py
@@ -22,6 +22,11 @@ class ArticleCopyrightPlugin(BasePlugin):
article = kwargs.get('article')
if not article:
return content
+
+ # 如果是摘要模式(首页),不添加版权声明
+ is_summary = kwargs.get('is_summary', False)
+ if is_summary:
+ return content
copyright_info = f"\n
- {# {% query article_comments parent_comment=None as parent_comments %}#} - {% for comment_item in p_comments %} - - {% with 0 as depth %} - {% include "comments/tags/comment_item_tree.html" %} - {% endwith %} - {% endfor %} - -
--