ФорумПрограммированиеPythonDjango → mod_wsgi и статика

mod_wsgi и статика

  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz 29 ноября 2011 г. 19:20

    Если настроить mod_wsgi на document root, то он обрабатывает все запросы, в том числе и к статическим файлам. Пример:


    <VirtualHost *:80>
       ServerName mysite
       DocumentRoot /var/sites/mysite/public
       WSGIScriptAlias / /var/sites/mysite/script.wsgi
    </VirtualHost>


    В public я кладу файл logo.png и хочу чтобы запросы обрабатывались следующим образом:
    http://my-site/logo.png - файл существует и напрямую отдаётся апачем
    http://my-site/any-url - файл не существует и обрабатывается mod_wsgi

    В случае с php это делается так:

    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule .* index.php

    т.е. RewriteRule вступает в действие только если url не совпадает с файлом или директорией. Хочу чтобы mod_wsgi работал аналогично - как это сделать?

    Алиасы в VirtualHost не хочу использовать потому что во-первых конфигурацию приложения придётся частично переносить в конфигурацию сервера, а во-вторых нарушается правило питона "явное лучше чем неявное".
    не всё полезно, что в swap полезло
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz 17 марта 2012 г. 20:32, спустя 109 дней 1 час 12 минут

    Одно из решений - добавить RewriteRule в раздел VirtualHost
    http://nemesisdesign.net/blog/coding/setup-django-staticgenerator-apache-mod_wsgi/


    <VirtualHost *:80>
       ServerName mysite
       DocumentRoot /var/sites/mysite/public
       RewriteEngine on
       RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
       RewriteRule (.*) /index.py/$1 [L,QSA,PT]
       WSGIScriptAlias /index.py /var/sites/mysite/script.wsgi
    </VirtualHost>
    не всё полезно, что в swap полезло
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 29 ноября 2011 г. 20:58, спустя 25 минут 15 секунд

    1) Зачем тебе apache? Я бы использовал Nginx+uwsgi или Nginx+fastcgi
    2) Можно в принципе рулить в самой джанге (urls.py):

    from django.conf.urls.defaults import patterns, url
    from django.contrib.staticfiles.urls import staticfiles_urlpatterns

    urlpatterns = patterns('',

    )
    urlpatterns += staticfiles_urlpatterns()
    Спустя 174 сек.
    Во втором варианте удобно тем, что мы вообще не зависим от вебсервера, будет работать везде (runserver, runcpdebug/runcpserver, nginx/apache)
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 29 ноября 2011 г. 21:02, спустя 4 минуты 19 секунд

    adw0rd, и чего джанга и статику выдавать будет?
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 29 ноября 2011 г. 21:06, спустя 3 минуты 48 секунд

    vasa_c, да
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz 17 марта 2012 г. 20:33, спустя 108 дней 23 часа 27 минут

    adw0rd, апач уже установлен, мне его лень выкидывать. но допустим я его снесу, в варианте Nginx+uwsgi будет отдача статики как мне нужно?

    Можно в принципе рулить в самой джанге (urls.py)

    можно и в джанге, но 1 - вдруг не джанга, и 2 - не будет ли питон лишнюю память кушать при отдаче файла в 100500 мегабайт?
    не всё полезно, что в swap полезло
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 29 ноября 2011 г. 21:40, спустя 1 час 6 минут 46 секунд

    adw0rd, апач уже установлен, мне его лень выкидывать. но допустим я его снесу, в варианте Nginx+uwsgi будет отдача статики как мне нужно?

    её будет отдавать nginx
    Спустя 30 сек.
    можно и в джанге, конечно, но 1 - вдруг не джанга, и 2 - не будет ли питон лишнюю память кушать при отдаче файла в 100500 мегабайт?

    думаю не будет, но сорцы я не смотрел, надо профайлить
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz 29 ноября 2011 г. 21:44, спустя 4 минуты 13 секунд

    adw0rd, а какой вообще python-way для этой типовой задачи (отдачи статики)?
    не всё полезно, что в swap полезло
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 29 ноября 2011 г. 21:46, спустя 1 минуту 33 секунды


    adw0rd, а какой вообще python-way для этой типовой задачи (отдачи статики)?
    ваще странынй вопрос)) отдача статики это вей веб сервера независимо от языка у всех нормальных людей)
    Сапожник без сапог
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 29 ноября 2011 г. 21:51, спустя 5 минут 13 секунд

    Думаю тут не особо сказывается именно python-way, тут вообще web-way это отдавать статику через легкие вебсервера, такие как Nginx
    Да и вообще все зависит от задачи, но в целом лучше через Nginx

    И ещё я думаю надо ресайзить картиночки и т.д. через nginx, кеш ресайза тоже через Nginx.
    Когда нет такой возможности (поставить Nginx), то тогда на Django или другом фреймворке
    Спустя 174 сек.
    Вот глянул конечный респонс для статики в Django (django.views.static):

    def serve(request, path, document_root=None, show_indexes=False):
    """
    Serve static files below a given point in the directory structure.

    To use, put a URL pattern such as::

    (r'^(?P<path>.*)$', 'django.views.static.serve', {'document_root' : '/path/to/my/files/'})

    in your URLconf. You must provide the ``document_root`` param. You may
    also set ``show_indexes`` to ``True`` if you'd like to serve a basic index
    of the directory. This index view will use the template hardcoded below,
    but if you'd like to override it, you can create a template called
    ``static/directory_index.html``.
    """
    path = posixpath.normpath(urllib.unquote(path))
    path = path.lstrip('/')
    newpath = ''
    for part in path.split('/'):
    if not part:
    # Strip empty path components.
    continue
    drive, part = os.path.splitdrive(part)
    head, part = os.path.split(part)
    if part in (os.curdir, os.pardir):
    # Strip '.' and '..' in path.
    continue
    newpath = os.path.join(newpath, part).replace('\\', '/')
    if newpath and path != newpath:
    return HttpResponseRedirect(newpath)
    fullpath = os.path.join(document_root, newpath)
    if os.path.isdir(fullpath):
    if show_indexes:
    return directory_index(newpath, fullpath)
    raise Http404("Directory indexes are not allowed here.")
    if not os.path.exists(fullpath):
    raise Http404('"%s" does not exist' % fullpath)
    # Respect the If-Modified-Since header.
    statobj = os.stat(fullpath)
    mimetype, encoding = mimetypes.guess_type(fullpath)
    mimetype = mimetype or 'application/octet-stream'
    if not was_modified_since(request.META.get('HTTP_IF_MODIFIED_SINCE'),
    statobj.st_mtime, statobj.st_size):
    return HttpResponseNotModified(mimetype=mimetype)
    response = HttpResponse(open(fullpath, 'rb').read(), mimetype=mimetype)
    response["Last-Modified"] = http_date(statobj.st_mtime)
    response["Content-Length"] = statobj.st_size
    if encoding:
    response["Content-Encoding"] = encoding
    return response


    Хоть с виду он и излишен, но решает поставленую задачу сполна
    Да и по скорости это будет не особо заметно.
    Но есть это проект связанный с отдачей большого кол-ва статики, то я бы не стал юзать Django для этого без подстраховки кеша вебсервера и/или CDN
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz 29 ноября 2011 г. 21:59, спустя 7 минут 48 секунд

    отдача статики это вей веб сервера независимо от языка у всех нормальных людей

    дык в mod_wsgi этой возможности почему-то нет. и джанга в новом проекте папку public не создаёт, хотя это именно веб-фреймворк. и ставить предлагают два веб-сервера, а если один - выкручивайся как хочешь. странно всё это
    не всё полезно, что в swap полезло
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 29 ноября 2011 г. 22:01, спустя 1 минуту 55 секунд

    и правда странно oO
    Сапожник без сапог
  • Ivan

    Сообщения: 1316 Репутация: N Группа: Адекваты

    Spritz 29 ноября 2011 г. 23:03, спустя 1 час 1 минуту 57 секунд

    Переходите все на нжинкс и не трахайте себе мозг
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz 29 ноября 2011 г. 23:18, спустя 15 минут

    Ivan, а чо там?
    не всё полезно, что в swap полезло
  • Ivan

    Сообщения: 1316 Репутация: N Группа: Адекваты

    Spritz 29 ноября 2011 г. 23:39, спустя 21 минуту 28 секунд


    Ivan, а чо там?


    Работает быстрее, от нагрузок лучше защищен, настраивается легко, все всевозможные и невозможные модули и адаптеры для него уже давно написаны

Пожалуйста, авторизуйтесь, чтобы написать комментарий!