Почему я должен использовать WSGI?

Цель повторно представлять модификатора состоит в том, чтобы предотвратить против общей логической ошибки.

я предположу, что это общеизвестно, как повторно представлять ключевое слово фиксирует предупреждение и объяснит, почему предупреждение сгенерировано и почему ключевое слово включено в язык. Рассмотрите код Дельфи ниже;

TParent = Class
Public
    Procedure Procedure1(I : Integer); Virtual;
    Procedure Procedure2(I : Integer);
    Procedure Procedure3(I : Integer); Virtual;
End;

TChild = Class(TParent)
Public
    Procedure Procedure1(I : Integer);
    Procedure Procedure2(I : Integer);
    Procedure Procedure3(I : Integer); Override;
    Procedure Setup(I : Integer);
End;

procedure TParent.Procedure1(I: Integer);
begin
    WriteLn('TParent.Procedure1');
end;

procedure TParent.Procedure2(I: Integer);
begin
    WriteLn('TParent.Procedure2');
end;

procedure TChild.Procedure1(I: Integer);
begin
    WriteLn('TChild.Procedure1');
end;

procedure TChild.Procedure2(I: Integer);
begin
    WriteLn('TChild.Procedure2');
end;

procedure TChild.Setup(I : Integer);
begin
    WriteLn('TChild.Setup');
end;

Procedure Test;
Var
    Child : TChild;
    Parent : TParent;
Begin
    Child := TChild.Create;
    Child.Procedure1(1); // outputs TChild.Procedure1
    Child.Procedure2(1); // outputs TChild.Procedure2

    Parent := Child;
    Parent.Procedure1(1); // outputs TParent.Procedure1
    Parent.Procedure2(1); // outputs TParent.Procedure2
End;

Данный вышеупомянутый код обе из процедур в TParent скрыты. Для высказывания они скрыты средства, которыми процедуры нельзя назвать через указатель TChild. Компиляция примера кода производит единственное предупреждение;

[DCC, Предупреждающий] Project9.dpr (19): Метод W1010 'Procedure1' скрывает виртуальный метод базового типа 'TParent'

Почему только предупреждение для виртуальной функции а не другого? Оба скрыты.

достоинство А Дельфи - то, что разработчики библиотеки в состоянии выпустить новые версии без страха перед повреждением логики существующего клиентского кода. Это контрастирует с Java, где добавление новых функций к родительскому классу в библиотеке чревато опасностью, потому что классы являются неявно виртуальными. Позволяет говорят, что TParent от вышеупомянутых жизней в сторонней библиотеке и изготовления библиотеки выпускает новую версию ниже.

// version 2.0
TParent = Class
Public
    Procedure Procedure1(I : Integer); Virtual;
    Procedure Procedure2(I : Integer);
    Procedure Procedure3(I : Integer); Virtual;
    Procedure Setup(I : Integer); Virtual;
End;

procedure TParent.Setup(I: Integer);
begin
    // important code
end;

Предполагают, что у нас был следующий код в нашем клиентском коде

Procedure TestClient;
Var
    Child : TChild;
Begin
    Child := TChild.Create;
    Child.Setup;
End;

Для клиента, не имеет значения, если код компилируется против версии 2 или 1 библиотеки, в обоих случаях TChild. Установку называют, как пользователь предназначает. И в библиотеке;

// library version 2.0
Procedure TestLibrary(Parent : TParent);
Begin
    Parent.Setup;
End;

, Если TestLibrary называют с параметром TChild, все работает, как предназначено. Разработчик библиотеки не знает о TChild. Установка, и в Дельфи это не вызывает их никакой вред. Вызов выше правильно решает к TParent. Установка.

, Что произошло бы в эквивалентной ситуации в Java? TestClient работал бы правильно, как предназначено. TestLibrary не был бы. В Java все функции приняты виртуальные. Родитель. Установка решила бы к TChild. Установка, но помнят когда TChild. Установка была записана, они не знали о будущем TParent. Установка, таким образом, они, конечно, не собираются когда-либо называть наследованным. Таким образом, если разработчик библиотеки предназначил TParent. Установка, которую назовут им, не будет, неважно, что они делают. И конечно это могло быть catasrophic.

, Таким образом, объектная модель в Дельфи требует явного объявления виртуальных функций вниз цепочка дочерних классов. Побочный эффект этого состоит в том, что легко забыть добавлять модификатор переопределения на дочерних методах. Существование Повторно представлять ключевого слова является удобством программисту. Дельфи был разработан так, чтобы программист был мягко убежден, поколением предупреждения, явно заявить их намерения в таких ситуациях.

17
задан e-satis 28 November 2009 в 18:54
поделиться

5 ответов

mod_wsgi vs. mod_python:

  • mod_wsgi немного быстрее (внутри больше C, меньше Python)
  • процессы mod_wsgi могут быть изолированы от Apache, что повышает безопасность / стабильность с меньшими использование памяти [1]
  • mod_python дает вам доступ к некоторым внутренним компонентам Apache

WSGI в целом:

  • множество многоразового промежуточного программного обеспечения (аутентификация / авторизация, материалы сеанса, кэширование, фильтрация)
  • простота развертывания на веб-серверы, не относящиеся к Apache, либо через встроенную поддержку WSGI, либо через провал

[1] - по сравнению с предварительно подготовленным Apache, который поддерживает отдельный интерпретатор Python в каждом процессе

10
ответ дан 30 November 2019 в 13:21
поделиться

Для разработки сложных веб-приложений на Python вы, вероятно, использовали бы более комплексную структуру веб-разработки, такую ​​как DJango, Zope, Turbogears и т. Д. Как разработчику приложений вам не нужно беспокоиться о WSGI много. Все, что вам нужно знать, это то, что эти фреймворки поддерживают WSGI. WSGI позволяет разделить код веб-сервера и веб-приложения, и системный администратор может изменить веб-сервер, если веб-приложение совместимо с WSGI. Если вы разрабатываете одну из этих структур, вы в любом случае удовлетворяете этому условию.

Если вы разработчик веб-фреймворка (который разрабатывает сам DJango или Zope), то вы должны понимать WSGI более глубоко.

10
ответ дан 30 November 2019 в 13:21
поделиться

Большинство фреймворков Python реализуют wsgi. Есть mod_wsgi для apache и модуль SCGI / FastCGI / AJP + Flup для остальных. Таким образом, вы можете получить все преимущества отдельного процесса Python без привязки к одному веб-серверу.

2
ответ дан 30 November 2019 в 13:21
поделиться

You shouldn't have to relearn much, since the difference from a developer perspective is just a small wrapper and some server configuration.

From a deployment perspective, the difference is that your python code lives in a separate process from the web browser, which means

a) The python process can be running as another user than the web server. This can be valuable for security, if used right.

b) The web server processes does not need to contain the python runtime. This can be a major boost for performance if the server runs a lot of "other" requests (static files, etc) and some heavy python requests.

1
ответ дан 30 November 2019 в 13:21
поделиться

WSGI is the standard API, which enables you to choose the webserver, and also put A WSGI pipeline such as Repoze in front of it.

See http://repoze.org/

0
ответ дан 30 November 2019 в 13:21
поделиться
Другие вопросы по тегам:

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