Как вы используете загрузку изображений и браузер FCKEditor с mod-wsgi?
Вопрос
Я использую FCKEditor в приложении Django, обслуживаемом Apache/mod-wsgi.Я не хочу устанавливать php только для FCKEditor, и я вижу, что 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()
В fckeditor в каталоге editor->filemanager->connectors->py есть файл 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
Редактировать:В конечном итоге я тоже был недоволен этим решением, поэтому я сделал Приложение Джанго который заботится о загрузке и просмотре файлов.
Это решение, которое я наконец нашел после прочтения кода 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
Другие советы
Здесь описывается, как встроить редактор FCK и включить загрузку изображений.
Сначала вам нужно отредактировать fckconfig.js, чтобы изменить URL -адрес загрузки изображения, чтобы указать на какой -то URL -адрес на вашем сервере.
FCKConfig.ImageUploadURL = "/myapp/root/imageUploader";
Это будет указывать на относительный URL-адрес сервера для получения загрузки.FCK отправит загруженный файл в этот обработчик, используя имя переменной CGI «newfile», кодируемое с использованием Multipart/Form-Data.К сожалению, вам придется реализовать/myApp/root/imageUploader, потому что я не думаю, что дистрибутив FCK может быть легко адаптирован к другим структурам.
ImageUploader должен извлечь новый файл и сохранить его где -то на сервере.Ответ, сгенерированный/myApp/root/imageUploader, должен эмулировать HTML, построенный в /редторе/.../fckoutput.py.Что-то вроде этого (формат шаблона Whiff)
{{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 -адресом для поиска изображения на сервере.
Вот основные шаги, чтобы получить фрагмент HTML, который генерирует виджет редактора FCK.Единственная сложная часть - вы должны поместить правильную клиентскую проверку в OS.ENVIROR - это уродливо, но именно так работает библиотека 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 с помощью mod-wsgi:Технически он использует пару функций WHIFF (см.WHIFF.sourceforge.net), - на самом деле это часть распределения покидания - но функции дуза легко удаляются.
Я не знаю, как установить его в Django, но если Django позволяет легко установить приложения WSGI, вы сможете это сделать.
ПРИМЕЧАНИЕ:FCK позволяет клиенту вводить практически все в HTML -страницы - вы захотите отфильтровать возвращенную стоимость для злых атак.(например:См. Whiff.middleware.testsafehtml Middleware для примера того, как это сделать).
""" 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/docs/W1500.whyIsWhiffCool.
кстати:Спасибо.Мне все равно нужно было это изучить.