2014-06-06 3 views
0

기본 세션 serializer가 json 인 django 1.6을 사용하고 있습니다. db를 세션 용 스토리지 엔진으로 사용합니다.
피클을 사용할 정도로이 설정을 변경했습니다. 자, 다음을 읽은 후 : http://www.benfrederickson.com/2014/02/12/dont-pickle-your-data.html
나는 속도 측면에서 큰 차이에 놀랐다.
나는 pickle의 보안 문제를 알고 있지만, 사용자로부터 오는 데이터를 직렬화하지 않기 때문에 현재로서는 그다지 신경 쓰지 않으며 내 웹 사이트는 그다지 유명하지 않습니다.django 세션 serializer 도움 pickle/json 중 선택

내 코드와 내가 이런 종류 세션에서 저장 확인했습니다
문자열 (확인 JSON에 대한)
부울 (확인 JSON에 대한)
날짜 (JSON에 대한 확인,하지만 난으로 전환 할 수 없습니다 문자열을 읽고 필요할 때 구문 분석)
render 객체 (HttpRespone. json에서는 not ok).
내가 마지막으로 저장 한 유형을 해결할 수 있다면 json으로 이동할 수 있습니다. 기본적으로 문제는 다음과 같습니다.
SQL 쿼리를 실행하여 일부 페이지를 생성합니다. 이 페이지에는 동일한 SQL 출력이 필요한 iframe (google maps)이 있습니다. 그래서 동일한 SQL을 두 번 수행하지 않으려 고합니다. 그래서 동일한 컨텍스트와 쿼리 출력을 사용하여 동일한 뷰에서 두 페이지를 '렌더링'하고, iframe을로드하면 이미 생성 된 페이지를 세션에서 가져옵니다 .
어떻게해야합니까? 동일한보기에서 페이지를 생성하는 솔루션은 무엇입니까?

편집 :
이것은 설명 된 경우입니다.
index.html을가 <iframe src='/map/'>

하여 생성 된 index.html 포함 뷰는 다음

은 index.html을 그것에 iframe이되어 있기 때문에, 다른 GET 요청을 전송한다
def index(request): 
    output = sql_query 
    return render_to_response('index.html', {'data':output}) 

이 도달 할 보기 :

def map(request): 
    # Here I need the same sql output I had from the index view. 
    # I don't want to perform this sql again. 
    # So what I did is to create the page in index view, store it in the session, 
    # and just return the page from the session. like this: 
    return request.session['rendered_page_from_index_view'] 

내가 pickle serializer로 변경 한 이유입니다. 게다가 json을 사용할 수 있습니다. 동일한 SQL을 두 번 사용하지 않고이 페이지를 세션에 저장하지 않으려면 어떻게해야합니까?
제 요점을 분명히 밝히기를 바랍니다.

+0

당신이 세션에서 이러한 정보를 어떻게 저장할 것인가? 장고에는 필요한 것을 거의 할 수있는 캐싱 엔진이 있습니다. – petkostas

답변

0

세션 엔진이 무엇인지에 대해 오해 한 것 같습니다. 즉, http의 상태 비 저장 특성을 극복하기 위해 사이트 방문자 데이터를 저장하고 검색합니다.

일부 SQL 시간을 저장하려면 cache framework을보고 싶습니다.

당신이 그 고유 키 (어쩌면 당신은 index에서 세션에 고유 한 값을 설정하고 map에서 검색 할 수 있습니다)을 가져오고 설정하려면이 키를 사용하는 데 도움 요청에서 당신은 몇 가지 매개 변수를 찾아야한다 편집 쿼리 세트의 캐시.

의사 코드 :

def index(request): 
    queryset = get_my_queryset() 
    unique_id = get_unique_id_from_request(request) 
    request.session['queryset_id'] = unique_id 
    cache.set(unique_id, queryset, 30) 
    return render_to_response('index.html', {'data': queryset}) 

def map(request): 
    unique_id = request.session.get('queryset_id') 
    queryset = None 
    if unique_id: 
     queryset = cache.get(unique_id) 
    if queryset is None: 
     queryset = get_my_queryset() 
    return render_to_response('map.html', {'data': queryset}) 
+0

어떤 세션이 필요한지 압니다.앞서 말했듯이이 페이지를로드 한 각 사용자는 iframe이 포함 된 페이지를 가져옵니다. iframe과 페이지 모두 동일한 SQL 쿼리가 필요합니다. SQL 쿼리는 사용자별로 수행됩니다. 렌더링 된 페이지를 저장하기 위해 사용자 캐시를 사용해야합니까? – user3599803

+0

그럼 당신이 성취하고자하는 것을 오해 한 사람입니다. 쿼리 세트를 뷰에서 템플릿으로 전달하고이 템플릿 내부에서 쿼리 세트를 두 번 사용하면 장고에 메커니즘이 있으므로 단 한 번만 실행됩니다 캐시하려면 다음을 수행하십시오. https://docs.djangoproject.com/ko/dev/topics/db/queries/#caching-and-querysets – Germano

+0

내 질문을 편집했습니다. 희망은 지금 분명합니다. – user3599803