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 НЕ ДОЛЖНЫ иметь значение для выполнения какого-либо действия, кроме извлечения. Эти методы должны считаться "безопасными".

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