以下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