2010-02-22 2 views
4

어떻게하면 settings.py에서 요청 객체에 액세스 할 수 있습니까? 어쩌면 임시 설정 개체를 만들어 수정 한 다음 나머지 "체인"에 일반 settings.py 대신 사용하도록 알릴 수 있습니까?Django, settings.py에서 요청 객체에 액세스하는 방법

사용할 DB 연결을 결정해야합니다.

추가 질문 사항. 5000 데이터베이스 연결과 같은 것이 있다면 settings.py는 웹 프론트 엔드의 sqlite db에 저장하는 것만 큼 효과적일까요? 연결을 업데이트하는 것만 큼 고통스럽지 않습니까? 또는 settings.py에서 변경 사항을 캐치하기 위해 서버를 다시로드해야합니까?

편집 : 내가 왜 그렇게 많은 연결을 필요로하는지 명확히하기 위해. webapp을 구축 중입니다. SaaS이며 많은 다른 계정과 마찬가지로 계정에 각각 사용자를 만들 수있는 하위 도메인이 있으며 다른 하위 도메인/계정과 상호 작용할 필요가 없습니다. 그러면 각 계정을 모두 자신의 DB로 제한하는 것이 좋습니다. 이렇게하면 보안이 강화되고 응용 프로그램이 단순 해집니다. 거기에 더 많은 장점이 있지만, 이것은 잘 설명해야합니다. 이것이 많은 다른 데이터베이스로 끝나는 이유입니다. (차이점이 있다면 많은 다른 물리적 서버가 아닙니다.)

+0

데이터베이스 연결이 5000 개가 필요한 경우 "잘못하고 있습니다." 당신이하고있는 일을 정확히 설명해 주시겠습니까? – zenazn

답변

1

같은 것을 찾는 다른 사용자를 위해 추가하십시오. 현재 가능하지 않습니다. 장고 버그 추적기 (# 13056)에 대한 기능 요청을 작성하고 수정본을 제출했는데 곧 포함될 것이라고 생각하지 않으며 아마도 버그가 많을 것입니다.

프로젝트를 Flask로 옮겼습니다. g 개체가 완벽하게 적합합니다.

0

Django의 ORM은 데이터베이스 자격 증명을 중간 스트라이드로 전환하도록 설계되지 않았습니다. 아마도 SQLAlchemy과 같은 좀 더 DIY가있는 것이 더 행복 할 것입니다.

+0

예 SQLAlchemy에 대해 생각해 봤지만 가능하면 "보통"Django에 가깝게 유지하려고합니다. 장고는 이제 여러 데이터베이스를 사용할 수 있습니다. 트렁크 1.2에 있습니다. 그리고 문서는 http : //docs.djangoproject에서 자세히 설명합니다.com/en/dev/topics/db/multi-db/ objects-using을 사용하여 올바른 데이터베이스를 선택하기 위해 쿼리 측에서 할 수있는 일이 있지만, 응용 프로그램이 로컬 설치로 이동하는 것이 더 쉬워 져서 데이터베이스가 하나 뿐이며 하위 도메인이 없을 것입니다. –

1

내가이 권리를 이해한다면 using() 호출없이 django의 새로운 db-routing 시스템을 사용하고 즉시 based on model instance (예 : 사용자) 데이터베이스를 선택할 수 있습니다.

+0

그럴 수도 있습니다,하지만 또한 그 계정에 대한 사용자는 또한 DB에 저장되어 있기 때문에 하위 도메인을 기반으로 동일한 DB에 인증을 리디렉션해야합니다. 하지만 auth.user 인스턴스를 포함하지 않는 db 호출은 어떻게됩니까? 나는 그것을 올바르게 이해하고 있는지 확신 할 수 없지만, 현재 질의를받는 유일한 인스턴스는 아닌가? –

+0

hm, true, 문제 일 수 있습니다. –

0

최근에 사용 해본 사이트에서이 문제를 해결하고 Apache/mod_wsgi가 작업을 수행하기로 결정했습니다. 이 솔루션은 약간의 메모리와 CPU 오버 헤드를 추가하지만, 내 앱에서는 모든 것을 유연하게 유지하는 최선의 방법이었습니다.

아파치의 .conf :

SetEnv DJANGO_TEMPLATE_DIR '/usr/local/www/apache22/data/django/templates/' 
<VirtualHost *:80> 
    ServerName encendio.whatever.com 
    ServerAdmin [email protected] 
    DocumentRoot "/usr/local/www/apache22/data" 
    SetEnv DJANGO_DATABASE_NAME monkeys 
    SetEnv DJANGO_DATABASE_USER root 
    SetEnv DJANGO_DATABASE_PASSWORD secretPass 
    SetEnv DJANGO_DATABASE_PORT '' 
    SetEnv DJANGO_DATABASE_HOST '' 
    WSGIScriptAlias//usr/local/www/apache22/data/django/wsgi_handler.py 
</VirtualHost> 

settings.py :

DATABASE_NAME =  os.environ.get('DJANGO_DATABASE_NAME', '') 
DATABASE_USER =  os.environ.get('DJANGO_DATABASE_USER', '') 
DATABASE_PASSWORD = os.environ.get('DJANGO_DATABASE_PASSWORD', '') 
DATABASE_HOST =  os.environ.get('DJANGO_DATABASE_HOST', '') 

이 당신이 httpd.conf의 가상 호스트로 각 사이트를 설정할 수 있습니다.

+0

올바른 방향으로 나아갈 수 있습니다. 그러나 모든 프런트 엔드 서버에서 모든 하위 도메인을 정의하는 것은 유지 관리의 악몽이 될 수 있습니다. * .whatever.com VH를 정의한 다음 URL의 첫 번째 부분을 전달하고 SetEnv로 전달할 수 있는지 궁금하다면 ... 찾아야합니다. 팁을 주셔서 감사합니다 –

+3

그건 작동해서는 안됩니다. SetEnv에 의해 설정된 mod_wsgi 변수는 mod_wsgi에 의해 프로세스 환경 변수에 저장되지 않으며 Django WSGI 어댑터에 의해 os.environ에 저장되지 않습니다. 변수가 요청별로 다를 수있는 경우 다중 스레드에 안전하지 않은 관행을 사용하는 것은 바람직하지 않습니다. –

관련 문제