Уведомления

Группа в Telegram: @pythonsu

#1 Май 3, 2011 15:21:39

CEMEH
От:
Зарегистрирован: 2011-05-03
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема: import и wsgi

Есть простенький сайт python + nginx (wsgi).
В питоновском коде есть import своих модулей, лежащих рядом (или выше на директорию).
Поэтому есть sys.path.insert(0, path)

Понадобилось создать копию сайта и сделать изменения в импортируемых модулях.
Теперь возникает конфликт, т.к. sys.path для обоих сайтов единый и происходит путаница в импортируемых модулях.

Как настроить nginx (wsgi) чтоб sys.path был уникальный для каждого сайта?



Офлайн

#2 Май 3, 2011 15:52:43

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Проблема: import и wsgi

я сделал так - в одной папке лежат: папка-библиотека, папка-приложение1, папка-приложение2. (пример, ewe, blog, sitenews)
оба приложения юзают библиотеку, но не видят друг друга. в каждом проекте есть settings.py с классом Conf.
при старте текущая папка в sys.path подменяется родительской папкой (она будет корнем проекта)

import sys
import os
from settings import Conf

project_path = os.path.dirname(os.path.realpath(__file__))
root_path = project_path.rpartition(os.sep)[0]
sys.path[0] = root_path
os.chdir(root_path)
import ewe
Conf.path_project = project_path
Conf.path_uploads = os.path.join(project_path,'uploads')
ewe.conf = Conf
ewe._db_connect()

Офлайн

#3 Май 3, 2011 16:30:25

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Проблема: import и wsgi

А как python подружен с wsgi?



Офлайн

#4 Май 3, 2011 16:39:26

CEMEH
От:
Зарегистрирован: 2011-05-03
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема: import и wsgi

o7412369815963
при старте текущая папка в sys.path подменяется родительской папкой (она будет корнем проекта)
Как понял, вся соль в этом:
sys.path[0] = root_path
это не отразится на втором сайте?
как понимаю, изменения глобальные для обоих сайтов
не возникнет ли конфликта если будет несколько импортов в нескольких файлах?



Офлайн

#5 Май 3, 2011 16:50:42

CEMEH
От:
Зарегистрирован: 2011-05-03
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема: import и wsgi

Александр Кошелев
А как python подружен с wsgi?
Не совсем понял вопроса… дружбой не я занимаюсь, а админ :)
Могу только показать кусок из конфига:
server {
listen xxx.xxx.xxx.xxx:80;
server_name site1.xxxxxx.com;
charset windows-1252;
access_log logs/access.log main;
error_log logs/error.log;

include wsgi_vars;

location / {
root html/ftp;
index home.php main.php index.php index.html index.htm;
}

location /site1 {
root /www/site1;
wsgi_pass /www/site1/main.py;
wsgi_pass_authorization off;
wsgi_script_reloading on;
}

location /site2 {
root /www/site2;
wsgi_pass /www/site2/main.py;
wsgi_pass_authorization off;
wsgi_script_reloading on;
}
}
Примерно так…

Хм… а не решит ли проблему, если повесить сайты на разные субдомены?



Офлайн

#6 Май 3, 2011 16:58:38

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Проблема: import и wsgi

CEMEH
Не совсем понял вопроса… дружбой не я занимаюсь, а админ :)
Скажите своему админу, что он профнепригоден:-)

mod_wsgi для nginx никогда не был доведен до ума и при его архитектуре в принципе бесполезен в сочетании с nginx. К тому же уже давно не поддерживается разработчиками.

Вам нужен либо fastcgi, либо uwsgi (который есть нативно в nginx).

И конечно, разные сайты должны висеть в разных процессах, чтобы не шарить окружение и в частности sys.path. У вас проблема именно из-за этого.



Офлайн

#7 Май 3, 2011 19:06:58

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Проблема: import и wsgi

конечно uwsgi надо…

>это не отразится на втором сайте?
нет, у каждого свой index.wsgi

Офлайн

#8 Май 3, 2011 20:01:07

CEMEH
От:
Зарегистрирован: 2011-05-03
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема: import и wsgi

Так… что-то я запутался вконец…
Поставил uwsgi.

Александр Кошелев
И конечно, разные сайты должны висеть в разных процессах, чтобы не шарить окружение и в частности sys.path. У вас проблема именно из-за этого.
т.е. я должен разнести их по разным портам, и в конфиге должно быть что-то типа:
	location /site1 {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9002;
}

location /site2 {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9003;
}
o7412369815963 утверждает, что достаточно сделать
sys.path[0] = root_path
как понял, это в одном процессе

o7412369815963
>это не отразится на втором сайте?
нет, у каждого свой index.wsgi
Но мне думается, что это приведет к очень странным багам.
Как я понимаю параллельное выполнение кода
sys.path[0] = root_path
os.chdir(root_path)
import ewe
может привести к тому, что один скрипт установит свой путь в sys.path, а другой в этот момент уже перейдет к import ewe, а т.к. sys.path глобальный, то загрузится не тот ewe.

Или я чего-то путаю?



Офлайн

#9 Май 4, 2011 06:05:04

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Проблема: import и wsgi

> o7412369815963 утверждает, что достаточно сделать
где я утверждаю что этого достаточно? более того, я выше написал “у каждого свой index.wsgi”

>как понял, это в одном процессе
нет, каждый проект имеет свой процесс, и это не считая того что каждый ваш проект уже запущен в 10..20 экземплярах (процессов, зависит от настроек wsgi)

>т.е. я должен разнести их по разным портам, и в конфиге должно быть что-то типа:
типа того

Офлайн

#10 Май 4, 2011 08:34:35

CEMEH
От:
Зарегистрирован: 2011-05-03
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема: import и wsgi

o7412369815963
> o7412369815963 утверждает, что достаточно сделать
где я утверждаю что этого достаточно? более того, я выше написал “у каждого свой index.wsgi”
Сорри, значит не понял ранее.
У меня тоже несколько index.wsgi, но при этом была путаница.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version