Django中自定义中间件模块--自动搜索stackoveflow答案

Django的中间件MIDDLEWARE的分类:

请求期间:

process_request(request)
process_view(request, view_func, view_args, view_kwargs)

返回期间:

process_exception(request, exception) (only if the view raised an exception)
process_template_response(request, response) (only for template responses)
process_response(request, response)

如果需要自定义,在MIDDLEWARE_CLASSES中添加对应路径的文件即可

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.security.SecurityMiddleware',
    
    // 自定义Middleware方法
    'app_name.middleware.StackOverflowMiddleware',
)

需求场景

在平时django开发调试中,会遇到这样那样的exception报错,我们自定义一个简单的中间件,django的自定义步骤很简单,实现process_exception方法即可

根据exception的name和信息,调用stackoveflow的接口,当debug报错时自动搜索相关的答案,节省一些时间,实现起来很简单

备注:仅为介绍思路,线上代码不要这么使用

代码实现

app目录下 middleware.py文件

import requests
from django.conf import settings

class StackOverflowMiddleware(object):
    def process_exception(self, request, exception):
        if settings.DEBUG:
            intitle = u'{}: {}'.format(exception.__class__.__name__,  exception.message)
            url = 'https://api.stackexchange.com/2.2/search'
            params = {
                'order': 'desc',
                'sort': 'votes',
                'site': 'stackoverflow',
                'pagesize': 3,
                'tagged': 'python;django',
                'intitle': intitle
            }
            r = requests.get(url, params=params)
            questions = r.json()
            if len(questions['items']) > 0:
                print '\nThe stackoverflow answer top 3 is :\n'
                for question in questions['items'][:3]:
                    print '\n'
                    print question['title']
                    print question['link'] + '\n'
            else :
                print '\nstackoverflow answer not found\n'

        return None

效果如下:

demo.png

Django版本:1.9.4
python版本:2.7.6
调试时,settings.DEBUG处于开启模式

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 中间件是 Django 用来处理请求和响应的钩子框架。它是一个轻量级的、底层级的“插件”系统,用于全局性地控制Dj...
    liujiangblog阅读 5,084评论 0 4
  • Django 文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质。交流群:467338606网站:h...
    布客飞龙阅读 4,160评论 0 37
  • 中间件是一个钩子框架,它们可以介入Django 的请求和响应处理过程。它是一个轻量级、底层的“插件”系统,用于在全...
    低吟浅唱1990阅读 3,505评论 0 0
  • 目录 一、中间件简介 在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合...
    CaiGuangyin阅读 4,256评论 0 3
  • 打算开始来这里写日记,坚持记录📝 今天一整天都很苦闷,这种糟糕的状态持续到晚上才稍有好转。晚上跟姐姐打了通视频电话...
    臭星子Carrie阅读 2,087评论 0 0

友情链接更多精彩内容