Не найден url при использовании persian/arabic slug в django

база данных: mysql
база данных Collation encode: 'utf8_persian_ci'
версия django: последняя версия
версия python: 3.7.12

Точка: Это хорошо работает на локальном хосте, но не работает на реальном хосте

Ошибка :

The error

models.py :

class blog(models.Model):
    slug = models.SlugField(max_length=255,allow_unicode=True,unique=True)
    title = models.CharField(max_length=255)
    description = models.CharField(max_length=255)

    def __str__(self):
        return  f'title: {self.title}'

Views.py :

def blogViews(request,slug):
    if blog.objects.filter(slug=slug).count() > 0:
        post = blog.objects.get(slug=slug)
        context = {
            'post': post,
        }
        return render(request,'blog/post_detail.html',context)
    else:
        return HttpResponseNotFound()

я пробовал вот это:

1- изменить кодировку get_bytes_from_wsgi в django/core/handlers/wsgi.py

return value.encode('ISO-8859-1')

к

return value.encode('UTF-8')

2- django setings.py:

ALLOW_UNICODE_SLUGS = True

Как это исправить?

Проблема была в моем url regex

model.py :

from django.utils.text import slugify

class blog(models.Model):
    slug = models.SlugField(max_length=255,allow_unicode=True,unique=True)
    title = models.CharField(max_length=255)
    description = models.CharField(max_length=255)
    
    def save(self, *args, **kwargs):
        # Optional
        self.slug = slugify(self.title, allow_unicode=True)
        super(blog, self).save(*args, **kwargs)

    def __str__(self):
        return  f'title: {self.title}'

urls.py :

from django.urls import re_path


urlpatterns = [
    # the main problem was here
    re_path(r'^blog/(?P<slug>[^/]+)/?$', blogtagsViews),
    
]

Views.py :

from urllib.parse import unquote

def blogViews(request,slug):
    slug = unquote(slug)
    if blog.objects.filter(slug=slug).count() > 0:
        post = blog.objects.get(slug=slug)
        context = {
            'post': post,
        }
        return render(request,'blog/post_detail.html',context)
    else:
        return HttpResponseNotFound()

Hex D8AAD8B3D8AA при декодировании в UTF-8 является арабским تست - это то, что вы ожидали?

Похоже, что строка прошла через более чем одну кодировку - по крайней мере, один раз, чтобы превратиться в %D8%AA... - как при использовании PHP urlencode().

Затем, похоже, он прошел через это снова - чтобы получить %25s.

Вы пометили это с помощью [mysql]; если это связано, пожалуйста, сделайте SELECT HEX(...), чтобы проверить, произошло ли "двойное кодирование" при вставке в базу данных.

Вернуться на верх