Фильтрация и отображение содержимого ответа http-запроса django - PullRequest
2 голосов
/ 24 ноября 2011

Следующая функция промежуточного программного обеспечения django используется для идентификации активных ссылок в объекте ответа django. Если ссылка активна, она помечается классом css и атрибут href заменяется на javascript:void(null);. Используя эту функцию, последние две строки перед оператором return настолько медленны, что я не могу ее использовать, кроме того, никакие 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  
...