маршрут с почтой метода в колбе, всегда получать 301 ответ [дубликат]

Члены класса:

Для деструктора pure virtual требуется реализация.

Объявление деструктора по-прежнему требует определения его (в отличие от обычной функции):

struct X
{
    virtual ~X() = 0;
};
struct Y : X
{
    ~Y() {}
};
int main()
{
    Y y;
}
//X::~X(){} //uncomment this line for successful definition

Это происходит потому, что деструкторы базового класса вызывается, когда объект уничтожается неявно, поэтому требуется определение.

virtual методы должны быть реализованы или определены как чистые.

Это похоже на методы не virtual без определения, с добавлением аргументов, которые генерирует чистая декларация dummy vtable, и вы можете получить ошибку компоновщика без использования функции:

struct X
{
    virtual void foo();
};
struct Y : X
{
   void foo() {}
};
int main()
{
   Y y; //linker error although there was no call to X::foo
}

Чтобы это сработало, объявите X::foo() чистым:

struct X
{
    virtual void foo() = 0;
};

Non- virtual

Некоторые члены должны быть определены, даже если они явно не используются:

struct A
{ 
    ~A();
};

Следующие ошибки приведут к ошибке:

A a;      //destructor undefined

Реализация может быть встроенной в самом определении класса:

struct A
{ 
    ~A() {}
};

или снаружи:

A::~A() {}

Если реализация вне определения класса, но в заголовке, методы должны быть отмечены как inline, чтобы предотвратить множественное определение.

Все используемые методы-члены должны быть определены, если они используются.

Общей ошибкой является отказ от квалификации имени:

struct A
{
   void foo();
};

void foo() {}

int main()
{
   A a;
   a.foo();
}

Определение должно быть

void A::foo() {}

static. Члены данных должны быть определены вне класса в единственная единица перевода:

struct X
{
    static int x;
};
int main()
{
    int x = X::x;
}
//int X::x; //uncomment this line to define X::x

Инициализатор может быть предоставлен для элемента данных static const типа интеграла или перечисления в определении класса; однако odr-использование этого элемента по-прежнему потребует определения области пространства имен, как описано выше. C ++ 11 позволяет инициализировать внутри класса для всех членов static const данных.

21
задан Martijn Pieters 10 January 2014 в 19:12
поделиться

1 ответ

Трассировка показывает, что именно сопоставление маршрутов вызвало перенаправление; обычно (например, если вы не добавили явные маршруты перенаправления), это означает, что клиент попытался получить доступ к URL-адресу branch (тот, который заканчивается конечной косой чертой ), но запрошенный URL-адрес не включал последнюю косую черту. Клиент просто перенаправляется на URL-адрес канонической ветви с косой чертой.

Из документации Werkzeug Rule :

Правила URL, которые заканчиваются косой чертой, - это URL-адреса ветвей, другие - листья. Если вы включили strict_slashes (по умолчанию), все дочерние URL-адреса, которые сопоставляются без конечной косой черты, будут перенаправлять на тот же URL-адрес с отсутствующим косой чертой.

From документация маршрутизации :

Правила URL флака основаны на модуле маршрутизации Werkzeug. Идея этого модуля заключается в том, чтобы обеспечить красивые и уникальные URL-адреса на основе прецедентов, установленных Apache и более ранними HTTP-серверами.

Возьмите эти два правила:

@app.route('/projects/')
def projects():
    return 'The project page'

@app.route('/about')
def about():
    return 'The about page'

аналогичные, они отличаются использованием конечной косой черты в определении URL. В первом случае канонический URL-адрес для конечной точки проекта имеет завершающую косую черту. В этом смысле он похож на папку в файловой системе. Доступ к нему без завершающей косой черты приведет к перенаправлению Flask к каноническому URL-адресу с завершающим косой чертой.

Во втором случае URL-адрес определен без конечной косой черты, а скорее как путь к файлу на UNIX-подобных системах. Доступ к URL-адресу с завершающей косой чертой приведет к ошибке 404 «Not Found».

Это поведение позволяет относительным URL-адресам продолжать работать, даже если завершающая косая черта оммитирована, в соответствии с тем, как работают Apache и другие серверы.

Как указано, если вы не хотите этого поведения (и имеете url без конечной косой черты вместо 404 Not Found), вы должны установить опцию strict_slashes=False на вашем маршруте.

41
ответ дан Martijn Pieters 1 September 2018 в 10:41
поделиться
Другие вопросы по тегам:

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