Следующая функция промежуточного программного обеспечения 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