Переопределение тега шаблона сторонней библиотеки Django для исправления UnicodeEncodeError - PullRequest
0 голосов
/ 26 июня 2018

Я использую стороннюю библиотеку Django google analytics в моем проекте Django. Это позволяет отслеживать на стороне сервера, используя загрузку пиксельного изображения при каждом запросе страницы.

В этом конкретном проекте существуют некоторые шаблоны URL, которые могут содержать специальные (не 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 голосов
/ 27 июня 2018

Исправление этих ошибок в плохо обслуживаемых сторонних библиотеках может быть выполнено с помощью monkey patching , но ремонтопригодность таких решений невелика. (Что произойдет, если кто-то снова начнет выпускать новые версии? Помните ли вы патч с обезьяной? Знает ли ваш колледж?)

Вместо этого я предлагаю один из следующих подходов:

1. Вилка

Разветвите библиотеку, почините ее и укажите на zipball / git url вашей ветки в вашем requirements.txt. Если у вас есть надежда, что проект снова станет активным, откройте в исходном проекте запрос на получение исправлений. Запишите это в свой 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. Производитель

Скопируйте соответствующую часть библиотеки в ваш собственный проект и обрежьте ее до минимума. Теперь вам нужно обслуживать только ту часть, которую вы действительно используете, без барьеров сопровождающих. Жизнеспособен только в том случае, если необходимая (часть) библиотеки мала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...