过滤并验证django http请求的响应内容

时间:2011-11-24 12:47:21

标签: python django httprequest httpresponse

以下django中间件函数用于标识django响应对象中的活动链接。如果链接处于活动状态,则标记为css类,href属性将替换为javascript:void(null);。使用此函数,返回语句之前的最后两行是如此之慢,以至于我无法使用它,此外,不会呈现css,js和图像。但是,如果我将这两个调用放入for循环中,一切都很好而且快速。但是,我不希望为页面上的每个活动链接执行这两个调用,而是我希望它们只执行一次,但这不起作用,我真的不知道为什么以及for循环与它有什么关系。它没有BeautifulSoup问题,因为它与re.sub('\s+','',response.content)或替换函数相同。据我调查过,我可以告诉你,return语句之前的最后一行是慢的,只要它不在for循环中执行。我对可能的解释感到非常兴奋。

import re  
from django_projects.projects.my_project.settings import SITE_NAME  
from BeautifulSoup import BeautifulSoup  

class PostRender():  
    def process_response(self, request, response):  
        link_pattern=re.compile('<a.*href="(http://%s)*%s".*>' % (SITE_NAME,request.path),re.IGNORECASE) 
        klass_pattern=re.compile('class="[^"]*"',re.IGNORECASE)  
        href_pattern=re.compile('href="(http://%s)*%s(\?.*)*"' % (SITE_NAME,request.path),re.IGNORECASE)  
        #find all active links
        search=re.finditer(link_pattern ,response.content)  
        for res in search:  
            result=res.group()  
            klassname='class="active"'  
            if 'class' in result:  
                klass=re.search(klass_pattern,result).group().split('=')[1]  
                if len(klass) != 0:  
                    klassname='class="%s %s"' % (klass[1:-1],'active')  
            link=re.sub(href_pattern,'href="javascript:void(null);"',re.sub(klass_pattern,klassname,result))  
            response.content=re.sub(result,link,response.content)  
        soup=BeautifulSoup(response.content)  
        response.content=soup.prettify()  
        return response  

0 个答案:

没有答案