Кнопка Flask-Back Возврат к сеансу Даже после выхода из кода [duplicate]

Когда ваши пути include разные

Ошибки компоновщика могут произойти, если заголовочный файл и связанная с ним общая библиотека (файл .lib) не синхронизируются. Позволь мне объяснить.

Как работают линкеры? Линкер соответствует объявлению функции (объявленному в заголовке) с его определением (в общей библиотеке) путем сравнения их подписи. Вы можете получить ошибку компоновщика, если компоновщик не найдет определение функции, которое идеально подходит.

Возможно ли получить ошибку компоновщика, даже если объявление и определение, похоже, совпадают? Да! Они могут выглядеть одинаково в исходном коде, но это действительно зависит от того, что видит компилятор. По сути, вы можете столкнуться с такой ситуацией:

// header1.h
typedef int Number;
void foo(Number);

// header2.h
typedef float Number;
void foo(Number); // this only looks the same lexically

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

Вы можете спросить, как это получается в такой ситуации? Включите пути, конечно! Если при компиляции разделяемой библиотеки путь include приводит к header1.h, и вы в конечном итоге используете header2.h в своей собственной программе, вы оставите царапины на своем заголовке, задаваясь вопросом, что произошло (каламбур).

Пример того, как это может произойти в реальном мире, объясняется ниже.

Дальнейшая разработка с примером

У меня есть два проекта: graphics.lib и main.exe. Оба проекта зависят от common_math.h. Предположим, что библиотека экспортирует следующую функцию:

// graphics.lib    
#include "common_math.h" 

void draw(vec3 p) { ... } // vec3 comes from common_math.h

И затем вы идете вперед и включаете библиотеку в свой собственный проект.

// main.exe
#include "other/common_math.h"
#include "graphics.h"

int main() {
    draw(...);
}

Boom! Вы получаете ошибку компоновщика, и вы понятия не имеете, почему она терпит неудачу. Причина в том, что общая библиотека использует разные версии одного и того же include common_math.h (я сделал это очевидным здесь в этом примере, включив другой путь, но это может быть не всегда так очевидно. Возможно, путь include отличается в настройки компилятора).

Обратите внимание, что в этом примере компоновщик сказал бы вам, что не смог найти draw(), когда на самом деле вы знаете, что он явно экспортируется библиотекой. Вы могли часами царапать себе голову, думая, что пошло не так. Дело в том, что компоновщик видит другую подпись, потому что типы параметров немного отличаются. В этом примере vec3 является другим типом в обоих проектах в отношении компилятора. Это может произойти из-за того, что они происходят из двух немного разных файлов include (возможно, включенные файлы поступают из двух разных версий библиотеки).

Отладка компоновщика

DUMPBIN - ваш друг, если вы используете Visual Studio. Я уверен, что другие компиляторы имеют другие подобные инструменты.

Процесс выглядит следующим образом:

  1. Обратите внимание на странное искаженное имя, указанное в ошибке компоновщика. (например, draw @ graphics @ XYZ).
  2. Выгрузите экспортированные символы из библиотеки в текстовый файл.
  3. Найдите экспортированный символ, представляющий интерес, и обратите внимание, что искаженное имя
  4. Обратите внимание на то, почему искаженные имена оказались разными. Вы могли бы видеть, что типы параметров различны, хотя они выглядят одинаково в исходном коде.
  5. Причина, почему они разные. В приведенном выше примере они различаются из-за разных файлов include.

[1] По проекту я имею в виду набор исходных файлов, которые связаны друг с другом для создания либо библиотеки, либо исполняемого файла .

РЕДАКТИРОВАТЬ 1: Переписать первый раздел, который будет легче понять. Пожалуйста, прокомментируйте ниже, чтобы сообщить мне, нужно ли что-то еще исправлять. Спасибо!

2
задан user3016362 18 December 2013 в 10:11
поделиться

3 ответа

Используйте заголовок Cache-Control, чтобы предотвратить кеширование страницы.

response.headers.add('Cache-Control', 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0')   
2
ответ дан davidism 24 August 2018 в 00:23
поделиться

, если я нажму кнопку «Назад», я вернусь на страницу пользователя

Это действительно неверный оператор.

Веб-браузер кэширует страницы локально как пользователь осуществляет навигацию. Если пользователь выйдет из системы, а затем нажмите кнопку «Назад», будет показана кешированная версия страницы. Пользователь не будет возвращен в сеанс пользователя, сеанс пользователя все еще будет закрыт.

Вам нужно обмануть браузер, чтобы избежать такого поведения, и это может быть сложно. Например, если ваши страницы содержат только базовый макет, а затем запрашивают весь контент через ajax, когда вы нажмете кнопку «Назад», ajax обнаружит, что на сервере нет сеанса пользователя и не будет отображаться контент.

4
ответ дан Miguel 24 August 2018 в 00:23
поделиться

Я не думаю, что это проблема, связанная с колбой. Вы можете перенаправить пользователя после выхода из системы. Вы можете сделать это в Flask с помощью метода redirect:

from flask import redirect
redirect(url)

Затем, если пользователь нажмет кнопку «Назад», он приземлится на странице, где находится перенаправление, и перенаправится снова.

Вы также можете проверить каждую страницу, где пользователь должен войти в систему, если он действительно зарегистрирован, а если нет, выполните перенаправление.

Браузеры могут кэшировать ваши страницы , Когда вы нажмете кнопку «Назад», браузер может отобразить кэшированную страницу. Чтобы предотвратить кеширование страницы браузером, вы можете установить заголовок Cache-Control: no-cache. В Flask вы можете сделать это, установив атрибут header объекта Response:

response.headers['Cache-Control'] = 'no-cache'
1
ответ дан rednaw 24 August 2018 в 00:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: