كيف يمكنك استخدام تحميل الصور فكيديتور ومتصفح مع وزارة الدفاع-WSGI؟

StackOverflow https://stackoverflow.com/questions/803613

سؤال

وأستخدمه فكيديتور ضمن التطبيق جانغو التي يخدمها أباتشي / وزارة الدفاع-WSGI. أنا لا أريد لتثبيت فب فقط لفكيديتور أندي نرى فكيديتور تقدم تحميل الصور وتصفح الصور من خلال بيثون. أنا فقط لم يتم العثور على تعليمات جيدة حول كيفية إعداد هذا كل شيء.

وهكذا حاليا بفك قيد التشغيل من خلال واجهة 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()

في فكيديتور في رؤساء تحرير> filemanager-> connectors-> الحمر الدليل هو وجود ملف يسمى 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()

وأحتاج هذين الأمرين يعملان معا عن طريق تعديل ملفي WSGI جانغو لخدمة الأجزاء فكيديتور بشكل صحيح أو جعل اباتشي يخدم كلا جانغو وفكيديتور بشكل صحيح على مجال واحد.

هل كانت مفيدة؟

المحلول 2

وتحرير: في نهاية المطاف كنت سعيدة مع هذا الحل أيضا لذلك جعل جانغو التطبيق أن يعتني تحميل الملفات والتصفح.

وهذا هو الحل وأخيرا اخترق معا بعد قراءة رمز فكيديتور:

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

نصائح أخرى

وهذا يصف كيفية تضمين محرر FCK وتمكين صورة تحميل.

أولا تحتاج إلى تعديل fckconfig.js لتغيير تحميل الصور URL للإشارة إلى بعض URL داخل الخادم الخاص بك.

FCKConfig.ImageUploadURL = "/myapp/root/imageUploader";

وهذا سوف نشير إلى URL النسبي الملقم لتلقي التحميل. سوف FCK إرسال الملف الذي تم تحميله إلى أن معالج باستخدام متغير CGI اسم "NewFile" المشفرة باستخدام متعددة الأجزاء / شكل بيانات. للأسف سيكون لديك لتنفيذ / اسم التطبيق / الجذر / imageUploader، لأنني لا أعتقد الاشياء توزيع FCK يمكن أن تتكيف بسهولة مع أطر أخرى.

ووimageUploader يجب استخراج NewFile وتخزينها في مكان ما على الخادم. الاستجابة التي تم إنشاؤها بواسطة / اسم التطبيق / الجذر / imageUploader يجب محاكاة وHTML التي شيدت في /editor/.../fckoutput.py. شيء من هذا القبيل (تنسيق قالب نفحة)

{{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>

والاشياء {{الحياة الفطرية ...}} في أعلى تشير إلى نوع المحتوى و رؤوس HTTP الموصى بها لإرسال. يجب أن يكون fileUrl على رابط ل استخدامها للعثور على صورة على الخادم.

وهنا هي الخطوات الأساسية للحصول على جزء أتش تي أم أل التي يولد FCK محرر الأدوات. الجزء صعبة الوحيد هو أن يكون لديك لوضع الصحيح يفهم المرء العميل في 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

ما سبق هو لم تختبر، لكنه يستند إلى أدناه والتي تم اختبارها.

وهنا هو كيفية استخدام FCK محرر باستخدام وزارة الدفاع-WSGI: من الناحية الفنية فإنه يستخدم ميزات اثنين من النفحة (انظر WHIFF.sourceforge.net )، - في واقع الأمر هو جزء من توزيع النفحة -  لكن تتم إزالة ميزات النفحة بسهولة.

أنا لا أعرف كيف لتثبيته في جانغو، ولكن إذا جانغو يسمح تطبيقات WSGI ليتم تثبيتها بسهولة، ل يجب أن تكون قادرة على القيام بذلك.

ملاحظة: FCK يسمح للعميل لحقن حد كبير أي شيء في صفحات HTML - سوف تحتاج لتصفية القيمة التي تم إرجاعها للشر الهجمات. (على سبيل المثال: انظر whiff.middleware.TestSafeHTML الوسيطة ل مثال على كيفية القيام بذلك).

    
"""
Introduce an FCK editor input element. (requires FCKeditor http://www.fckeditor.net/).

Note: this implementation can generate values containing code injection attacks if you
  don't filter the output generated for evil tags and values.
"""

import fckeditor # you must have the fck editor python support installed to use this module
from whiff.middleware import misc
import os

class FCKInput(misc.utility):
    def __init__(self,
                 inputName, # name for input element
                 basePath, # server relative URL root for FCK HTTP install
                 value = ""):  # initial value for input
        self.inputName = inputName
        self.basePath = basePath
        self.value = 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+="/"
        value = self.param_value(self.value, env)
        oFCKeditor = fckeditor.FCKeditor(inputName)
        oFCKeditor.BasePath = basePath
        oFCKeditor.Height = 300 # this should be a require!
        oFCKeditor.Value = value
        # hack around a bug in fck python library: need to put the user agent in os.environ
        # XXX this hack is not safe for multi threaded servers (theoretically)... need to lock on os.env
        os_environ = os.environ
        new_os_env = os_environ.copy()
        new_os_env.update(env)
        try:
            os.environ = new_os_env
            htmlOut = oFCKeditor.Create()
        finally:
            # restore the old os.environ
            os.environ = os_environ
        start_response("200 OK", [('Content-Type', 'text/html')])
        return [htmlOut]

__middleware__ = FCKInput

def test():
    env = {
        "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", "THE HTML VALUE TO START WITH")
    r = f(env, misc.ignore)
    print "test result"
    print "".join(list(r))

if __name__=="__main__":
    test()

وانظر هذا العمل، على سبيل المثال، في http://aaron.oirt.rutgers.edu/myapp/ مستندات / W1500.whyIsWhiffCool .

وراجع للشغل: الشكر. كنت بحاجة للنظر في هذا على أي حال.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top