diff --git a/src/DjangoBlog/.gitignore b/src/DjangoBlog/.gitignore
index 76302b1..bf9277b 100644
--- a/src/DjangoBlog/.gitignore
+++ b/src/DjangoBlog/.gitignore
@@ -77,3 +77,5 @@ uploads/
settings_production.py
werobot_session.db
bin/datas/
+
+.env
\ No newline at end of file
diff --git a/src/DjangoBlog/accounts/forms.py b/src/DjangoBlog/accounts/forms.py
index 3f52c3b..163dacf 100644
--- a/src/DjangoBlog/accounts/forms.py
+++ b/src/DjangoBlog/accounts/forms.py
@@ -10,7 +10,6 @@ from django.core.exceptions import ValidationError
from django.forms import widgets
#shw 导入Django的国际化和翻译工具
from django.utils.translation import gettext_lazy as _
-
from . import utils
#shw 导入本地的BlogUser模型
from .models import BlogUser
diff --git a/src/DjangoBlog/accounts/migrations/0001_initial.py b/src/DjangoBlog/accounts/migrations/0001_initial.py
index 884428e..d2fbcab 100644
--- a/src/DjangoBlog/accounts/migrations/0001_initial.py
+++ b/src/DjangoBlog/accounts/migrations/0001_initial.py
@@ -2,8 +2,8 @@
import django.contrib.auth.models
import django.contrib.auth.validators
-import django.utils.timezone
from django.db import migrations, models
+import django.utils.timezone
class Migration(migrations.Migration):
diff --git a/src/DjangoBlog/accounts/migrations/0002_alter_bloguser_options_remove_bloguser_created_time_and_more.py b/src/DjangoBlog/accounts/migrations/0002_alter_bloguser_options_remove_bloguser_created_time_and_more.py
index 854d366..1a9f509 100644
--- a/src/DjangoBlog/accounts/migrations/0002_alter_bloguser_options_remove_bloguser_created_time_and_more.py
+++ b/src/DjangoBlog/accounts/migrations/0002_alter_bloguser_options_remove_bloguser_created_time_and_more.py
@@ -1,7 +1,7 @@
# Generated by Django 4.2.5 on 2023-09-06 13:13
-import django.utils.timezone
from django.db import migrations, models
+import django.utils.timezone
class Migration(migrations.Migration):
diff --git a/src/DjangoBlog/accounts/models.py b/src/DjangoBlog/accounts/models.py
index 89b8e78..3a2cb46 100644
--- a/src/DjangoBlog/accounts/models.py
+++ b/src/DjangoBlog/accounts/models.py
@@ -8,7 +8,6 @@ from django.urls import reverse
from django.utils.timezone import now
#shw 导入Django的国际化和翻译工具
from django.utils.translation import gettext_lazy as _
-
from djangoblog.utils import get_current_site
diff --git a/src/DjangoBlog/accounts/tests.py b/src/DjangoBlog/accounts/tests.py
index c8811cf..00440c5 100644
--- a/src/DjangoBlog/accounts/tests.py
+++ b/src/DjangoBlog/accounts/tests.py
@@ -4,6 +4,7 @@ from django.test import Client, RequestFactory, TestCase
from django.urls import reverse
#shw 导入Django的时区工具
from django.utils import timezone
+from django.utils.translation import gettext_lazy as _
#shw 导入本地的BlogUser模型
from accounts.models import BlogUser
@@ -35,12 +36,12 @@ class AccountTest(TestCase):
self.new_test = "xxx123--=" #shw 定义一个测试用的新密码
def test_validate_account(self):
- get_current_site().domain
+ site = get_current_site().domain
user = BlogUser.objects.create_superuser(
email="liangliangyy1@gmail.com",
username="liangliangyy1",
password="qwer!@#$ggg")
- BlogUser.objects.get(username='liangliangyy1') #shw 从数据库中获取刚创建的超级用户
+ testuser = BlogUser.objects.get(username='liangliangyy1') #shw 从数据库中获取刚创建的超级用户
#shw 使用client模拟登录
loginresult = self.client.login(
@@ -78,7 +79,7 @@ class AccountTest(TestCase):
0, len(
BlogUser.objects.filter(
email='user123@user.com')))
- self.client.post(reverse('account:register'), {
+ response = self.client.post(reverse('account:register'), {
'username': 'user1233',
'email': 'user123@user.com',
'password1': 'password123!q@wE#R$T',
diff --git a/src/DjangoBlog/accounts/utils.py b/src/DjangoBlog/accounts/utils.py
index 5d25076..f8372d8 100644
--- a/src/DjangoBlog/accounts/utils.py
+++ b/src/DjangoBlog/accounts/utils.py
@@ -49,7 +49,6 @@ def verify(email: str, code: str) -> typing.Optional[str]:
if cache_code != code:
#shw 如果不一致,返回一个翻译后的错误信息字符串
return gettext("Verification code error")
- return None
def set_code(email: str, code: str):
diff --git a/src/DjangoBlog/accounts/views.py b/src/DjangoBlog/accounts/views.py
index 462d60a..b878b50 100644
--- a/src/DjangoBlog/accounts/views.py
+++ b/src/DjangoBlog/accounts/views.py
@@ -1,6 +1,6 @@
#shw 导入日志模块
import logging
-
+from django.utils.translation import gettext_lazy as _
from django.conf import settings
#shw 导入Django的认证模块
from django.contrib import auth
diff --git a/src/DjangoBlog/blog/admin.py b/src/DjangoBlog/blog/admin.py
index cede537..58941c8 100644
--- a/src/DjangoBlog/blog/admin.py
+++ b/src/DjangoBlog/blog/admin.py
@@ -7,7 +7,7 @@ from django.utils.html import format_html
from django.utils.translation import gettext_lazy as _
# Register your models here.
-from .models import Article
+from .models import Article, Category, Tag, Links, SideBar, BlogSettings
# bjy: 为Article模型创建一个自定义的ModelForm
@@ -23,25 +23,25 @@ class ArticleForm(forms.ModelForm):
# bjy: 定义一个admin动作,用于将选中的文章发布
-def makr_article_publish(queryset):
+def makr_article_publish(modeladmin, request, queryset):
# bjy: 批量更新查询集中所有文章的状态为'p'(已发布)
queryset.update(status='p')
# bjy: 定义一个admin动作,用于将选中的文章设为草稿
-def draft_article(queryset):
+def draft_article(modeladmin, request, queryset):
# bjy: 批量更新查询集中所有文章的状态为'd'(草稿)
queryset.update(status='d')
# bjy: 定义一个admin动作,用于关闭选中文章的评论功能
-def close_article_commentstatus(queryset):
+def close_article_commentstatus(modeladmin, request, queryset):
# bjy: 批量更新查询集中所有文章的评论状态为'c'(关闭)
queryset.update(comment_status='c')
# bjy: 定义一个admin动作,用于开启选中文章的评论功能
-def open_article_commentstatus(queryset):
+def open_article_commentstatus(modeladmin, request, queryset):
# bjy: 批量更新查询集中所有文章的评论状态为'o'(开启)
queryset.update(comment_status='o')
diff --git a/src/DjangoBlog/blog/documents.py b/src/DjangoBlog/blog/documents.py
index f5f935a..f662223 100644
--- a/src/DjangoBlog/blog/documents.py
+++ b/src/DjangoBlog/blog/documents.py
@@ -232,26 +232,23 @@ class ArticleDocument(Document):
# bjy: 定义一个管理类,用于操作ArticleDocument索引
-class ArticleDocumentManager:
+class ArticleDocumentManager():
def __init__(self):
# bjy: 初始化时创建索引
self.create_index()
- @staticmethod
- def create_index():
+ def create_index(self):
# bjy: 创建'blog'索引
ArticleDocument.init()
- @staticmethod
- def delete_index():
+ def delete_index(self):
# bjy: 删除'blog'索引
from elasticsearch import Elasticsearch
es = Elasticsearch(settings.ELASTICSEARCH_DSL['default']['hosts'])
es.indices.delete(index='blog', ignore=[400, 404])
- @staticmethod
- def convert_to_doc(articles):
+ def convert_to_doc(self, articles):
# bjy: 将Django的Article查询集转换为ArticleDocument对象列表
return [
ArticleDocument(
@@ -285,8 +282,7 @@ class ArticleDocumentManager:
for doc in docs:
doc.save()
- @staticmethod
- def update_docs(docs):
+ def update_docs(self, docs):
# bjy: 更新一组文档
for doc in docs:
doc.save()
diff --git a/src/DjangoBlog/blog/management/commands/ping_baidu.py b/src/DjangoBlog/blog/management/commands/ping_baidu.py
index 90665f8..e35df7d 100644
--- a/src/DjangoBlog/blog/management/commands/ping_baidu.py
+++ b/src/DjangoBlog/blog/management/commands/ping_baidu.py
@@ -1,10 +1,10 @@
# bjy: 从Django核心管理模块导入BaseCommand基类,用于创建自定义管理命令
from django.core.management.base import BaseCommand
-from blog.models import Article, Tag, Category
from djangoblog.spider_notify import SpiderNotify
# bjy: 从项目工具模块导入get_current_site函数,用于获取当前站点域名等信息
from djangoblog.utils import get_current_site
+from blog.models import Article, Tag, Category
# bjy: 获取当前站点的域名,用于拼接完整URL
site = get_current_site().domain
diff --git a/src/DjangoBlog/blog/middleware.py b/src/DjangoBlog/blog/middleware.py
index b6899a9..16c9983 100644
--- a/src/DjangoBlog/blog/middleware.py
+++ b/src/DjangoBlog/blog/middleware.py
@@ -45,7 +45,7 @@ class OnlineMiddleware(object):
# bjy: 如果启用了Elasticsearch
if ELASTICSEARCH_ENABLED:
# bjy: 将耗时转换为毫秒并四舍五入
- time_taken = round(cast_time * 1000, 2)
+ time_taken = round((cast_time) * 1000, 2)
# bjy: 获取请求的URL路径
url = request.path
# bjy: 导入Django的时区工具
diff --git a/src/DjangoBlog/blog/migrations/0001_initial.py b/src/DjangoBlog/blog/migrations/0001_initial.py
index 525c125..3d391b6 100644
--- a/src/DjangoBlog/blog/migrations/0001_initial.py
+++ b/src/DjangoBlog/blog/migrations/0001_initial.py
@@ -1,9 +1,10 @@
# Generated by Django 4.1.7 on 2023-03-02 07:14
-import django.utils.timezone
-import mdeditor.fields
from django.conf import settings
from django.db import migrations, models
+import django.db.models.deletion
+import django.utils.timezone
+import mdeditor.fields
class Migration(migrations.Migration):
diff --git a/src/DjangoBlog/blog/migrations/0005_alter_article_options_alter_category_options_and_more.py b/src/DjangoBlog/blog/migrations/0005_alter_article_options_alter_category_options_and_more.py
index 398a9c7..d08e853 100644
--- a/src/DjangoBlog/blog/migrations/0005_alter_article_options_alter_category_options_and_more.py
+++ b/src/DjangoBlog/blog/migrations/0005_alter_article_options_alter_category_options_and_more.py
@@ -1,9 +1,10 @@
# Generated by Django 4.2.5 on 2023-09-06 13:13
-import django.utils.timezone
-import mdeditor.fields
from django.conf import settings
from django.db import migrations, models
+import django.db.models.deletion
+import django.utils.timezone
+import mdeditor.fields
class Migration(migrations.Migration):
diff --git a/src/DjangoBlog/blog/templatetags/blog_tags.py b/src/DjangoBlog/blog/templatetags/blog_tags.py
index eb0800f..024f2c8 100644
--- a/src/DjangoBlog/blog/templatetags/blog_tags.py
+++ b/src/DjangoBlog/blog/templatetags/blog_tags.py
@@ -1,5 +1,7 @@
+import hashlib
import logging
import random
+import urllib
from django import template
from django.conf import settings
@@ -12,11 +14,11 @@ from django.utils.safestring import mark_safe
from blog.models import Article, Category, Tag, Links, SideBar, LinkShowType
from comments.models import Comment
-from djangoblog.plugin_manage import hooks
from djangoblog.utils import CommonMarkdown, sanitize_html
from djangoblog.utils import cache
from djangoblog.utils import get_current_site
from oauth.models import OAuthUser
+from djangoblog.plugin_manage import hooks
logger = logging.getLogger(__name__)
@@ -166,7 +168,7 @@ def load_breadcrumb(article):
names = article.get_category_tree()
from djangoblog.utils import get_blog_setting
blogsetting = get_blog_setting()
- get_current_site().domain
+ site = get_current_site().domain
names.append((blogsetting.site_name, '/'))
names = names[::-1]
@@ -361,7 +363,7 @@ def load_article_detail(article, isindex, user):
# 返回用户头像URL
# 模板使用方法: {{ email|gravatar_url:150 }}
@register.filter
-def gravatar_url(email):
+def gravatar_url(email, size=40):
"""获得用户头像 - 优先使用OAuth头像,否则使用默认头像"""
cachekey = 'avatar/' + email
url = cache.get(cachekey)
@@ -398,7 +400,7 @@ def gravatar_url(email):
@register.filter
def gravatar(email, size=40):
"""获得用户头像HTML标签"""
- url = gravatar_url(email)
+ url = gravatar_url(email, size)
return mark_safe(
'
' %
(url, size, size))
diff --git a/src/DjangoBlog/blog/tests.py b/src/DjangoBlog/blog/tests.py
index 93c5b4d..57b07e3 100644
--- a/src/DjangoBlog/blog/tests.py
+++ b/src/DjangoBlog/blog/tests.py
@@ -34,7 +34,7 @@ class ArticleTest(TestCase):
# bjy: 定义一个测试方法,用于验证文章相关的功能
def test_validate_article(self):
- get_current_site().domain
+ site = get_current_site().domain
user = BlogUser.objects.get_or_create(
email="liangliangyy@gmail.com",
username="liangliangyy")[0]
@@ -47,8 +47,8 @@ class ArticleTest(TestCase):
# bjy: 测试用户详情页是否能正常访问
response = self.client.get(user.get_absolute_url())
self.assertEqual(response.status_code, 200)
- self.client.get('/admin/servermanager/emailsendlog/')
- self.client.get('admin/admin/logentry/')
+ response = self.client.get('/admin/servermanager/emailsendlog/')
+ response = self.client.get('admin/admin/logentry/')
s = SideBar()
s.sequence = 1
s.name = 'test'
@@ -160,8 +160,8 @@ class ArticleTest(TestCase):
# bjy: 测试获取Gravatar头像的模板标签
from blog.templatetags.blog_tags import gravatar_url, gravatar
- gravatar_url('liangliangyy@gmail.com')
- gravatar('liangliangyy@gmail.com')
+ u = gravatar_url('liangliangyy@gmail.com')
+ u = gravatar('liangliangyy@gmail.com')
# bjy: 创建并保存一个友情链接
link = Links(
diff --git a/src/DjangoBlog/blog/views.py b/src/DjangoBlog/blog/views.py
index 63d0f3d..617b99c 100644
--- a/src/DjangoBlog/blog/views.py
+++ b/src/DjangoBlog/blog/views.py
@@ -22,6 +22,7 @@ from haystack.views import SearchView
from blog.models import Article, Category, LinkShowType, Links, Tag
from comments.forms import CommentForm
from djangoblog.plugin_manage import hooks
+from djangoblog.plugin_manage.hook_constants import ARTICLE_CONTENT_HOOK_NAME
from djangoblog.utils import cache, get_blog_setting, get_sha256
# bjy: 获取一个名为__name__的logger实例,用于记录日志
@@ -72,11 +73,11 @@ class ArticleListView(ListView):
# bjy: 从缓存中获取数据集,如果缓存不存在则查询数据库并存入缓存
def get_queryset_from_cache(self, cache_key):
- """
+ '''
缓存页面数据
:param cache_key: 缓存key
:return:
- """
+ '''
value = cache.get(cache_key)
if value:
logger.info('get view cache.key:{key}'.format(key=cache_key))
@@ -90,10 +91,10 @@ class ArticleListView(ListView):
# bjy: 重写父类方法,从缓存中获取queryset
def get_queryset(self):
- """
+ '''
重写默认,从缓存获取数据
:return:
- """
+ '''
key = self.get_queryset_cache_key()
value = self.get_queryset_from_cache(key)
return value
@@ -106,9 +107,9 @@ class ArticleListView(ListView):
# bjy: 首页视图,继承自ArticleListView
class IndexView(ArticleListView):
- """
+ '''
首页
- """
+ '''
# 友情链接类型
link_type = LinkShowType.I
@@ -125,9 +126,9 @@ class IndexView(ArticleListView):
# bjy: 文章详情页视图
class ArticleDetailView(DetailView):
- """
+ '''
文章详情页面
- """
+ '''
template_name = 'blog/article_detail.html'
model = Article
pk_url_kwarg = 'article_id'
@@ -197,9 +198,9 @@ class ArticleDetailView(DetailView):
# bjy: 分类详情页视图
class CategoryDetailView(ArticleListView):
- """
+ '''
分类目录列表
- """
+ '''
page_type = "分类目录归档"
# bjy: 实现父类的抽象方法,获取分类下的文章数据
@@ -244,9 +245,9 @@ class CategoryDetailView(ArticleListView):
# bjy: 作者详情页视图
class AuthorDetailView(ArticleListView):
- """
+ '''
作者详情页
- """
+ '''
page_type = '作者文章归档'
# bjy: 实现父类的抽象方法,生成作者页的缓存键
@@ -274,9 +275,9 @@ class AuthorDetailView(ArticleListView):
# bjy: 标签详情页视图
class TagDetailView(ArticleListView):
- """
+ '''
标签列表页面
- """
+ '''
page_type = '分类标签归档'
# bjy: 实现父类的抽象方法,获取标签下的文章数据
@@ -310,9 +311,9 @@ class TagDetailView(ArticleListView):
# bjy: 文章归档页视图
class ArchivesView(ArticleListView):
- """
+ '''
文章归档页面
- """
+ '''
page_type = '文章归档'
# bjy: 归档页不分页
paginate_by = None
@@ -420,7 +421,7 @@ def page_not_found_view(
template_name='blog/error_page.html'):
if exception:
logger.error(exception)
- request.get_full_path()
+ url = request.get_full_path()
return render(request,
template_name,
{'message': _('Sorry, the page you requested is not found, please click the home page to see other?'),
@@ -451,6 +452,6 @@ def permission_denied_view(
# bjy: 清除缓存的视图
-def clean_cache_view():
+def clean_cache_view(request):
cache.clear()
return HttpResponse('ok')
diff --git a/src/DjangoBlog/comments/admin.py b/src/DjangoBlog/comments/admin.py
index 9a0e75a..54fea33 100644
--- a/src/DjangoBlog/comments/admin.py
+++ b/src/DjangoBlog/comments/admin.py
@@ -6,13 +6,13 @@ from django.utils.translation import gettext_lazy as _
# zy: 禁用评论状态 - 管理员动作函数,用于批量禁用评论
-def disable_commentstatus(queryset):
+def disable_commentstatus(modeladmin, request, queryset):
# zy: 将选中的评论集的is_enable字段更新为False(禁用)
queryset.update(is_enable=False)
# zy: 启用评论状态 - 管理员动作函数,用于批量启用评论
-def enable_commentstatus(queryset):
+def enable_commentstatus(modeladmin, request, queryset):
# zy: 将选中的评论集的is_enable字段更新为True(启用)
queryset.update(is_enable=True)
diff --git a/src/DjangoBlog/comments/migrations/0001_initial.py b/src/DjangoBlog/comments/migrations/0001_initial.py
index eec9566..61d1e53 100644
--- a/src/DjangoBlog/comments/migrations/0001_initial.py
+++ b/src/DjangoBlog/comments/migrations/0001_initial.py
@@ -1,8 +1,9 @@
# Generated by Django 4.1.7 on 2023-03-02 07:14
-import django.utils.timezone
from django.conf import settings
from django.db import migrations, models
+import django.db.models.deletion
+import django.utils.timezone
class Migration(migrations.Migration):
diff --git a/src/DjangoBlog/comments/migrations/0003_alter_comment_options_remove_comment_created_time_and_more.py b/src/DjangoBlog/comments/migrations/0003_alter_comment_options_remove_comment_created_time_and_more.py
index 6507ae1..a1ca970 100644
--- a/src/DjangoBlog/comments/migrations/0003_alter_comment_options_remove_comment_created_time_and_more.py
+++ b/src/DjangoBlog/comments/migrations/0003_alter_comment_options_remove_comment_created_time_and_more.py
@@ -1,8 +1,9 @@
# Generated by Django 4.2.5 on 2023-09-06 13:13
-import django.utils.timezone
from django.conf import settings
from django.db import migrations, models
+import django.db.models.deletion
+import django.utils.timezone
class Migration(migrations.Migration):
diff --git a/src/DjangoBlog/djangoblog/blog_signals.py b/src/DjangoBlog/djangoblog/blog_signals.py
index d331d76..779a267 100644
--- a/src/DjangoBlog/djangoblog/blog_signals.py
+++ b/src/DjangoBlog/djangoblog/blog_signals.py
@@ -45,7 +45,7 @@ send_email_signal = django.dispatch.Signal(
@receiver(send_email_signal)
-def send_email_signal_handler(**kwargs):
+def send_email_signal_handler(sender, **kwargs):
"""`xjj`
发送邮件信号的处理函数
@@ -85,7 +85,7 @@ def send_email_signal_handler(**kwargs):
@receiver(oauth_user_login_signal)
-def oauth_user_login_signal_handler(**kwargs):
+def oauth_user_login_signal_handler(sender, **kwargs):
"""`xjj`
OAuth 用户登录信号处理函数
@@ -109,8 +109,13 @@ def oauth_user_login_signal_handler(**kwargs):
@receiver(post_save)
def model_post_save_callback(
+ sender,
instance,
- update_fields):
+ created,
+ raw,
+ using,
+ update_fields,
+ **kwargs):
"""`xjj`
模型保存后的回调函数,用于处理缓存清理和搜索引擎通知等操作
@@ -166,7 +171,7 @@ def model_post_save_callback(
@receiver(user_logged_in)
@receiver(user_logged_out)
-def user_auth_callback(user):
+def user_auth_callback(sender, request, user, **kwargs):
if user and user.username:
logger.info(user)
delete_sidebar_cache()
diff --git a/src/DjangoBlog/djangoblog/elasticsearch_backend.py b/src/DjangoBlog/djangoblog/elasticsearch_backend.py
index c049ad2..f22ab2c 100644
--- a/src/DjangoBlog/djangoblog/elasticsearch_backend.py
+++ b/src/DjangoBlog/djangoblog/elasticsearch_backend.py
@@ -73,8 +73,7 @@ class ElasticSearchBackend(BaseSearchBackend):
docs = self._get_models(models)
self.manager.rebuild(docs)
- @staticmethod
- def _delete(models):
+ def _delete(self, models):
"""`xjj`
删除指定模型对象。
@@ -207,8 +206,7 @@ class ElasticSearchBackend(BaseSearchBackend):
class ElasticSearchQuery(BaseSearchQuery):
- @staticmethod
- def _convert_datetime(date):
+ def _convert_datetime(self, date):
"""`xjj`
将日期时间对象转换为字符串格式
diff --git a/src/DjangoBlog/djangoblog/feeds.py b/src/DjangoBlog/djangoblog/feeds.py
index 18e2dbb..cb5bcb3 100644
--- a/src/DjangoBlog/djangoblog/feeds.py
+++ b/src/DjangoBlog/djangoblog/feeds.py
@@ -36,8 +36,7 @@ class DjangoBlogFeed(Feed):
title = "且听风吟 大巧无工,重剑无锋. "
link = "/feed/"
- @staticmethod
- def author_name():
+ def author_name(self):
"""`xjj`
获取 RSS 订阅源的作者名称
@@ -47,8 +46,7 @@ class DjangoBlogFeed(Feed):
"""
return get_user_model().objects.first().nickname
- @staticmethod
- def author_link():
+ def author_link(self):
"""`xjj`
获取 RSS 订阅源作者的链接地址
@@ -58,8 +56,7 @@ class DjangoBlogFeed(Feed):
"""
return get_user_model().objects.first().get_absolute_url()
- @staticmethod
- def items():
+ def items(self):
"""`xjj`
获取 RSS 订阅源的文章列表
@@ -95,8 +92,7 @@ class DjangoBlogFeed(Feed):
"""
return CommonMarkdown.get_markdown(item.body)
- @staticmethod
- def feed_copyright():
+ def feed_copyright(self):
"""`xjj`
获取 RSS 订阅源的版权信息
diff --git a/src/DjangoBlog/djangoblog/plugin_manage/base_plugin.py b/src/DjangoBlog/djangoblog/plugin_manage/base_plugin.py
index e7e1ed6..df1ce0b 100644
--- a/src/DjangoBlog/djangoblog/plugin_manage/base_plugin.py
+++ b/src/DjangoBlog/djangoblog/plugin_manage/base_plugin.py
@@ -112,28 +112,23 @@ class BasePlugin:
"""渲染文章底部组件"""
return None
- @staticmethod
- def render_article_top_widget():
+ def render_article_top_widget(self, context, **kwargs):
"""渲染文章顶部组件"""
return None
- @staticmethod
- def render_header_widget():
+ def render_header_widget(self, context, **kwargs):
"""渲染页头组件"""
return None
- @staticmethod
- def render_footer_widget():
+ def render_footer_widget(self, context, **kwargs):
"""渲染页脚组件"""
return None
- @staticmethod
- def render_comment_before_widget():
+ def render_comment_before_widget(self, context, **kwargs):
"""渲染评论前组件"""
return None
- @staticmethod
- def render_comment_after_widget():
+ def render_comment_after_widget(self, context, **kwargs):
"""渲染评论后组件"""
return None
@@ -174,13 +169,11 @@ class BasePlugin:
"""获取插件JavaScript文件列表"""
return []
- @staticmethod
- def get_head_html():
+ def get_head_html(self, context=None):
"""获取需要插入到
中的HTML内容"""
return ""
- @staticmethod
- def get_body_html():
+ def get_body_html(self, context=None):
"""获取需要插入到底部的HTML内容"""
return ""
diff --git a/src/DjangoBlog/djangoblog/plugin_manage/loader.py b/src/DjangoBlog/djangoblog/plugin_manage/loader.py
index 096c1c1..ee750d0 100644
--- a/src/DjangoBlog/djangoblog/plugin_manage/loader.py
+++ b/src/DjangoBlog/djangoblog/plugin_manage/loader.py
@@ -1,6 +1,5 @@
-import logging
import os
-
+import logging
from django.conf import settings
logger = logging.getLogger(__name__)
diff --git a/src/DjangoBlog/djangoblog/settings.py b/src/DjangoBlog/djangoblog/settings.py
index 5a10d78..dfeaa74 100644
--- a/src/DjangoBlog/djangoblog/settings.py
+++ b/src/DjangoBlog/djangoblog/settings.py
@@ -15,6 +15,11 @@ from pathlib import Path
from django.utils.translation import gettext_lazy as _
+import environ
+from dotenv import load_dotenv
+
+load_dotenv()
+env = environ.Env()
def env_to_bool(env, default):
"""`xjj`
@@ -120,14 +125,17 @@ WSGI_APPLICATION = 'djangoblog.wsgi.application'
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
- 'NAME': os.environ.get('DJANGO_MYSQL_DATABASE') or 'djangoblog',
- 'USER': os.environ.get('DJANGO_MYSQL_USER') or 'root',
- 'PASSWORD': os.environ.get('DJANGO_MYSQL_PASSWORD') or 'root',
- 'HOST': os.environ.get('DJANGO_MYSQL_HOST') or '127.0.0.1',
+ 'NAME': env('DJANGO_MYSQL_DATABASE'),
+ 'USER': env('DJANGO_MYSQL_USER'),
+ 'PASSWORD': env('DJANGO_MYSQL_PASSWORD'),
+ 'HOST': env('DJANGO_MYSQL_HOST'),
'PORT': int(
- os.environ.get('DJANGO_MYSQL_PORT') or 3306),
+ env('DJANGO_MYSQL_PORT')),
'OPTIONS': {
- 'charset': 'utf8mb4'},
+ 'charset': 'utf8mb4',
+ 'ssl_mode': 'VERIFY_IDENTITY',
+ 'ssl': {'ca': env('DJANGO_MYSQL_SSL_CA')}
+ },
}}
# Password validation
diff --git a/src/DjangoBlog/djangoblog/sitemap.py b/src/DjangoBlog/djangoblog/sitemap.py
index 80dd4a8..4fc8b78 100644
--- a/src/DjangoBlog/djangoblog/sitemap.py
+++ b/src/DjangoBlog/djangoblog/sitemap.py
@@ -82,8 +82,7 @@ class ArticleSiteMap(Sitemap):
"""
return Article.objects.filter(status='p')
- @staticmethod
- def lastmod(obj):
+ def lastmod(self, obj):
"""`xjj`
获取指定文章对象的最后修改时间
@@ -118,8 +117,7 @@ class CategorySiteMap(Sitemap):
"""
return Category.objects.all()
- @staticmethod
- def lastmod(obj):
+ def lastmod(self, obj):
"""`xjj`
获取分类对象的最后修改时间
@@ -154,8 +152,7 @@ class TagSiteMap(Sitemap):
"""
return Tag.objects.all()
- @staticmethod
- def lastmod(obj):
+ def lastmod(self, obj):
"""`xjj`
获取指定标签对象的最后修改时间
@@ -193,8 +190,7 @@ class UserSiteMap(Sitemap):
"""
return list(set(map(lambda x: x.author, Article.objects.all())))
- @staticmethod
- def lastmod(obj):
+ def lastmod(self, obj):
"""`xjj`
获取指定用户对象的最后修改时间
diff --git a/src/DjangoBlog/djangoblog/spider_notify.py b/src/DjangoBlog/djangoblog/spider_notify.py
index 1032ff3..bfe1d09 100644
--- a/src/DjangoBlog/djangoblog/spider_notify.py
+++ b/src/DjangoBlog/djangoblog/spider_notify.py
@@ -26,7 +26,7 @@ from django.conf import settings
logger = logging.getLogger(__name__)
-class SpiderNotify:
+class SpiderNotify():
"""`xjj`
爬虫通知类,用于向搜索引擎提交 URL 通知
diff --git a/src/DjangoBlog/djangoblog/urls.py b/src/DjangoBlog/djangoblog/urls.py
index 11474cf..6a9e1de 100644
--- a/src/DjangoBlog/djangoblog/urls.py
+++ b/src/DjangoBlog/djangoblog/urls.py
@@ -13,16 +13,15 @@ Including another URLconf
1. Import the include() function: from django.conf.urls import url, include
2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
"""
-import time
-
from django.conf import settings
from django.conf.urls.i18n import i18n_patterns
from django.conf.urls.static import static
from django.contrib.sitemaps.views import sitemap
-from django.http import JsonResponse
from django.urls import path, include
from django.urls import re_path
from haystack.views import search_view_factory
+from django.http import JsonResponse
+import time
from blog.views import EsSearchView
from djangoblog.admin_site import admin_site
@@ -44,7 +43,7 @@ handler500 = 'blog.views.server_error_view'
handle403 = 'blog.views.permission_denied_view'
-def health_check():
+def health_check(request):
"""
健康检查接口
简单返回服务健康状态
diff --git a/src/DjangoBlog/djangoblog/utils.py b/src/DjangoBlog/djangoblog/utils.py
index 1294385..045264e 100644
--- a/src/DjangoBlog/djangoblog/utils.py
+++ b/src/DjangoBlog/djangoblog/utils.py
@@ -52,7 +52,7 @@ def get_max_articleid_commentid():
"""
from blog.models import Article
from comments.models import Comment
- return Article.objects.latest().pk, Comment.objects.latest().pk
+ return (Article.objects.latest().pk, Comment.objects.latest().pk)
def get_sha256(str):
@@ -138,14 +138,14 @@ def cache_decorator(expiration=3 * 60):
def expire_view_cache(path, servername, serverport, key_prefix=None):
- """
+ '''
刷新视图缓存
:param path:url路径
:param servername:host
:param serverport:端口
:param key_prefix:前缀
:return:是否成功
- """
+ '''
from django.http import HttpRequest
from django.utils.cache import get_cache_key
@@ -332,11 +332,11 @@ def get_blog_setting():
def save_user_avatar(url):
- """
+ '''
保存用户头像
:param url:头像url
:return: 本地路径
- """
+ '''
logger.info(url)
try:
@@ -418,7 +418,7 @@ ALLOWED_CLASSES = [
's1', 'ss', 'bp', 'vc', 'vg', 'vi', 'il'
]
-def class_filter(name, value):
+def class_filter(tag, name, value):
"""`xjj`
自定义 class 属性过滤器
diff --git a/src/DjangoBlog/djangoblog/whoosh_cn_backend.py b/src/DjangoBlog/djangoblog/whoosh_cn_backend.py
index 7d75681..ac6cd4e 100644
--- a/src/DjangoBlog/djangoblog/whoosh_cn_backend.py
+++ b/src/DjangoBlog/djangoblog/whoosh_cn_backend.py
@@ -29,11 +29,11 @@ import re
import shutil
import threading
import warnings
-from datetime import datetime
import six
from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
+from datetime import datetime
from django.utils.encoding import force_str
from haystack.backends import BaseEngine, BaseSearchBackend, BaseSearchQuery, EmptyResults, log_query
from haystack.constants import DJANGO_CT, DJANGO_ID, ID
@@ -155,7 +155,7 @@ class WhooshSearchBackend(BaseSearchBackend):
connections[self.connection_alias].get_unified_index().all_searchfields())
self.parser = QueryParser(self.content_field_name, schema=self.schema)
- if new_index:
+ if new_index is True:
self.index = self.storage.create_index(self.schema)
else:
try:
@@ -230,7 +230,7 @@ class WhooshSearchBackend(BaseSearchBackend):
raise SearchBackendError(
"No fields were found in any search_indexes. Please correct this before attempting to search.")
- return content_field_name, Schema(**schema_fields)
+ return (content_field_name, Schema(**schema_fields))
def update(self, index, iterable, commit=True):
"""`xjj`
@@ -389,8 +389,7 @@ class WhooshSearchBackend(BaseSearchBackend):
self.index = self.index.refresh()
self.index.optimize()
- @staticmethod
- def calculate_page(start_offset=0, end_offset=None):
+ def calculate_page(self, start_offset=0, end_offset=None):
"""`xjj`
根据偏移量计算分页信息。
@@ -699,7 +698,7 @@ class WhooshSearchBackend(BaseSearchBackend):
# Deferred models will have a different class ("RealClass_Deferred_fieldname")
# which won't be in our registry:
- model_instance._meta.concrete_model
+ model_klass = model_instance._meta.concrete_model
field_name = self.content_field_name
narrow_queries = set()
@@ -944,8 +943,7 @@ class WhooshSearchBackend(BaseSearchBackend):
spelling_suggestion = ' '.join(suggested_words)
return spelling_suggestion
- @staticmethod
- def _from_python(value):
+ def _from_python(self, value):
"""
Converts Python values to a string for Whoosh.
@@ -968,8 +966,7 @@ class WhooshSearchBackend(BaseSearchBackend):
value = force_str(value)
return value
- @staticmethod
- def _to_python(value):
+ def _to_python(self, value):
"""
Converts values from Whoosh to native Python values.
@@ -1021,8 +1018,7 @@ class WhooshSearchBackend(BaseSearchBackend):
class WhooshSearchQuery(BaseSearchQuery):
- @staticmethod
- def _convert_datetime(date):
+ def _convert_datetime(self, date):
"""`xjj`
将日期时间对象转换为 Whoosh 可识别的字符串格式。
@@ -1079,7 +1075,7 @@ class WhooshSearchQuery(BaseSearchQuery):
str: 构建好的查询片段字符串。
"""
from haystack import connections
- ''
+ query_frag = ''
is_datetime = False
if not hasattr(value, 'input_type_name'):
@@ -1124,7 +1120,7 @@ class WhooshSearchQuery(BaseSearchQuery):
'fuzzy': u'%s~',
}
- if not value.post_process:
+ if value.post_process is False:
query_frag = prepared_value
else:
if filter_type in [
@@ -1143,7 +1139,7 @@ class WhooshSearchQuery(BaseSearchQuery):
if isinstance(prepared_value, six.string_types):
possible_values = prepared_value.split(' ')
else:
- if is_datetime:
+ if is_datetime is True:
prepared_value = self._convert_datetime(
prepared_value)
@@ -1169,7 +1165,7 @@ class WhooshSearchQuery(BaseSearchQuery):
pv = self.backend._from_python(possible_value)
- if is_datetime:
+ if is_datetime is True:
pv = self._convert_datetime(pv)
if isinstance(pv, six.string_types) and not is_datetime:
@@ -1196,7 +1192,7 @@ class WhooshSearchQuery(BaseSearchQuery):
prepared_value = Exact(prepared_value).prepare(self)
query_frag = filter_types[filter_type] % prepared_value
else:
- if is_datetime:
+ if is_datetime is True:
prepared_value = self._convert_datetime(prepared_value)
query_frag = filter_types[filter_type] % prepared_value
diff --git a/src/DjangoBlog/oauth/admin.py b/src/DjangoBlog/oauth/admin.py
index 352856f..8d2976d 100644
--- a/src/DjangoBlog/oauth/admin.py
+++ b/src/DjangoBlog/oauth/admin.py
@@ -97,7 +97,6 @@ class OAuthUserAdmin(admin.ModelAdmin):
return format_html(
u'%s' %
(link, obj.author.nickname if obj.author.nickname else obj.author.email))
- return None
def show_user_image(self, obj):
"""lrj:
@@ -113,7 +112,7 @@ class OAuthUserAdmin(admin.ModelAdmin):
img = obj.picture # 获取头像URL
return format_html(
u'
' %
- img)
+ (img))
# 设置自定义方法在Admin中的显示名称
link_to_usermodel.short_description = '用户' # 关联用户列标题
diff --git a/src/DjangoBlog/oauth/migrations/0001_initial.py b/src/DjangoBlog/oauth/migrations/0001_initial.py
index 3497554..3aa3e03 100644
--- a/src/DjangoBlog/oauth/migrations/0001_initial.py
+++ b/src/DjangoBlog/oauth/migrations/0001_initial.py
@@ -1,8 +1,9 @@
# Generated by Django 4.1.7 on 2023-03-07 09:53
-import django.utils.timezone
from django.conf import settings
from django.db import migrations, models
+import django.db.models.deletion
+import django.utils.timezone
class Migration(migrations.Migration):
diff --git a/src/DjangoBlog/oauth/migrations/0002_alter_oauthconfig_options_alter_oauthuser_options_and_more.py b/src/DjangoBlog/oauth/migrations/0002_alter_oauthconfig_options_alter_oauthuser_options_and_more.py
index ba857da..d5cc70e 100644
--- a/src/DjangoBlog/oauth/migrations/0002_alter_oauthconfig_options_alter_oauthuser_options_and_more.py
+++ b/src/DjangoBlog/oauth/migrations/0002_alter_oauthconfig_options_alter_oauthuser_options_and_more.py
@@ -1,8 +1,9 @@
# Generated by Django 4.2.5 on 2023-09-06 13:13
-import django.utils.timezone
from django.conf import settings
from django.db import migrations, models
+import django.db.models.deletion
+import django.utils.timezone
class Migration(migrations.Migration):
diff --git a/src/DjangoBlog/oauth/migrations/0004_alter_oauthconfig_options.py b/src/DjangoBlog/oauth/migrations/0004_alter_oauthconfig_options.py
new file mode 100644
index 0000000..36b2e21
--- /dev/null
+++ b/src/DjangoBlog/oauth/migrations/0004_alter_oauthconfig_options.py
@@ -0,0 +1,17 @@
+# Generated by Django 5.2.7 on 2025-11-11 10:33
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('oauth', '0003_alter_oauthuser_nickname'),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(
+ name='oauthconfig',
+ options={'ordering': ['-creation_time'], 'verbose_name': 'OAuth配置', 'verbose_name_plural': 'OAuth配置'},
+ ),
+ ]
diff --git a/src/DjangoBlog/oauth/oauthmanager.py b/src/DjangoBlog/oauth/oauthmanager.py
index e8e598d..eb0c627 100644
--- a/src/DjangoBlog/oauth/oauthmanager.py
+++ b/src/DjangoBlog/oauth/oauthmanager.py
@@ -20,9 +20,9 @@ logger = logging.getLogger(__name__)
class OAuthAccessTokenException(Exception):
- """
+ '''
oauth授权失败异常
- """
+ '''
class BaseOauthManager(metaclass=ABCMeta):
@@ -113,8 +113,7 @@ class BaseOauthManager(metaclass=ABCMeta):
"""
pass
- @staticmethod
- def do_get(url, params, headers=None):
+ def do_get(self, url, params, headers=None):
"""lrj:
执行GET请求到第三方API
@@ -130,8 +129,7 @@ class BaseOauthManager(metaclass=ABCMeta):
logger.info(rsp.text) # lrj:记录响应日志
return rsp.text
- @staticmethod
- def do_post(url, params, headers=None):
+ def do_post(self, url, params, headers=None):
"""lrj:
执行POST请求到第三方API
@@ -364,7 +362,6 @@ class QQOauthManager(BaseOauthManager):
token = d['access_token']
self.access_token = token[0]
return token
- return None
else:
raise OAuthAccessTokenException(rsp)
@@ -383,7 +380,6 @@ class QQOauthManager(BaseOauthManager):
openid = str(obj['openid'])
self.openid = openid
return openid
- return None
def get_oauth_userinfo(self):
openid = self.get_open_id()
@@ -407,7 +403,6 @@ class QQOauthManager(BaseOauthManager):
if 'figureurl' in obj:
user.picture = str(obj['figureurl'])
return user
- return None
def get_picture(self, metadata):
datas = json.loads(metadata)
diff --git a/src/DjangoBlog/oauth/tests.py b/src/DjangoBlog/oauth/tests.py
index c822f6d..cf1bfb1 100644
--- a/src/DjangoBlog/oauth/tests.py
+++ b/src/DjangoBlog/oauth/tests.py
@@ -60,8 +60,7 @@ class OauthLoginTest(TestCase):
self.factory = RequestFactory() # lrj:请求工厂
self.apps = self.init_apps() # lrj:初始化所有OAuth应用配置
- @staticmethod
- def init_apps():
+ def init_apps(self):
"""lrj:初始化所有OAuth平台配置"""
# lrj:获取所有OAuth管理器子类并实例化
applications = [p() for p in BaseOauthManager.__subclasses__()]
@@ -79,7 +78,6 @@ class OauthLoginTest(TestCase):
for app in self.apps:
if app.ICON_NAME.lower() == type:
return app
- return None
@patch("oauth.oauthmanager.WBOauthManager.do_post")
@patch("oauth.oauthmanager.WBOauthManager.do_get")
@@ -90,7 +88,7 @@ class OauthLoginTest(TestCase):
assert weibo_app #lrj: 验证应用存在
# lrj:测试授权URL生成
- weibo_app.get_authorization_url()
+ url = weibo_app.get_authorization_url()
# lrj:模拟微博API响应
mock_do_post.return_value = json.dumps({"access_token": "access_token",
@@ -117,7 +115,7 @@ class OauthLoginTest(TestCase):
assert google_app # lrj:验证应用存在
# lrj:测试授权URL生成
- google_app.get_authorization_url()
+ url = google_app.get_authorization_url()
# lrj:模拟Google API响应
mock_do_post.return_value = json.dumps({
@@ -130,7 +128,7 @@ class OauthLoginTest(TestCase):
"sub": "sub",
"email": "email",
})
- google_app.get_access_token_by_code('code')
+ token = google_app.get_access_token_by_code('code')
userinfo = google_app.get_oauth_userinfo()
self.assertEqual(userinfo.token, 'access_token') # lrj:验证访问令牌
self.assertEqual(userinfo.openid, 'sub') # lrj:验证用户OpenID
@@ -156,7 +154,7 @@ class OauthLoginTest(TestCase):
"id": "id",
"email": "email",
})
- github_app.get_access_token_by_code('code')
+ token = github_app.get_access_token_by_code('code')
userinfo = github_app.get_oauth_userinfo()
self.assertEqual(userinfo.token, 'gho_16C7e42F292c6912E7710c838347Ae178B4a') # lrj:验证访问令牌
self.assertEqual(userinfo.openid, 'id') # lrj:验证用户OpenID
@@ -187,7 +185,7 @@ class OauthLoginTest(TestCase):
}
}
})
- facebook_app.get_access_token_by_code('code')
+ token = facebook_app.get_access_token_by_code('code')
userinfo = facebook_app.get_oauth_userinfo()
self.assertEqual(userinfo.token, 'access_token') # lrj:验证访问令牌
@@ -201,7 +199,7 @@ class OauthLoginTest(TestCase):
"openid": "openid",
}) # lrj:获取用户信息响应
])
- def test_qq_login(self):
+ def test_qq_login(self, mock_do_get):
"""lrj:测试QQ OAuth登录流程"""
# lrj:获取QQ OAuth应用
qq_app = self.get_app_by_type('qq')
@@ -212,7 +210,7 @@ class OauthLoginTest(TestCase):
self.assertTrue("qq.com" in url) # lrj:验证QQ域名
# lrj:测试获取访问令牌和用户信息(使用side_effect模拟多次调用)
- qq_app.get_access_token_by_code('code')
+ token = qq_app.get_access_token_by_code('code')
userinfo = qq_app.get_oauth_userinfo()
self.assertEqual(userinfo.token, 'access_token') # lrj:验证访问令牌
diff --git a/src/DjangoBlog/owntracks/migrations/0001_initial.py b/src/DjangoBlog/owntracks/migrations/0001_initial.py
index 19bfec2..9eee55c 100644
--- a/src/DjangoBlog/owntracks/migrations/0001_initial.py
+++ b/src/DjangoBlog/owntracks/migrations/0001_initial.py
@@ -1,7 +1,7 @@
# Generated by Django 4.1.7 on 2023-03-02 07:14
-import django.utils.timezone
from django.db import migrations, models
+import django.utils.timezone
class Migration(migrations.Migration):
diff --git a/src/DjangoBlog/owntracks/tests.py b/src/DjangoBlog/owntracks/tests.py
index 6c12be6..3b4b9d8 100644
--- a/src/DjangoBlog/owntracks/tests.py
+++ b/src/DjangoBlog/owntracks/tests.py
@@ -42,7 +42,7 @@ class OwnTrackLogTest(TestCase):
rsp = self.client.get('/owntracks/show_maps')
self.assertEqual(rsp.status_code, 302)
- BlogUser.objects.create_superuser(
+ user = BlogUser.objects.create_superuser(
email="liangliangyy1@gmail.com",
username="liangliangyy1",
password="liangliangyy1")
diff --git a/src/DjangoBlog/plugins/article_copyright/plugin.py b/src/DjangoBlog/plugins/article_copyright/plugin.py
index a51f128..5dba3b3 100644
--- a/src/DjangoBlog/plugins/article_copyright/plugin.py
+++ b/src/DjangoBlog/plugins/article_copyright/plugin.py
@@ -1,5 +1,5 @@
-from djangoblog.plugin_manage import hooks
from djangoblog.plugin_manage.base_plugin import BasePlugin
+from djangoblog.plugin_manage import hooks
from djangoblog.plugin_manage.hook_constants import ARTICLE_CONTENT_HOOK_NAME
@@ -14,8 +14,7 @@ class ArticleCopyrightPlugin(BasePlugin):
# 在这里将插件的方法注册到指定的钩子上
hooks.register(ARTICLE_CONTENT_HOOK_NAME, self.add_copyright_to_content)
- @staticmethod
- def add_copyright_to_content(content, **kwargs):
+ def add_copyright_to_content(self, content, *args, **kwargs):
"""
这个方法会被注册到 'the_content' 过滤器钩子上。
它接收原始内容,并返回添加了版权信息的新内容。
diff --git a/src/DjangoBlog/plugins/article_recommendation/plugin.py b/src/DjangoBlog/plugins/article_recommendation/plugin.py
index 05c4bb9..6656a07 100644
--- a/src/DjangoBlog/plugins/article_recommendation/plugin.py
+++ b/src/DjangoBlog/plugins/article_recommendation/plugin.py
@@ -1,9 +1,8 @@
import logging
-
-from blog.models import Article
-from djangoblog.plugin_manage import hooks
from djangoblog.plugin_manage.base_plugin import BasePlugin
+from djangoblog.plugin_manage import hooks
from djangoblog.plugin_manage.hook_constants import ARTICLE_DETAIL_LOAD
+from blog.models import Article
logger = logging.getLogger(__name__)
@@ -34,7 +33,7 @@ class ArticleRecommendationPlugin(BasePlugin):
"""注册钩子"""
hooks.register(ARTICLE_DETAIL_LOAD, self.on_article_detail_load)
- def on_article_detail_load(self, article, context):
+ def on_article_detail_load(self, article, context, request, *args, **kwargs):
"""文章详情页加载时的处理"""
# 可以在这里预加载推荐数据到context中
recommendations = self.get_recommendations(article)
@@ -195,8 +194,7 @@ class ArticleRecommendationPlugin(BasePlugin):
return valid_recommendations[:count]
- @staticmethod
- def get_popular_articles(count=3):
+ def get_popular_articles(self, count=3):
"""获取热门文章"""
return list(Article.objects.filter(
status='p'
diff --git a/src/DjangoBlog/plugins/external_links/plugin.py b/src/DjangoBlog/plugins/external_links/plugin.py
index 35456b3..5b2ef14 100644
--- a/src/DjangoBlog/plugins/external_links/plugin.py
+++ b/src/DjangoBlog/plugins/external_links/plugin.py
@@ -1,8 +1,7 @@
import re
from urllib.parse import urlparse
-
-from djangoblog.plugin_manage import hooks
from djangoblog.plugin_manage.base_plugin import BasePlugin
+from djangoblog.plugin_manage import hooks
from djangoblog.plugin_manage.hook_constants import ARTICLE_CONTENT_HOOK_NAME
@@ -15,8 +14,7 @@ class ExternalLinksPlugin(BasePlugin):
def register_hooks(self):
hooks.register(ARTICLE_CONTENT_HOOK_NAME, self.process_external_links)
- @staticmethod
- def process_external_links(content):
+ def process_external_links(self, content, *args, **kwargs):
from djangoblog.utils import get_current_site
site_domain = get_current_site().domain
diff --git a/src/DjangoBlog/plugins/image_lazy_loading/plugin.py b/src/DjangoBlog/plugins/image_lazy_loading/plugin.py
index 3c66728..b4b9e0a 100644
--- a/src/DjangoBlog/plugins/image_lazy_loading/plugin.py
+++ b/src/DjangoBlog/plugins/image_lazy_loading/plugin.py
@@ -1,9 +1,8 @@
-import hashlib
import re
+import hashlib
from urllib.parse import urlparse
-
-from djangoblog.plugin_manage import hooks
from djangoblog.plugin_manage.base_plugin import BasePlugin
+from djangoblog.plugin_manage import hooks
from djangoblog.plugin_manage.hook_constants import ARTICLE_CONTENT_HOOK_NAME
@@ -28,7 +27,7 @@ class ImageOptimizationPlugin(BasePlugin):
def register_hooks(self):
hooks.register(ARTICLE_CONTENT_HOOK_NAME, self.optimize_images)
- def optimize_images(self, content):
+ def optimize_images(self, content, *args, **kwargs):
"""
优化文章中的图片标签
"""
@@ -64,8 +63,7 @@ class ImageOptimizationPlugin(BasePlugin):
return optimized_content
- @staticmethod
- def _parse_img_attributes(attr_string):
+ def _parse_img_attributes(self, attr_string):
"""
解析 img 标签的属性
"""
@@ -152,8 +150,7 @@ class ImageOptimizationPlugin(BasePlugin):
return attrs
- @staticmethod
- def _build_img_tag(attrs):
+ def _build_img_tag(self, attrs):
"""
重新构建 img 标签
"""
@@ -170,8 +167,7 @@ class ImageOptimizationPlugin(BasePlugin):
return f'
'
- @staticmethod
- def _get_current_domain():
+ def _get_current_domain(self):
"""
获取当前网站域名
"""
diff --git a/src/DjangoBlog/plugins/reading_time/plugin.py b/src/DjangoBlog/plugins/reading_time/plugin.py
index 4d3a6ad..4b929d8 100644
--- a/src/DjangoBlog/plugins/reading_time/plugin.py
+++ b/src/DjangoBlog/plugins/reading_time/plugin.py
@@ -1,8 +1,7 @@
import math
import re
-
-from djangoblog.plugin_manage import hooks
from djangoblog.plugin_manage.base_plugin import BasePlugin
+from djangoblog.plugin_manage import hooks
from djangoblog.plugin_manage.hook_constants import ARTICLE_CONTENT_HOOK_NAME
@@ -15,8 +14,7 @@ class ReadingTimePlugin(BasePlugin):
def register_hooks(self):
hooks.register(ARTICLE_CONTENT_HOOK_NAME, self.add_reading_time)
- @staticmethod
- def add_reading_time(content, **kwargs):
+ def add_reading_time(self, content, *args, **kwargs):
"""
计算阅读时间并添加到内容开头。
只在文章详情页显示,首页(文章列表页)不显示。
diff --git a/src/DjangoBlog/plugins/seo_optimizer/plugin.py b/src/DjangoBlog/plugins/seo_optimizer/plugin.py
index c3df658..de12c15 100644
--- a/src/DjangoBlog/plugins/seo_optimizer/plugin.py
+++ b/src/DjangoBlog/plugins/seo_optimizer/plugin.py
@@ -1,10 +1,9 @@
import json
-
from django.utils.html import strip_tags
-
-from blog.models import Article, Category
-from djangoblog.plugin_manage import hooks
+from django.template.defaultfilters import truncatewords
from djangoblog.plugin_manage.base_plugin import BasePlugin
+from djangoblog.plugin_manage import hooks
+from blog.models import Article, Category, Tag
from djangoblog.utils import get_blog_setting
@@ -17,8 +16,7 @@ class SeoOptimizerPlugin(BasePlugin):
def register_hooks(self):
hooks.register('head_meta', self.dispatch_seo_generation)
- @staticmethod
- def _get_article_seo_data(context, request, blog_setting):
+ def _get_article_seo_data(self, context, request, blog_setting):
article = context.get('article')
if not isinstance(article, Article):
return None
@@ -63,8 +61,7 @@ class SeoOptimizerPlugin(BasePlugin):
"json_ld": structured_data
}
- @staticmethod
- def _get_category_seo_data(context, request, blog_setting):
+ def _get_category_seo_data(self, context, request, blog_setting):
category_name = context.get('tag_name')
if not category_name:
return None
@@ -95,8 +92,7 @@ class SeoOptimizerPlugin(BasePlugin):
"json_ld": structured_data
}
- @staticmethod
- def _get_default_seo_data(request, blog_setting):
+ def _get_default_seo_data(self, context, request, blog_setting):
# Homepage and other default pages
structured_data = {
"@context": "https://schema.org",
@@ -133,7 +129,7 @@ class SeoOptimizerPlugin(BasePlugin):
seo_data = self._get_category_seo_data(context, request, blog_setting)
if not seo_data:
- seo_data = self._get_default_seo_data(request, blog_setting)
+ seo_data = self._get_default_seo_data(context, request, blog_setting)
json_ld_script = f''
diff --git a/src/DjangoBlog/plugins/view_count/plugin.py b/src/DjangoBlog/plugins/view_count/plugin.py
index 5d02b4f..15e9d94 100644
--- a/src/DjangoBlog/plugins/view_count/plugin.py
+++ b/src/DjangoBlog/plugins/view_count/plugin.py
@@ -1,5 +1,5 @@
-from djangoblog.plugin_manage import hooks
from djangoblog.plugin_manage.base_plugin import BasePlugin
+from djangoblog.plugin_manage import hooks
class ViewCountPlugin(BasePlugin):
@@ -11,8 +11,7 @@ class ViewCountPlugin(BasePlugin):
def register_hooks(self):
hooks.register('after_article_body_get', self.record_view)
- @staticmethod
- def record_view(article):
+ def record_view(self, article, *args, **kwargs):
article.viewed()
diff --git a/src/DjangoBlog/requirements.txt b/src/DjangoBlog/requirements.txt
index e5878ab..7f0cd8e 100644
Binary files a/src/DjangoBlog/requirements.txt and b/src/DjangoBlog/requirements.txt differ
diff --git a/src/DjangoBlog/servermanager/api/blogapi.py b/src/DjangoBlog/servermanager/api/blogapi.py
index 5fe3249..8a4d6ac 100644
--- a/src/DjangoBlog/servermanager/api/blogapi.py
+++ b/src/DjangoBlog/servermanager/api/blogapi.py
@@ -14,8 +14,7 @@ class BlogApi:
sqs = sqs.load_all()
return sqs[:self.__max_takecount__]
- @staticmethod
- def get_category_lists():
+ def get_category_lists(self):
return Category.objects.all()
def get_category_articles(self, categoryname):
diff --git a/src/DjangoBlog/servermanager/api/commonapi.py b/src/DjangoBlog/servermanager/api/commonapi.py
index ccc9de4..83ad9ff 100644
--- a/src/DjangoBlog/servermanager/api/commonapi.py
+++ b/src/DjangoBlog/servermanager/api/commonapi.py
@@ -44,8 +44,7 @@ class CommandHandler:
else:
return "未找到相关命令,请输入hepme获得帮助。"
- @staticmethod
- def __run_command__(cmd):
+ def __run_command__(self, cmd):
try:
res = os.popen(cmd).read()
return res
diff --git a/src/DjangoBlog/servermanager/robot.py b/src/DjangoBlog/servermanager/robot.py
index 6801bc6..7b45736 100644
--- a/src/DjangoBlog/servermanager/robot.py
+++ b/src/DjangoBlog/servermanager/robot.py
@@ -47,7 +47,7 @@ def convert_to_article_reply(articles, message):
@robot.filter(re.compile(r"^\?.*"))
-def search(message):
+def search(message, session):
s = message.content
searchstr = str(s).replace('?', '')
result = blogapi.search_articles(searchstr)
@@ -60,14 +60,14 @@ def search(message):
@robot.filter(re.compile(r'^category\s*$', re.I))
-def category():
+def category(message, session):
categorys = blogapi.get_category_lists()
content = ','.join(map(lambda x: x.name, categorys))
return '所有文章分类目录:' + content
@robot.filter(re.compile(r'^recent\s*$', re.I))
-def recents(message):
+def recents(message, session):
articles = blogapi.get_recent_articles()
if articles:
reply = convert_to_article_reply(articles, message)
@@ -77,7 +77,7 @@ def recents(message):
@robot.filter(re.compile('^help$', re.I))
-def help():
+def help(message, session):
return '''欢迎关注!
默认会与图灵机器人聊天~~
你可以通过下面这些命令来获得信息
@@ -99,12 +99,12 @@ def help():
@robot.filter(re.compile(r'^weather\:.*$', re.I))
-def weather():
+def weather(message, session):
return "建设中..."
@robot.filter(re.compile(r'^idcard\:.*$', re.I))
-def idcard():
+def idcard(message, session):
return "建设中..."
@@ -123,7 +123,7 @@ class MessageHandler:
try:
info = session[userid]
self.userinfo = jsonpickle.decode(info)
- except Exception:
+ except Exception as e:
userinfo = WxUserInfo()
self.userinfo = userinfo
@@ -179,7 +179,7 @@ class MessageHandler:
return ChatGPT.chat(info)
-class WxUserInfo:
+class WxUserInfo():
def __init__(self):
self.isAdmin = False
self.isPasswordSet = False
diff --git a/src/DjangoBlog/servermanager/tests.py b/src/DjangoBlog/servermanager/tests.py
index fb856c4..22a6689 100644
--- a/src/DjangoBlog/servermanager/tests.py
+++ b/src/DjangoBlog/servermanager/tests.py
@@ -1,4 +1,5 @@
from django.test import Client, RequestFactory, TestCase
+from django.utils import timezone
from werobot.messages.messages import TextMessage
from accounts.models import BlogUser
@@ -41,10 +42,10 @@ class ServerManagerTest(TestCase):
article.save()
s = TextMessage([])
s.content = "nice"
- search(s)
- rsp = category()
+ rsp = search(s, None)
+ rsp = category(None, None)
self.assertIsNotNone(rsp)
- rsp = recents(None)
+ rsp = recents(None, None)
self.assertTrue(rsp != '暂时还没有文章')
cmd = commands()