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

mod_wsgi и статика

  • master

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

    Spritz 29 ноября 2011 г. 7: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 не хочу использовать потому что во-первых конфигурацию приложения придётся частично переносить в конфигурацию сервера, а во-вторых нарушается правило питона &quot;явное лучше чем неявное&quot;.
    не всё полезно, что в swap полезло
  • master

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

    Spritz 17 марта 2012 г. 9: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

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

    Spritz 29 ноября 2011 г. 8: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(&#39;&#39;,

    )
    urlpatterns += staticfiles_urlpatterns()
    {+++174+++} Во втором варианте удобно тем, что мы вообще не зависим от вебсервера, будет работать везде (runserver, runcpdebug/runcpserver, nginx/apache)
    adw/0
  • vasa_c

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

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

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

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

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

    vasa_c, да
    adw/0
  • master

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

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

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

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

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

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

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

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

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

    думаю не будет, но сорцы я не смотрел, надо профайлить
    adw/0
  • master

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

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

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

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

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


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

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

    Spritz 29 ноября 2011 г. 9: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):
    &quot;&quot;&quot;
    Serve static files below a given point in the directory structure.

    To use, put a URL pattern such as::

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


    Ivan, а чо там?


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

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