我正在我的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'))
。
但是,如何在代码中覆盖第三方库的模板标签(以实现上述要求)?道歉,以防万一,这是一个简单的问题-我无法发掘任何能够解决我的特定问题的文档。得到一个说明性的答案将很好。
答案 0 :(得分:1)
可以使用monkey patching来修复维护不佳的第三方库中的这些错误,但是这种解决方案的可维护性不是很好。 (如果有人再次开始发布新版本,会发生什么?您还记得猴子补丁吗?您的大学知道吗?)
相反,我建议使用以下方法之一:
分叉该库,对其进行修复,然后指向您的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的版本来更改版本。
将库的相关部分复制到您自己的项目中,并将其剥离到最低限度。现在,您只需要维护您真正使用的部件,而无需维护上层维护人员。仅在所需的(部分)库较小时才可行。