복붙노트

[PYTHON] Google App Engine - 세션 가져 오기 (Python 2.7)

PYTHON

Google App Engine - 세션 가져 오기 (Python 2.7)

우선, 저는 GAE에 새로운 브랜드입니다. 그래서 가능하면 잘못하고 있습니다.하지만 전에 PHP를 사용했고 세션은 지속적인 데이터를 유지하는 방법이었습니다. 저는 Python 2.7을 사용하고 있습니다. 다른 모든 Python 개발에이 코드를 사용하고 있기 때문입니다. 2.5로 다운 그레이드하는 것이 유효한 해결책이 될지 궁금해지기는하지만, 이상적인 방법이 아닌지 궁금해지기 시작했습니다.

시나리오는 개념 증명 사이트를 구축하고 있으며 'admin'값을 갖는 'user'라는 세션 변수를 설정하는 '더미'로그인 버튼이 필요합니다. 그런 다음 탐색 템플릿에서 변수가 설정되어 있는지 확인하고 추가 메뉴 명령을 추가합니다. 아주 간단합니다. (참고 : 이것은 안전하지 않거나 합리적인 것이 아니라는 것을 알고 있습니다. 문제는 세션이 작동하지 않고 내가하는 일이 아니라는 것입니다. 코드에서 몇 가지 다른 작업을하고 있습니다. 세션 - 배포 할 때 모두 작동하지 않음)

GAE와 Python을위한 몇 가지 세션 라이브러리가있는 것 같아요. Google 검색에서 가장 널리 권장되는 도구 인 gaeutilities를 시도했지만 오류가 발생하여 작동하지 않습니다. (결국이 게시물을 우연히 발견하여 Python 2.7과 호환되지 않음). 조금 더 많은 검색이 appenginelearn.com에서이 라이브러리로 안내해주었습니다. appenginelearn.com에서 배포했는데 완벽하게 작동했습니다. 배포하기 전까지는 아무 것도하지 않습니다. 왜 이것이 실패 할지도 모르는 몇 가지 조언이나 조언을 듣고 싶습니다. 사용중인 관련 코드는 다음과 같습니다.

appenginelearn.com의 util 라이브러리 디렉토리를 응용 프로그램 디렉토리의 루트에 놓은 다음 세션을 가져 왔습니다.

from util.sessions import Session

그런 다음 Login 및 Logout 클래스를 추가했습니다.

class LogIn(webapp2.RequestHandler):
    def get(self):
        self.session = Session()
        self.session['user'] = 'admin'
        # Return the user to the page they logged in from
        referer = self.request.environ['HTTP_REFERER'] \
                if 'HTTP_REFERER' in self.request.environ \
                else '/'
        self.redirect(referer)

class LogOut(webapp2.RequestHandler):
    def get(self):
        self.session = Session()
        self.session.delete_item('user')
        self.redirect('/')

그리고 메인 클래스의 다음 코드 (끔찍한 코드) (이것은 데모의 모든 페이지에 대해 수행됩니다)

class MainPage(webapp2.RequestHandler):
    def get(self):
        self.session = Session()
        logging.info('Main page fired up')
        if 'user' in self.session:
            user = self.session['user']
        else:
            user = None

        template_values = {
            'user': user
            }
        template = jinja_environment.get_template('main.html')
        self.response.out.write(template.render(template_values))

그런 다음 HTML 템플릿 파일에서

  {% if user %}
      <p>Welcome, {{user}}</p>
  {% endif %}

그리고 로그의 오류 :

2012-10-04 02:51:28.084 /login 302 143ms 0kb Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4
*ip address removed* - - [04/Oct/2012:02:51:28 -0700] "GET /login HTTP/1.1" 302 136 "*site-removed*" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4" "*site-removed*" ms=144 cpu_ms=0 cpm_usd=0.000015 instance=*instance removed*
**I** 2012-10-04 02:51:28.080
Creating session session-*session number removed*
**E** 2012-10-04 02:51:28.084
Set-Cookie: appengine-simple-session-sid=*session number removed*; Path=/

해결법

  1. ==============================

    1.webapp2 세션을 본 적이 있습니까? 그것은 모두 내장되어 있으며 바로 시작할 수 있습니다.

    webapp2 세션을 본 적이 있습니까? 그것은 모두 내장되어 있으며 바로 시작할 수 있습니다.

    https://webapp2.readthedocs.io/en/latest/api/webapp2_extras/sessions.html

    import webapp2
    
    from webapp2_extras import sessions
    
    class BaseHandler(webapp2.RequestHandler):
        def dispatch(self):
            # Get a session store for this request.
            self.session_store = sessions.get_store(request=self.request)
    
            try:
                # Dispatch the request.
                webapp2.RequestHandler.dispatch(self)
            finally:
                # Save all sessions.
                self.session_store.save_sessions(self.response)
    
        @webapp2.cached_property
        def session(self):
            # Returns a session using the default cookie key.
            return self.session_store.get_session()
    
    # To set a value:
    self.session['foo'] = 'bar'
    
    # To get a value:
    foo = self.session.get('foo')
    

    그렇다면이 일을 둘러싼 로그인 시스템을 만드는 것이 쉽습니다. 이미 이미 완료 한 것처럼 보입니다. 그리고 선호하는대로 webapp2 세션에 데이터 저장소 및 / 또는 memcache를 사용하게됩니다.

  2. from https://stackoverflow.com/questions/12737008/google-app-engine-getting-sessions-working-with-python-2-7 by cc-by-sa and MIT license