Heroku Django request.POST выдает неверные значения
Я развернул приложение в heroku build с использованием django. В моем django views.py я получаю некоторое значение с помощью request.POST и сохраняю в переменной global, чтобы я мог получить доступ к этому значению в другой функции, которая затем отображается в шаблоне.
Все работало нормально на сервере devolopment, но когда я развернул его на heruko, request.POST не возвращает правильное значение.
views.py:
serv='--'
def home(request):
global serv
if request.method=='POST':
dayCheck.clear()
serv=request.POST['service']
return HttpResponseRedirect('func')
def func(request):
global serv
#Doing something,does not involve serv
return render(request,'index.html',{'service':serv})
Когда я пытаюсь ввести serv в home(), он выдает правильное значение, но другое значение в func.
и то же самое отображается, в основном это будет значение, которое я ранее нажимал или иногда это будет просто --, как заявлено.
Пожалуйста, помогите мне!
Заранее спасибо
Пожалуйста, не делайте этого. Использование глобального состояния в веб-сервере - это очень серьезный антипаттерн. Часто позже несколько процессов Django будут запущены для одновременной обработки запросов: это означает, что следующий запрос может быть обработан другим процессом Django. Более того, возможно, что в промежутке будет обработан запрос различного пользователя.
Обычно вы передаете данные через параметр URL, строку запроса, базу данных, POST-параметры, переменные сессии и cookies (где переменные сессии и cookies обычно тоже не очень хорошая идея, поскольку они могут легко столкнуться с другими представлениями, которые хранят некоторое состояние в сессиях или cookies).
Таким образом, вы можете, например, использовать параметр URL, где вы отображаете func на:
urlpatterns = [
# …,
path('func/<path:param>/', views.func, name='func')
]
то вы, таким образом, делаете запрос с:
from django.shortcuts import redirect
def home(request):
if request.method == 'POST':
dayCheck.clear()
serv = request.POST['service']
return redirect('func', param=serv)
def func(request, param):
# here param has the value for serv in the previous request
return render(request,'index.html',{'service':serv})
поскольку он будет делать GET запрос к func, func кроме того, не разрешается вносить какие-либо изменения в сущности, поскольку это определено спецификациями HTTP по безопасным методам [w3.org]:
В частности, было установлено, что методы GET и HEAD НЕ ДОЛЖНЫ иметь значение для выполнения какого-либо действия, кроме извлечения. Эти методы должны считаться "безопасными".