Django - перенаправить URL с верхнего регистра на нижний регистр - PullRequest
1 голос
/ 05 мая 2020

В моих Django приложениях у меня много URL-адресов, включая /(?P<project_name>[_\w]+)/. project_name определяется пользователями и является атрибутом модели Project.

Я добавил валидатор на project_name, чтобы проверить, является ли он строчным. Итак, новые имена все в нижнем регистре, но некоторые старые имена включают символы в верхнем регистре.

Я хотел бы изменить все сохраненные имена, чтобы сделать их строчными, но в то же время я не хочу, чтобы пользователи получали сообщение об ошибке, когда пытается получить доступ к одному из URL-адресов со старым именем проекта, включая символы верхнего регистра. Поскольку у меня много URL-адресов и много просмотров, я не хочу обновлять каждый вручную до .lower() до project_name.

Есть ли способ перенаправить все URL-адреса, включая /<project_NAME>/ на /<project_name>/?

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Хакерский способ с декораторами

Вы можете создать декоратор для всех ваших представлений, которые используют project_name:

def project_lowercase(_func=None):
    def checkLowercase(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            request = args[0]
            project_name = args[1]
            if not project_name.islower():
                return HttpResponseRedirect(reverse(your_url_name, kwargs{'project_name' = project_name.lower()))
            return func(*args, **kwargs)
        return wrapper
    return checkLowercase(_func)

Замените your_url_name тем, что вы назвали своим URL-маршрутом, затем импортируйте функцию и добавьте декоратор над каждой функцией просмотра:

@project_lowercase
def view_project(request, project_name):
    # ...
    return "Hello World!"

Слагов было бы лучше

В качестве альтернативы, как предлагается в комментариях, и лучшее решение, которое вы должны использовать slug для сохранить URL-адреса для ваших проектов, посмотрите здесь , чтобы увидеть, как добавить их в свои модели и сгенерировать ярлыки.

Чтобы переместить существующие данные для использования слагов или просто обновить названия проектов, вы может создать перенос данных , который изменит существующие данные в вашей базе данных.

0 голосов
/ 05 мая 2020

Первый вариант, который я предлагаю, - избегать регулярных выражений, переключиться на путь для urlpatterns и использовать настраиваемый преобразователь URL для имен ваших проектов.

Если вы хотите продолжать использовать регулярные выражения, вы можете ограничить свой шаблон, чтобы он принимал только имена проектов в нижнем регистре /(?P<project_name>[_a-z0-9]+)/. После этого добавьте шаблон URL, который (фактически) совпадает с вашим текущим /(?P<project_name>\w+)/ (примечание отсутствует _ - \w уже включает это), чтобы соответствовать всем именам проектов, включая устаревшие, представление для этого шаблона перенаправит на ваше первое представление строчными буквами project_name.

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