覆盖Django第三方库模板标记以修复UnicodeEncodeError

时间:2018-06-26 15:16:29

标签: django django-templates

我正在我的Django项目中使用精益第三方Django google analytics库。这样可以通过在每个页面请求上加载像素图像来实现服务器端跟踪。

在此特定项目中,存在一些网址格式,其中可能包含特殊的(非ASCII)字符。例如。 example.com/user/яαχєя

当遇到上述uri(从iri开始)时,所述库失败并显示以下错误:

  

'ascii'编解码器无法在位置6-10处编码字符:序号不在   范围(128)

我偷看了第三方库的相关代码-它实际上是我项目中包含的模板标记,如下所示:

{% load google_analytics_tags %}
<img src="{% google_analytics %}" width="1" height="1"/>

在代码中,库的模板标记执行以下操作(摘录):

from six.moves.urllib.parse import urlparse

@register.simple_tag(takes_context=True)
def google_analytics(context, tracking_code=None, debug=False):
    request = context.get('request', None)
    path = request.path
    parsed_url = urlparse(path)
    """
    Some more processing comes here
    """
    return url

parsed_url = urlparse(path)本质上是发生问题的地方。我觉得这里的快速修复/猴子补丁只是编辑parsed_url = urlparse(path.encode('utf-8'))

但是,如何在代码中覆盖第三方库的模板标签(以实现上述要求)?道歉,以防万一,这是一个简单的问题-我无法发掘任何能够解决我的特定问题的文档。得到一个说明性的答案将很好。

1 个答案:

答案 0 :(得分:1)

可以使用monkey patching来修复维护不佳的第三方库中的这些错误,但是这种解决方案的可维护性不是很好。 (如果有人再次开始发布新版本,会发生什么?您还记得猴子补丁吗?您的大学知道吗?)

相反,我建议使用以下方法之一:

1。叉子

分叉该库,对其进行修复,然后指向您的requirements.txt中分支的zipball / git url。如果您有希望该项目再次恢复活动,请在原始项目中打开请求请求以进行修复。使用以下内容将其记录在您的requirements.txt中:

django==2.0.6
# Use fork of django-tables2 until https://github.com/jieter/django-tables2/pull/566 is merged.
# django-tables2==2.0.0a1
https://github.com/fork/django-tables2/archive/master.zip

pip freeze仍将显示原始软件包名称,因此不再可用。相反,请保留您在requirements.txt中使用的程序包的显式版本,并使用类似pur的版本来更改版本。

2。供应商

将库的相关部分复制到您自己的项目中,并将其剥离到最低限度。现在,您只需要维护您真正使用的部件,而无需维护上层维护人员。仅在所需的(部分)库较小时才可行。