Ваш код для установки куки и перенаправления выглядит в целом правильно. Однако, проблема с созданием куки, которая имеет имя "city" и значение "%20", может указывать на то, что происходит неправильное извлечение названия города. Это может быть связано с тем, как вы передаете параметр `city`, возможно, возникают проблемы с кодировкой или пробелами.
Несколько рекомендаций для исправления:
1. **Проверьте входной параметр**: Убедитесь, что в функцию `set_city` передается корректное значение `city`. Возможно, стоит добавить способ очистки и обработки этого параметра (например, удалить лишние пробелы). Можно использовать метод `.strip()`.
2. **Используйте `HttpResponseRedirect` для перенаправления**: На всякий случай замените `redirect` на `HttpResponseRedirect`, чтобы явно указать, что вы делаете перенаправление.
3. **Проверьте, правильно ли установили куки**: Иногда причина проблемы может заключаться в настройках вашего Nginx или окружении Docker. Убедитесь, что Nginx корректно настроен на передачу cookie и правильные заголовки.
4. **Используйте Secure Cookie**: Если ваш сайт работает по HTTPS, убедитесь, что кука устанавливается с флагом `secure`. Это может быть полезно для работы с куками в безопасном окружении.
Пример исправленного кода:
```python
from django.http import HttpResponseRedirect
from django.shortcuts import redirect
from .models import City
def set_city(request, city=None):
# Убедитесь, что city не содержит пробелов в начале и в конце
city = city.strip() if city else ''
c = City.objects.filter(name=city).first()
if c:
response = HttpResponseRedirect(f'/{c.url}')
response.set_cookie('city_now', c.url, httponly=True, secure=True) # Устанавливаем secure и httponly
return response
else:
return redirect('/')
```
### Дополнительные проверки:
1. **Проверка Nginx**: Убедитесь, что ваш nginx настроен на передачу заголовков, включая cookie, и что настройки конфиденциальности действуют правильно. Проверьте конфигурацию для директив, таких как `proxy_set_header`.
2. **Проверка браузера**: Откройте инструменты разработчика в браузере (обычно F12), перейдите на вкладку "Network" и проверьте вкладку "Cookies" в ответе на запрос. Убедитесь, что куки устанавливаются верно.
3. **Логи Docker**: Просмотрите логи вашего приложения для возможных предупреждений или ошибок, связанных с cookie.
Если после всех этих шагов проблема сохраняется, возможно, стоит проверить другие части вашего сайта или конфигурации Docker на наличие потенциальных конфликтов.