Python拒绝文本。替换()在一个环境中

2024-10-02 16:31:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在嘲笑pylons应用程序的以下一些肮脏的支持代码,它可以在pythonshell、单独的python文件或在paster中运行时工作。现在,我们通过mod wsgi和apache将应用程序联机,这段特定的代码完全停止工作。首先,代码本身:

def fixStyle(self, text):
    t = text.replace('<p>', '<p style="%s">' % (STYLEDEF,))
    t = t.replace('class="wide"', 'style="width: 125px; %s"' % (STYLEDEF,))
    t = t.replace('<td>', '<td style="%s">' % (STYLEDEF,))
    t = t.replace('<a ', '<a style="%s" ' % (LINKSTYLE,))
    return t

这看起来很简单,说实话,确实如此。所以当我把一段文字放进去时会发生什么,例如:

^{pr2}$

输出应为:

<table><tr><td style="stuff-from-styledef">Test!</td></tr></table>

在大多数系统上都是这样。但是,当我们在Apache/mod_wsgi上通过应用程序时,会发生以下情况:

^{pr2}$

你猜对了。在

我把日志记录放在输出文本的开始,并在输出原始文本和t变量的末尾。它显示了我在这里展示的内容:在大多数系统上t是更改的,在apache环境中则不是这样

当然,我确保在每次更改之后重新启动apache(让它重新加载.py文件),并且它反映在日志输出中。在

我现在不知所措,不知道下一步该怎么办。谷歌搜索并不是真的有效,所以我希望你们能帮忙,也许能指出一个根本的问题,使用任何引起这种情况的东西。在

如果有遗漏,我会把它编辑进去。在


Tags: 文件代码textmod应用程序wsgistyleapache
3条回答

我不知道您的问题是什么,但是我发现重复replace()不是一件好事:如果这四个模式都在字符串中,那么将有4次创建一个新的字符串。在

在我看来,这应该更好:

def fixStyle(self, text):
    t = text.replace('<p>', '<p style="%s">' % (STYLEDEF,))
    t = t.replace('class="wide"', 'style="width: 125px; %s"' % (STYLEDEF,))
    t = t.replace('<td>', '<td style="%s">' % STYLEDEF)
    t = t.replace('<a ', '<a style="%s" ' % (LINKSTYLE,))
    return t

import re

STYLEDEF = 'stuff-from-styledef'
LINKSTYLE = 'VVVV'

def aux(m, dic = {'<p':('<p style="',STYLEDEF),
                  '<td':('<td style="',STYLEDEF),
                  'class="wide"':('style="width: 125px; ',STYLEDEF),
                  '<a':('<a style="',LINKSTYLE)} ):

    return '%s%s"' % dic[m.group()]

pat = re.compile('<p(?=>)>|class="wide"|<td(?=>)|<a(?= )')

ch = '<table><tr><td>Test!</td></tr></table><a type="brown" >'
print ch
print fixStyle(None, ch)
print pat.sub(aux,ch)

结果

^{pr2}$

我认为re.sub()只对字符串执行一次替换。在

用默认参数定义参数dic=>;在aux()的定义中,该值被分配给dic,然后不再改变。在每次调用时,没有从外部级别将参数传递给dic:值保存在函数内部。在

另外,函数aux()不需要在函数外搜索STYLEDEF和LINKSTYLE的值。在

所有这些都会提高执行速度。在

一。在

编辑: 由于' style="'STYLEDEF对于要返回的几个结果是常见的,所以我试图缩短它们的列表,我发现

def aux(m, dic = {'<p'          :'<p style="%s"',
                  '<td'         :'<td style="%s"',
                  'class="wide"':'style="width: 125px; %s"'} ):
    if m.group(1):
        return '<a style="%s"' % LINKSTYLE
    else:
        return dic[m.group()] % STYLEDEF

pat = re.compile('<p(?=>)|class="wide"|<td(?=>)|(<a)(?= )')

为了去掉条件行,我写了前面的解决方案,我不知道为什么,我停在那里。解决方案的兴趣在于编写正则表达式字符串和断言,允许编写johnmachin的解决方案,但是我用这些oafish元组污染了它。在

还有一种解决方案:

def aux(m, STY = STYLEDEF,LIN = LINKSTYLE ):
    return ( 'style="width: 125px; ' if m.group(3) else m.group(1)+' style="' ) + \
           ( LIN if m.group(2) else STY) + '"'   

pat = re.compile('(<p(?=>)|<td(?=>)|(<a(?= )))|(class="wide")')

但更清晰、更简单的解决方案是,正如John Machin所注意到的:

def aux(m, dic = {'<p' :'<p style="%s"' % STYLEDEF,
                  '<td':'<td style="%s"' % STYLEDEF,
                  '<a' :'<a style="%s"' % LINKSTYLE,
                  'class="wide"':'style="%s"' % ('width: 125px; '+STYLEDEF) } ):
    return dic[m.group()] 

pat = re.compile('<p(?=>)|class="wide"|<td(?=>)|<a(?= )')

dic中的值仅在执行函数aux()的定义时计算。在

实际上,它非常接近replace()函数的参数。在

添加一些打印语句并检查Apache日志:

def fixStyle(self, text):
    print "text:", text
    print "STYLEDEF", STYLEDEF
    t = text.replace('<p>', '<p style="%s">' % (STYLEDEF,))
    print "t:", t

抱歉,但是:没有提到repr()的调试描述是不可信的。确保您正在记录repr(text)repr(t),而不是text和{}。在

在同一数据段上运行非工作环境和至少一个工作环境,然后编辑问题以显示您使用的实际代码和实际的日志输出。在

相关问题 更多 >