WSGIコンテナのソースメモ

http://dfc.com.ru/ のIInternetProtocolのコードがベース。動けばOKな書き方なのでぐちゃぐちゃです。

  • Unit1.pas
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DynamicNS_D3, OleCtrls, SHDocVw, PythonEngine, StdCtrls,
  PythonGUIInputOutput, XPMan, ExtCtrls;

type
  TForm1 = class(TForm)
    wb: TWebBrowser;
    PythonEngine1: TPythonEngine;
    PythonGUIInputOutput1: TPythonGUIInputOutput;
    Memo1: TMemo;
    PythonDelphiVar1: TPythonDelphiVar;
    Panel1: TPanel;
    cboUri: TComboBox;
    go: TButton;
    XPManifest1: TXPManifest;
    procedure wbNavigateComplete2(ASender: TObject; const pDisp: IDispatch;
      var URL: OleVariant);
    procedure goClick(Sender: TObject);
    procedure PythonDelphiVar1GetData(Sender: TObject; var Data: Variant);
    procedure PythonDelphiVar1SetData(Sender: TObject; Data: Variant);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    procedure OnContent(const url:String; var Stream:TStream);
    procedure Accept(const URL:String;var Accept:Boolean);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  nav_uri: String;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.OnContent(const url: String; var Stream: TStream);
var
  sl: TStringList;
begin
  memo1.Clear;
  sl := TStringList.Create;
  try
    sl.LoadFromFile(ExtractFilePath(Application.ExeName)+ 'site.wsgi');
    PythonDelphiVar1.Value := StringReplace(url,DynamicProtocol.ProtocolName+'://','',[rfIgnoreCase]);
    PythonEngine1.ExecStrings(sl);
  finally
    sl.Free;
  end;
  Stream := TFileStream.Create(ExtractFilePath(Application.ExeName)+ 'tmp', fmOpenRead);
end;

procedure TForm1.Accept(const URL: String; var Accept: Boolean);
begin
  Accept := True;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DynamicProtocol.ProtocolName := 'wsgi';
  DynamicProtocol.Enabled := True;
  DynamicProtocol.OnGetContent := OnContent;
  DynamicProtocol.OnAccept := Accept;
  wb.Navigate(cboUri.Text);
end;

procedure TForm1.PythonDelphiVar1SetData(Sender: TObject; Data: Variant);
begin
  nav_uri := Data;
end;

procedure TForm1.PythonDelphiVar1GetData(Sender: TObject; var Data: Variant);
begin
  Data := nav_uri;
end;

procedure TForm1.goClick(Sender: TObject);
begin
  wb.Navigate(cboUri.Text);
end;

procedure TForm1.wbNavigateComplete2(ASender: TObject; const pDisp: IDispatch;
  var URL: OleVariant);
begin
  if cboUri.Items.IndexOf(URL)<0 then
    cboUri.Items.Add(URL);
  cboUri.Text:=URL;
end;

end.
import os, sys
os.environ['DJANGO_SETTINGS_MODULE'] = 'tkhp.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
application.load_middleware()
from django.http import HttpRequest
req = HttpRequest()
req.path = nav_uri.Value
res = application.get_response(req)
import re
re_html = re.compile('<html\s.*>')
re_chead = re.compile('[^\x0A]*\x0A?[^\x0A]*\x0A?\x0A?')
f = open(os.path.join(os.getcwd(),'tmp'),'wb')
out = re_html.split(res.content)
if len(out) >= 2:
    f.write('<html>'+out[1])
else:
    out = re_chead.split(res.__str__(),1)[1]
    f.write(out)
f.close()