如何避免在 Django 中重复相同的代码块?

问题描述 投票:0回答:1

我的 4 个函数中有相同的代码块,有什么方法可以避免重复相同的代码块吗?

这是相同的代码块:

def function_name():
    ...some code...
    hot_news_48h = h_mostViewed(48, News, '-pv')
    hot_news_1w = w_mostViewed(1, News, '-pv')
    ...some code...

return render(request, "template_name.html", {
         ...some code...
        'hot_news_48h': hot_news_48h,
        'hot_news_1w': hot_news_1w,

         ...some code...

    })

这是函数1:

def newsDetailView(request, news_pk):
    news = get_object_or_404(News, id=news_pk)
    tags = news.tag.annotate(news_count=Count('news'))
    News.objects.filter(id=news_pk).update(pv=F('pv') + 1)

    hot_news_48h = h_mostViewed(48, News, '-pv')
    hot_news_1w = w_mostViewed(1, News, '-pv')

    relative_news = News.objects.filter(tag__id__in=news.tag.all()).exclude(id=news_pk)[:6]

    return render(request, "news_detail.html", {
        'news': news,
        'tags': tags,

        'hot_news_48h': hot_news_48h,
        'hot_news_1w': hot_news_1w,

        'relative_news': relative_news
    })

这是函数2:

def tagNewsList(request, tag_pk):
    tag = get_object_or_404(Tag, pk=tag_pk)
    news_list = News.objects.filter(tag=tag)

    hot_news_48h = h_mostViewed(48, News, '-pv')
    hot_news_1w = w_mostViewed(1, News, '-pv')


    return render(request, "tags_list.html", {
        'news_list': news_list,
        'tag': tag,

        'hot_news_48h': hot_news_48h,
        'hot_news_1w': hot_news_1w,

    })

有朋友知道如何避免吗?非常感谢!

python django django-templates django-views
1个回答
1
投票

在 Django 中,您可以选择通过使用接受相关信息作为参数的自定义函数来构造响应。然后,此函数可以通过合并您希望包含的任何重复代码块来组装最终响应。下面是一个基本框架,说明了如何实施这种方法。

  1. 创建文件:定义修改响应的函数。

  2. 将函数导入到 Django 的视图文件中,并在所需的函数中调用它。

这是一个示例实现:

# custom_response.py

def makeResponse(request, html_name, data_dict, News):
    data_dict['hot_news_48h'] = h_mostViewed(48, News, '-pv')
    data_dict['hot_news_1w'] = w_mostViewed(1, News, '-pv')
    return render(request, html_name, data_dict)

接下来将函数导入到 Django 的视图文件中,并在所需的函数中调用它。

# Views file
from 'utils.custom_response' import makeResponse

# function 1
def newsDetailView(request, news_pk):
    news = get_object_or_404(News, id=news_pk)
    tags = news.tag.annotate(news_count=Count('news'))
    News.objects.filter(id=news_pk).update(pv=F('pv') + 1)

    relative_news = News.objects.filter(tag__id__in=news.tag.all()).exclude(id=news_pk)[:6]

    return makeResponse(request, "news_detail.html", {
        'news': news,
        'tags': tags,
        'relative_news': relative_news
    }, News)


# function 2
def tagNewsList(request, tag_pk):
    tag = get_object_or_404(Tag, pk=tag_pk)
    news_list = News.objects.filter(tag=tag)

    hot_news_48h = h_mostViewed(48, News, '-pv')
    hot_news_1w = w_mostViewed(1, News, '-pv')


    return makeResponse(request, "tags_list.html", {
        'news_list': news_list,
        'tag': tag,
    }, News)

'utils.custom_response'
替换为函数的适当导入路径。

您也可以将此类功能添加到帖子中。

如果您想为大多数 API 设置此项,那么最好在 Django 中间件中设置。

在 Django 中,您可以通过实现拦截响应并添加所需代码的中间件类来使用中间件修改响应。以下是如何实现这一目标的总体概述:

  1. 创建中间件类:使用修改响应的

    process_response
    方法定义中间件类。

  2. 注册中间件:将中间件类添加到 Django 项目设置文件中的

    MIDDLEWARE
    设置中。

这是一个示例实现:

# custom_middleware.py

class CustomMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # Code to execute before the view is called
        response = self.get_response(request)
        # Code to execute after the view is called
        return response

    def process_response(self, request, response):
        # Add your code to modify the response here
        response["X-My-Header"] = "My Custom Value"
        return response

在此示例中,

process_response
方法用于修改响应。它将自定义标头“X-My-Header”添加到响应中。

接下来,在 Django 设置中注册您的中间件:

# settings.py

MIDDLEWARE = [
    # Other middleware classes...
    'myapp.custom_middleware.CustomMiddleware',
]

'myapp.custom_middleware.CustomMiddleware'
替换为中间件类的适当导入路径。

添加中间件后,Django 将为视图生成的每个响应自动调用其

process_response
方法,允许您根据需要修改响应。

© www.soinside.com 2019 - 2024. All rights reserved.