Этот сайт не наркоманов. Это сайт программистов.

Добро пожаловать на Пыху!

Логин:
Пароль:
 

Нет прописки? Зарегистрируйся!

Новости

Пыха информатор 3.1
Еще более удобное оповещение о флуде!

Краснодарское время: 25 Май, 2012, 07:16:22

Страниц: [1] 2 3
Печать
Автор Тема: mod_wsgi и статика  (Прочитано 536 раз)
0 Пользователей и 1 Гость смотрят эту тему.
master    ↓ 
29 Ноябрь, 2011, 07:20:03
НЕ ХУЕТА! ХУЕТА!

Квадратов сколько видишь ты?
Группа: Джедаи

Карма: 44
Сообщений: 2080
Сила слова: 2.12

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

<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 это делается так:
Text

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php
 
т.е. RewriteRule вступает в действие только если url не совпадает с файлом или директорией. Хочу чтобы mod_wsgi работал аналогично - как это сделать?
 
Алиасы в VirtualHost не хочу использовать потому что во-первых конфигурацию приложения придётся частично переносить в конфигурацию сервера, а во-вторых нарушается правило питона "явное лучше чем неявное".
« Последнее редактирование: 29 Ноябрь, 2011, 07:20:03 от master » Записан

master    ↓ 
17 Март, 2012, 08:32:57 , спустя 109 дней 1 час 12 минут 54 секунды
НЕ ХУЕТА! ХУЕТА!

Квадратов сколько видишь ты?
Группа: Джедаи

Карма: 44
Сообщений: 2080
Сила слова: 2.12

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

<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>
« Последнее редактирование: 17 Март, 2012, 08:32:57 от master » Записан

adw0rd    ↓ 
29 Ноябрь, 2011, 08:58:12 , спустя
НЕ ХУЕТА! ХУЕТА!

эдво
Группа: в ухо

Карма: не нужна
Сообщений: 17633
Сила слова: 1.67

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

from django.conf.urls.defaults import patterns, url
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
 
urlpatterns = patterns('',
    ...
)
urlpatterns += staticfiles_urlpatterns()
 
Спустя 2 минуты 54 секунды добавил
Во втором варианте удобно тем, что мы вообще не зависим от вебсервера, будет работать везде (runserver, runcpdebug/runcpserver, nginx/apache)
Записан

Python, Django, Git, Emacs, Nginx, MySQL, SphinxSearch, FreeBSD/Linux
Мой блог * Кинсбург * Либург * Я на GitHub
vasa_c    ↓ 
29 Ноябрь, 2011, 09:02:31 , спустя 4 минуты 19 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: в ухо

Карма: 81
Сообщений: 2459
Сила слова: 3.29

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

adw0rd    ↓ 
29 Ноябрь, 2011, 09:06:19 , спустя 3 минуты 48 секунд
НЕ ХУЕТА! ХУЕТА!

эдво
Группа: в ухо

Карма: не нужна
Сообщений: 17633
Сила слова: 1.67

vasa_c, да
Записан

Python, Django, Git, Emacs, Nginx, MySQL, SphinxSearch, FreeBSD/Linux
Мой блог * Кинсбург * Либург * Я на GitHub
master    ↓ 
17 Март, 2012, 08:33:43 , спустя 108 дней 23 часа 27 минут 24 секунды
НЕ ХУЕТА! ХУЕТА!

Квадратов сколько видишь ты?
Группа: Джедаи

Карма: 44
Сообщений: 2080
Сила слова: 2.12

adw0rd, апач уже установлен, мне его лень выкидывать. но допустим я его снесу, в варианте Nginx+uwsgi будет отдача статики как мне нужно?
 
Можно в принципе рулить в самой джанге (urls.py)
можно и в джанге, но 1 - вдруг не джанга, и 2 - не будет ли питон лишнюю память кушать при отдаче файла в 100500 мегабайт?
« Последнее редактирование: 17 Март, 2012, 08:33:43 от master » Записан

adw0rd    ↓ 
29 Ноябрь, 2011, 09:40:29 , спустя
НЕ ХУЕТА! ХУЕТА!

эдво
Группа: в ухо

Карма: не нужна
Сообщений: 17633
Сила слова: 1.67

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

Python, Django, Git, Emacs, Nginx, MySQL, SphinxSearch, FreeBSD/Linux
Мой блог * Кинсбург * Либург * Я на GitHub
master    ↓ 
29 Ноябрь, 2011, 09:44:42 , спустя 4 минуты 13 секунд
НЕ ХУЕТА! ХУЕТА!

Квадратов сколько видишь ты?
Группа: Джедаи

Карма: 44
Сообщений: 2080
Сила слова: 2.12

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

phpdude    ↓ 
29 Ноябрь, 2011, 09:46:15 , спустя 1 минуту 33 секунды
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 345
Сообщений: д-о-х-у-я!
Сила слова: 1.66


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

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
adw0rd    ↓ 
29 Ноябрь, 2011, 09:51:28 , спустя 5 минут 13 секунд
НЕ ХУЕТА! ХУЕТА!

эдво
Группа: в ухо

Карма: не нужна
Сообщений: 17633
Сила слова: 1.67

Думаю тут не особо сказывается именно python-way, тут вообще web-way это отдавать статику через легкие вебсервера, такие как Nginx
Да и вообще все зависит от задачи, но в целом лучше через Nginx
 
И ещё я думаю надо ресайзить картиночки и т.д. через nginx, кеш ресайза тоже через Nginx.
Когда нет такой возможности (поставить Nginx), то тогда на Django или другом фреймворке
Спустя 2 минуты 54 секунды добавил
Вот глянул конечный респонс для статики в Django (django.views.static):
Python

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
Записан

Python, Django, Git, Emacs, Nginx, MySQL, SphinxSearch, FreeBSD/Linux
Мой блог * Кинсбург * Либург * Я на GitHub
master    ↓ 
29 Ноябрь, 2011, 09:59:16 , спустя 7 минут 48 секунд
НЕ ХУЕТА! ХУЕТА!

Квадратов сколько видишь ты?
Группа: Джедаи

Карма: 44
Сообщений: 2080
Сила слова: 2.12

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

phpdude    ↓ 
29 Ноябрь, 2011, 10:01:11 , спустя 1 минуту 55 секунд
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 345
Сообщений: 20790
Сила слова: 1.66

и правда странно oO
Записан

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
Ivan    ↓ 
29 Ноябрь, 2011, 11:03:08 , спустя 1 час 1 минуту 57 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Адекваты

Карма: 27
Сообщений: 1366
Сила слова: 1.98

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

master    ↓ 
29 Ноябрь, 2011, 11:18:08 , спустя 15 минут
НЕ ХУЕТА! ХУЕТА!

Квадратов сколько видишь ты?
Группа: Джедаи

Карма: 44
Сообщений: 2080
Сила слова: 2.12

Ivan, а чо там?
Записан

Ivan    ↓ 
29 Ноябрь, 2011, 11:39:36 , спустя 21 минуту 28 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Адекваты

Карма: 27
Сообщений: 1366
Сила слова: 1.98


Ivan, а чо там?

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

Страниц: [1] 2 3
Печать
 

Перейти в:  

Этот топик скрыли: NRG