Не найден url при использовании persian/arabic slug в django
база данных: mysql
база данных Collation encode: 'utf8_persian_ci'
версия django: последняя версия
версия python: 3.7.12
Точка: Это хорошо работает на локальном хосте, но не работает на реальном хосте
Ошибка :
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()
.
Затем, похоже, он прошел через это снова - чтобы получить %25
s.
Вы пометили это с помощью [mysql]
; если это связано, пожалуйста, сделайте SELECT HEX(...)
, чтобы проверить, произошло ли "двойное кодирование" при вставке в базу данных.