Python 过滤和预处理django http请求的响应内容
以下django中间件函数用于标识django响应对象中的活动链接。如果链接处于活动状态,则其标记为css类,href属性将替换为javascript:voidnull;。使用此函数时,return语句前的最后两行非常慢,我无法使用它,而且,没有呈现css、js和图像。但是,如果我将这两个调用放入for循环,那么一切都很好,速度也很快。但是,我不希望对页面上的每个活动链接执行这两个调用,相反,我希望它们只执行一次,但这不起作用,我真的不明白for循环与此有什么关系。它没有美化组的问题,因为它与re.sub“\s+”、response.content或replace函数相同。就我所研究的而言,我可以告诉您,return语句之前的最后一行是慢行,只要它不是在for循环中执行的。对于可能的解释我真的很兴奋Python 过滤和预处理django http请求的响应内容,python,django,httprequest,httpresponse,Python,Django,Httprequest,Httpresponse,以下django中间件函数用于标识django响应对象中的活动链接。如果链接处于活动状态,则其标记为css类,href属性将替换为javascript:voidnull;。使用此函数时,return语句前的最后两行非常慢,我无法使用它,而且,没有呈现css、js和图像。但是,如果我将这两个调用放入for循环,那么一切都很好,速度也很快。但是,我不希望对页面上的每个活动链接执行这两个调用,相反,我希望它们只执行一次,但这不起作用,我真的不明白for循环与此有什么关系。它没有美化组的问题,因为它与r
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
为什么不使用BeautifulSoup查找和替换链接?它比正则表达式更适合这种情况?谢谢你的提示,我刚刚读了一篇教程,解释了这种汤的东西,太棒了!为什么不使用BeautifulSoup查找和替换链接?它比正则表达式更适合这种情况?谢谢你的提示,我刚刚读了一篇教程,解释了这种汤的东西,太棒了!