2012-07-18 2 views
2

특정 페이지에 많은 analytics & 데이터를로드하는 페이지가 있으며 지금까지로드가 잘되었지만 속도를 높일 수 있는지 궁금합니다. 속도를 높이려고 시도한 아이디어는 개별적으로 각 부분을 렌더링하는 것이 었습니다.Pyramid를 사용하여 Jinja2 템플릿의 다른 부분을 개별적으로 렌더링 할 수 있습니까?

예를 들어, 내 현재 모델에서 view.py에 모아 져서 템플릿으로 렌더링되는 질문, 답변, 평판, 태그, 계정, 배지, 투표가 있습니다. 하지만 "평판"또는 "태그"쿼리가 XYZ 이유로 인해 느린 경우 대부분의 사용자에게 중요하지 않은 페이지라도 전체 페이지로드 속도가 느려집니다. 이 문제를 해결하기 위해 자바 스크립트를 사용하여 비동기식으로 json 응답을 렌더링하는 방법에 대해 생각했지만 Pyramid를 사용하고 파이썬을 사용하는 것이 좋습니다. 가능하다면 자바 스크립트를 배우는 것보다 이미 알고있는 도구를 사용하고 싶습니다. 이 접근 방식의 이점은 쿼리를 완료하거나 쿼리 속도에 따라 렌더링 순서를 지정하여 페이지의 맨 위에로드/표시하고 나머지 페이지를 렌더링 할 수 있다는 것입니다.

이 방법이 가능합니까, 아니면 어떻게해야합니까?

+0

질문에 "javascript"및 "jquery"태그를 추가하여 관련 지식이있는 사람들을 더 많이 유치 할 것을 제안합니다. 나는 이것을 할 수있는 충분한 담당자가 없다. – Sergey

+0

@ Sergey 내가 알 수 있듯이. javascript로 해보지 만, 필자는 운을 시험해보고 파이썬만을 사용하여 할 수있는 일이 있는지 (그리고 필요없는 경우 새로운 언어를 배워야하는 것을 피하기 위해) 피하기 위해 노력했다. – Lostsoul

답변

2

확실하게 가능하지만 구현은 피라미드 또는 Jinja2와는 아무런 관련이 없습니다. Pyramid (또는 다른 웹 프레임 워크)가 작동하는 방식은 클라이언트 (요청 객체로 추상화 됨)에서 약간의 텍스트를 가져 와서 기본적으로 응답으로 다른 텍스트를 반환하므로 작업이 더 많거나 적다는 것입니다. 템플릿 엔진이 페이지의 전체 텍스트 생성을 완료 할 때까지 응답이 클라이언트로 되돌려 보내지지 않습니다.

사실, 피라미드가 비트 이후 클라이언트 비트에 데이터를 보내도록 만드는 방법이 있습니다. 그러면 브라우저가 페이지를 점진적으로 렌더링합니다 (전화 접속 연결시와 같이). 직접 쓰고 있습니다. 응답의 몸 나타내는 파일 - 류의 객체 :

import time 
def some_view(request): 
    for i in range(1, 31): 
     request.response.body_file.write(".") 
     time.sleep(1) 

을하지만 당신은 당신이 이미 전송 한 내용에 데이터를 추가 할 수 있기 때문에이 방법은 약간의 제한은, 말하자면하는 표시 할 방법이 없다 "기다려주십시오 차트가로드 중입니다 "라는 메시지를 실제 차트로 바꾸거나 페이지 머리글과 바닥 글을 먼저로드 한 다음 가운데에 무언가를 삽입합니다. 또한이 방법을 사용하면 템플릿을 수동으로 렌더링하거나 템플릿을 전혀 사용하지 않아야합니다. 일부 장기 실행 일괄 작업에만이 방법을 사용했습니다.

질문에서 언급했듯이 더 나은 기술은 별도의 URL에서 페이지의 비트를 JavaScript로로드하는 것입니다. 비동기 적으로로드 된 블록을 종종 "partials"라고 부릅니다.

  • 당신이 당신의 메인 페이지 및 삽입 할 비트를 대표하는 몇 가지 별도의 뷰를 등록, 그래서 말하자면, /questions/123454 페이지의 주요 부분을로드 할 것 /questions/123454/badges는 배지와 /questions/123454/related 것으로 블록을로드합니다 관련 질문

  • 당신이 부분 지문이 삽입됩니다 페이지에 자리 정의 목록로드 :

    < 사업부 아이디 = "배지-부분"> 로딩 중 ...</DIV>

  • 당신이 파셜 (당신이 jquery를 사용하는 경우도,이 작은 것 :로드 페이지에 자바 스크립트의 작은 비트를 추가

    :

    $(function() { 
        $("#badges-partial").load("https://stackoverflow.com/questions/123454/badges"); 
        $("#related-partial").load("https://stackoverflow.com/questions/123454/related"); 
    }); 
    

때문에, 같은 자바 스크립트 솔루션은 더 깔끔하고 쉽고 유연합니다.

+0

좋아요, jquery 경로를 따라 가겠습니다. 다른 질문이 있습니다. 아마도 약간 관련이 없습니다. 피라미드에서 내 앱만 json 응답을 받도록하는 방법이 있습니까? 아직 세상에 api를 열 준비가되지 않았지만 소스 코드에서 피라미드 URL을 조회 할 수 있습니다. – Lostsoul

+1

@Lostsoul : HTML을 공개적으로 액세스 할 수있게하는 것과 JSON 데이터를 공개적으로 액세스 할 수있게하는 뷰간에 차이점이 없습니다. 액세스를 제한해야하는 경우 앱에 인증을 구현해야합니다. Pyramid에는 광범위한 문서가 있습니다. World Wide Web *에서 모든 페이지 *는 읽기 전용 API 메소드이며 모든 양식은 읽기/쓰기 방식이므로 데이터 형식으로 HTML을 사용합니다. JSON API는 그것과 다르지 않습니다. – Sergey

+0

진실하고 그것에 대해 생각하는 좋은 방법. 보안에 대해 좀 더 살펴볼 것입니다. 임의의 사람들이 내 컨트롤을 사용하지 않고 내 사이트 API에 액세스하지 못하도록 막으려 고합니다. 사이트에 액세스하는 사람들을 위해 서버를 늦추십시오. – Lostsoul

관련 문제