Django get_current_site и build_absolute_uri всегда говорят, что это сайт localhost - PullRequest
1 голос
/ 08 мая 2020

Это веб-сайт Django, тестируемый через небольшой сервер, который поставляется с Django:

python manage.py runserver 8080

Клиент тестирования входит из браузера, запущенного на машине во внешней сети. Т.е. браузер работает не на сервере, а на рабочем столе, и запросы поступают через Inte rnet. Запрос будет иметь типичную форму https://sub.awebsite.com/path

Представление ajax POST включает в себя вызов поставщика, который вы можете распознать:

    class view_class ...
       def post(self, request) 
          ...
          new_session = stripe.checkout.Session.create(
             api_key=djstripe.settings.STRIPE_SECRET_KEY
            ,line_items=[item]
            ,payment_method_types=['card']
            ,success_url='https://a.awebsite.com/path?session_id={CHECKOUT_SESSION_ID}'
            ,cancel_url='https://a.awebsite.com/other_path'
            )

Обратите внимание на последний два аргумента встраивают буквальные строки URI в веб-сайт. Для python и Django они не имеют особого значения. Это просто струны. Однако позже клиент будет использовать их для перенаправления обратно на веб-сайт. Эта буквальная кодировка действительно является проблемой, потому что сайт меняется в зависимости от того, кто его тестирует или был ли он выпущен. Я бы предпочел использовать функции build_absolute_uri или get_current_site для построения этих строк. Однако эти функции просто печатают localhost. Например, я помещаю эти два оператора печати чуть выше вызова функции в stripe.checkout.Session.create:

print("get_current_site: ", get_current_site(request))
print("post absolute uri: ", request.build_absolute_uri())

И они печатают:

 get_current_site:  localhost:8080
 absolute uri:  http://localhost:8080/...

Я думаю, что absolute_uri получает информацию из там же, что и get_current_site.

Теперь да, в файле настроек localhost также указан как разрешенный хост. Если я удалю его, то получаю панель Django spla sh, сообщающую мне, что мне нужно добавить localhost в список ALLOWED_HOSTS. (Я предполагаю, что это не будет проблемой при входе через wsgi, потому что для этого требуется разрешенный хост с правильным именем.)

Так почему они не печатают имя сайта? Откуда идет localhost? .. и как мне получить фактическое имя сайта, которое клиент вводит в браузер, чтобы перейти на сайт?

1 Ответ

1 голос
/ 11 мая 2020

Решением было добавить эту строку в конфигурацию прокси-прокси nginx:

proxy_set_header Host $http_host;

Теперь блок местоположения выглядит так:

 location / {
        proxy_pass http://localhost:8001/;
        proxy_set_header Host $http_host;     
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
    }

После добавления proxy_set_header get_current_site и все его варианты теперь работают правильно.

Обратите внимание также на следующее: Почему Nginx продолжает перенаправлять меня на localhost?
Как я могу получить домен название моего сайта в шаблоне Django?

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