ここでは、FCK エディターを組み込み、画像のアップロードを有効にする方法について説明します。
まず、fckconfig.js を編集して、画像のアップロード URL がサーバー内の URL を指すように変更する必要があります。
FCKConfig.ImageUploadURL = "/myapp/root/imageUploader";
これは、アップロードを受信するためのサーバーの相対 URL を指します。FCK は、multipart/form-data を使用してエンコードされた CGI 変数名「NewFile」を使用して、アップロードされたファイルをそのハンドラーに送信します。残念ながら、/myapp/root/imageUploader を実装する必要があります。なぜなら、FCK ディストリビューションは他のフレームワークに簡単に適応できるとは思えないからです。
imageUploader は NewFile を抽出し、サーバー上のどこかに保存する必要があります。/myapp/root/imageUploader によって生成される応答は、/editor/.../fckoutput.py で構築された HTML をエミュレートする必要があります。このようなもの(テンプレート形式っぽい)
{{env
whiff.content_type: "text/html",
whiff.headers: [
["Expires","Mon, 26 Jul 1997 05:00:00 GMT"],
["Cache-Control","no-store, no-cache, must-revalidate"],
["Cache-Control","post-check=0, pre-check=0"],
["Pragma","no-cache"]
]
/}}
<script>
//alert("!! RESPONSE RECIEVED");
errorNumber = 0;
fileUrl = "fileurl.png";
fileName = "filename.png";
customMsg = "";
window.parent.OnUploadCompleted(errorNumber, fileUrl, fileName, customMsg);
</script>
上部の {{env ...}} は、送信するコンテンツ タイプと推奨される HTTP ヘッダーを示しています。fileUrl は、サーバー上で画像を検索するために使用する URL である必要があります。
FCK エディター ウィジェットを生成する html フラグメントを取得するための基本的な手順は次のとおりです。唯一のトリッキーな部分は、正しいクライアント識別情報を os.environ に入れる必要があることです。これは見苦しいですが、FCK ライブラリは現在このように動作しています (私はバグ レポートを提出しました)。
import fckeditor # you must have the fck editor python support installed to use this module
import os
inputName = "myInputName" # the name to use for the input element in the form
basePath = "/server/relative/path/to/fck/installation/" # the location of FCK static files
if basePath[-1:]!="/":
basePath+="/" # basepath must end in slash
oFCKeditor = fckeditor.FCKeditor(inputName)
oFCKeditor.BasePath = basePath
oFCKeditor.Height = 300 # the height in pixels of the editor
oFCKeditor.Value = "<h1>initial html to be editted</h1>"
os.environ["HTTP_USER_AGENT"] = "Mozilla/5.0 (Macintosh; U;..." # or whatever
# there must be some way to figure out the user agent in Django right?
htmlOut = oFCKeditor.Create()
# insert htmlOut into your page where you want the editor to appear
return htmlOut
上記はテストされていませんが、テスト済みの以下に基づいています。
mod-wsgi を使用して FCK エディターを使用する方法は次のとおりです。技術的には、WHIFF のいくつかの機能を使用します (WHIFF.sourceforge.net を参照
)。実際には WHIFF ディストリビューションの一部ですが、WHIFF 機能は簡単に削除されます。
Django にインストールする方法がわかりませんが、Django で wsgi アプリを簡単にインストールできるのであれば、できるはずです。
注: FCK を使用すると、クライアントはほとんど何でも HTML ページに挿入できます。悪意のある攻撃のために、返された値をフィルタリングする必要があります。(例: これを行う方法の例については、whiff.middleware.TestSafeHTML ミドルウェアを参照してください)。
"""
FCK エディターの入力要素を導入します。(FCKeditor http://www.fcckeditor.net/ が必要です)。
注: この実装では、コード インジェクション攻撃を含む値が生成される可能性があります。
悪意のあるタグと値に対して生成された出力をフィルタリングしないでください。
"""
import fckeditor # このモジュールを使用するには、fck エディターの Python サポートがインストールされている必要があります
from whiff.middleware import misc
OSのインポート
クラス FCKInput(misc.utility):
def __init__(自己、
inputName, # 入力要素の名前
basePath, # FCK HTTP インストール用のサーバー相対 URL ルート
value = ""): # 入力の初期値
self.inputName = 入力名
self.basePath = basePath
self.value = 値
def __call__(self、env、start_response):
inputName = self.param_value(self.inputName, env).strip()
basePath = self.param_value(self.basePath, env).strip()
if basePath[-1:]!="/":
basePath+="/"
値 = self.param_value(self.value, env)
oFCKeditor = fckeditor.FCKeditor(入力名)
oFCKeditor.BasePath = basePath
oFCKeditor.Height = 300 # これは必須です!
oFCKeditor.Value = 値
# fck python ライブラリのバグを回避: os.environ にユーザー エージェントを配置する必要がある
# XXX このハックは (理論的には) マルチスレッド サーバーでは安全ではありません... os.env をロックする必要があります
os_environ = os.environ
new_os_env = os_environ.copy()
new_os_env.update(env)
試す:
os.environ = new_os_env
htmlOut = oFCKeditor.Create()
最後に:
# 古い os.environ を復元します
os.environ = os_environ
start_response("200 OK", [('Content-Type', 'text/html')])
[htmlOut] を返す
__middleware__ = FCKインプット
デフテスト():
環境 = {
"HTTP_USER_AGENT":
"Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14"
}
f = FCKInput("INPUTNAME", "/MY/BASE/PATH", "開始する HTML値")
r = f(env、misc.ignore)
「テスト結果」を印刷
print "".join(list(r))
__name__=="__main__" の場合:
テスト()
たとえば、
http://aaron.oirt.rutgers.edu/myapp/docs/W1500.whyIsWhiffCoolでこの動作を確認してください。
ところで: ありがとう。とにかくこれを調べる必要がありました。