Django 하위 도메인의 구현

4386 단어 django
Django는 전형적인 MVC 3층 프레임워크로서 자신만의 full-stack의 실현을 가지고 있다.개발과 운영 효율에 있어서 Django의 ORM을 [SQLAlchemy]로 교체하고 싶은 사람이 있다.누군가는 Django의 Template 템플릿 렌더링 시스템을 비난하고 [Jinjia2]를 시도한다.그러나 아마도 아무도 Django의 URL 처리 메커니즘에 불만을 가지고 있지 않을 것이다.Stack Overflow에 따르면 더 큰 시스템에 직면하면 Django의 URL Routing이 유일하게 남은 모듈일 수 있다고 한다.Django는 강력한 정규 표현식을 사용하여 Resolve URL을 복원하고 프로그래머가 가지고 있는 지식을 다시 사용했다.에서는 구성 URL을 대칭 이동하여 View가 해당 URL과 결합하도록 하는 Reverse 방법을 제공합니다.게다가 빠른 처리 속도 (전체적인 Resolver cache의 존재 때문에) 는 모든 것을 아름답게 보일 수 있다.그러나 아름다움에서 부족한 것은 Django 정부의 Subdomain에 대한 지원이 완비되지 않다는 것이다. 예를 들어 URL의 Routing은 URI만 고려하고 host 정보(#8896)는 고려하지 않는다.
Django에서subdomain:Contrib의Sites App & Middleware 동적 지정request를 실현할 수 있는 두 가지 방법이 있습니다.urlconf.
먼저 Sites 가 어떠한 Domain을 정의할 수 있는지 살펴보겠습니다.우리는 모든 항목의 설정 파일settings를 알고 있습니다.py는 모두 하나의 속성 SITEID(기본값 1), INSTALLEDAPPS에도 기본적으로'django'가 포함되어 있습니다.contrib.'sites'는 그럼django 내부에서 이 앱을 사용하고 있다는 것을 의미한다.그렇다면 Sites는 우리 상부 애플리케이션에 어떤 경우에 적용됩니까?Django 문서에는 "Use it if your single Django installation powers more than one site and you need to differentiate between those sites in some way"라고 적혀 있습니다.singleDjangoinstallation에 대해 제 이해는 서로 다른site가 같은default 데이터베이스를 사용하는 것입니다. 즉, 같은django 를 사용하는 것입니다.site 데이터베이스 테이블어떻게 보면, 우리의 요구에 부합되잖아: 우리는 원래 같은 데이터베이스에 있는데, 다른site만 설정하면id면 됩니다.하지만 사이트id는 settings에 설정되어 있습니다. 이것은 서로 다른 사이트가 서로 다른 프로젝트를 필요로 한다는 것을 의미합니다.이것은 일부 서로 다른 사이트 간의 기능 관련이 긴밀하지 않고 기존의 구조가 명확하며 다시 사용할 수 있는 앱이 있는 프로젝트에 있어 큰 문제가 되지 않을 수 있다. 그러나subdoamin이 그 기능 논리 코드와 밀접한 관계를 가지고sites의 방식으로 처리하는 것은 너무 난폭해 보인다.
두 번째 방식을 보십시오:middleware가 지정한 Request.urlconf 속성.Django는 Request를 두 부분으로 전달합니다.1. request.path_info, 요청한 URL입니다.2. request.urlconf, 프로젝트 처리의 모든 URL입니다.middleware에서 우리는 urlconf를 특정한 urls로 지정할 수 있습니다.py, 지정되지 않으면 settings의 ROOT 를 기본적으로 사용합니다URLCONF.urlresolvers에서 Resolve와reverse 방법을 호출하면 Request의urlconf 속성을 지정할 수 있지만 안타깝게도template의 url 라벨이urlconf 속성을 드러내지 않았습니다.
생각해 보면 우리는 서로 다른subdomain에 자신의urlconf(귀찮지 않고 유연한urlpatterns구조에 귀결된다)를 정의하고middleware에서domain의 정보에 따라 정의된subdomain에 전송하면 목적을 달성할 수 있다.
그렇다면 이런 실현 방식에 무슨 문제가 있을까?1. runserver 시 ROOT 제거URLCONF가 정의한 patterns입니다. 다른 도메인 이름의 URL을 사용할 수 없습니다.runserver에서 IP를 통해 접근했기 때문에 Domain 정보가 없습니다.2. Django의reverse에domain 정보가 없기 때문에 우리는reverse의 결과를 대응하는subdomain에 수동으로 지정해야 한다.
이 두 문제를 해결하기 위해서 우리는 Trick을 사용했다.우리는middleware 처리를 할 때subdomain의 정보를 보존하고 path에 반영하도록 합니다.urls에 있습니다.py에서 대응하는patterns 구성하기;마지막으로reverse에서subdomain의 정보를 추출하여 정확한 URL을 구성합니다.코드는 다음과 같습니다.
SubdomainMiddleware: class SubdomainMiddleware(object):
    def process_request(self, request):
        domain_parts = request.get_host().split('.')
        if len(domain_parts) == 3:
            # subdomain URI
            request.path_info = '/%s%s' % (domain_parts[0], request.path)
    return None

MIDDLEWARE에 추가CLASSES에서 위쪽 위치를 확인합니다.여기에서, 우리는 Request를 수정하지 않았습니다.path의 정보는 pathinfo야말로 Django 내부 발송의 근거이며, 동시에 우리는 우리의 수요에 따라 path 또는 path 를 유연하게 인용할 수 있습니다info.
Reverse Monkey Patch: # not in settings.py: will be imported twice
# not in urls.py: too late
# works in models.py
from django.conf import settings
if not settings.DEBUG:
    from django.core import urlresolvers
    def reverse_subdomain(*args, **kwargs):
        path_info = old_reverse(*args, **kwargs)
        parts = path_info[1:].split('/', 1)
        path_info = 'http://%s%s/%s' % (
                parts[0], settings.SESSION_COOKIE_DOMAIN, parts[1])
        return path_info
    old_reverse = urlresolvers.reverse
    urlresolvers.reverse = reverse_subdomain

여기에 우리와 우리가 사용하고자 하는 제3자 패키지는reverse의 결과에 의존하지 않고 이를 더 이상 처리하지 않고 페이지에 표시하거나 방향을 바꾸는 등 직접적으로 되돌아오는 행위일 뿐이라는 가설이 있다.이 가설은 우리가 기본적으로 성립되었다고 느낀다.
그리고 하나 더 설명해야 할 것은,re를 포함한다.VERBOSE (\x) 나 0 너비 단언의 정규 표현식은 Resolver일 때는 문제가 없지만, Reverse일 때는 'Non-reversible reg-exp portion' 이기 때문에 이상합니다.때때로 우리는 효율을 위해 고려할 수도 있고, 자신의 호기심과 도전욕을 만족시키기 위해 복잡한 정규가 일치하는 것을 쓰기 위해서일 수도 있으며, 왕왕 필요없는 것이다.
#출처: 구구단 블로그
웨이보에서 주목: 시나닷컴, 텐센트 투고
모집
  • [주해] 운찰살엔지니어(Python, Django)-금산
  • [청두] 파이썬 프로그램 개발(기술 매니저, 2년 이상 파이썬 개발 경험) - 핫쿠
  • [무한] 클라우드 메모리 소프트웨어 연구 개발 엔지니어(첨단 초빙)-세노(무한)기술유한공사
  • [메주] 사이트 프로그래머, 웹 디자인, 실습생-메주천근인터넷과학기술유한공사
  • [광저우]python 게임 개발 엔지니어-광저우하곡트
  • 자세히 >>

    좋은 웹페이지 즐겨찾기