代码之家  ›  专栏  ›  技术社区  ›  Hassan Baig Altons

重写django第三方库模板标记以修复unicodeencodeerror

  •  0
  • Hassan Baig Altons  · 技术社区  · 8 年前

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

    在这个特定的项目中,存在一些可能包含特殊(非ascii)字符的url模式。例如: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 回复  |  直到 8 年前
        1
  •  1
  •   Jieter    8 年前

    在维护不善的第三方库中修复这些错误可以使用 monkey patching ,但这种解决方案的可维护性不高。(如果有人又开始发布新版本会怎么样?你还记得那块猴子补丁吗?你的大学知道吗?)

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

    一。叉子

    分叉库,修复它并指向 requirements.txt 是的。如果您希望该项目再次激活,请在原始项目中打开一个请求以进行修复。在您的 需求.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 仍将显示原始包名称,因此不再可用。相反,保留在中使用的包的显式版本 需求.txt ,使用类似于 pur 以提升版本。

    2.小贩

    将库的相关部分复制到您自己的项目中,并将其剥离到最低限度。你现在只需要维护你真正使用的部分,而不需要障碍向上的维护人员。只有当你需要的(部分)库很小时才可行。