1

Apache/mod-wsgi が提供する Django アプリ内で FCKEditor を使用しています。FCKEditor のためだけに php をインストールしたくありません。また、FCKEditor が Python を介して画像のアップロードと画像の閲覧を提供していることがわかります。これをすべて設定する方法についての適切な指示が見つかりませんでした。

したがって、現在、Django は次のセットアップを使用して wsgi インターフェースを介して実行されています。

import os, sys

DIRNAME = os.sep.join(os.path.abspath(__file__).split(os.sep)[:-3])
sys.path.append(DIRNAME)
os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

editor->filemanager->connectors->py ディレクトリの fckeditor には、wsgi.py というファイルがあります。

from connector import FCKeditorConnector
from upload import FCKeditorQuickUpload

import cgitb
from cStringIO import StringIO

# Running from WSGI capable server (recomended)
def App(environ, start_response):
    "WSGI entry point. Run the connector"
    if environ['SCRIPT_NAME'].endswith("connector.py"):
        conn = FCKeditorConnector(environ)
    elif environ['SCRIPT_NAME'].endswith("upload.py"):
        conn = FCKeditorQuickUpload(environ)
    else:
        start_response ("200 Ok", [('Content-Type','text/html')])
        yield "Unknown page requested: "
        yield environ['SCRIPT_NAME']
        return
    try:
        # run the connector
        data = conn.doResponse()
        # Start WSGI response:
        start_response ("200 Ok", conn.headers)
        # Send response text
        yield data
    except:
        start_response("500 Internal Server Error",[("Content-type","text/html")])
        file = StringIO()
        cgitb.Hook(file = file).handle()
    yield file.getvalue()

django wsgi ファイルを変更して fckeditor 部分を正しく提供するか、Apache が単一のドメインで django と fckeditor の両方を正しく提供するようにすることで、これら 2 つの 2 つの機能が連携する必要があります。

4

2 に答える 2

1

ここでは、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でこの動作を確認してください。

ところで: ありがとう。とにかくこれを調べる必要がありました。

于 2009-05-04T16:48:09.260 に答える
0

編集:最終的に私はこのソリューションにも不満を持っていたので、ファイルのアップロードとブラウジングを処理するDjangoアプリを作成しました。

これは、fckeditorコードを読んだ後、私が最終的に一緒にハッキングしたソリューションです。

import os, sys

def fck_handler(environ, start_response):
    path = environ['PATH_INFO']
    if path.endswith(('upload.py', 'connector.py')):
        sys.path.append('/#correct_path_to#/fckeditor/editor/filemanager/connectors/py/')
        if path.endswith('upload.py'):
            from upload import FCKeditorQuickUpload
            conn = FCKeditorQuickUpload(environ)
        else:
            from connector import FCKeditorConnector
            conn = FCKeditorConnector(environ)
        try:
            data = conn.doResponse()
            start_response('200 Ok', conn.headers)
            return data
        except:
            start_response("500 Internal Server Error",[("Content-type","text/html")])
            return "There was an error"
    else:
        sys.path.append('/path_to_your_django_site/')
        os.environ['DJANGO_SETTINGS_MODULE'] = 'your_django_site.settings'
        import django.core.handlers.wsgi
        handler = django.core.handlers.wsgi.WSGIHandler()
        return handler(environ, start_response)

application = fck_handler
于 2009-06-04T17:18:57.950 に答える