pythonsessionpyramidcornice

Pyramid returns new session


I use Cornice to make RESTful urls.

I installed pyramid-beaker and added the include to my __init__.py as specified in the doc.

That's it. Then I did this in my views:

p_desc = """Service to post session. """
p = Service(name='p',\
                    path=root+'/1',\
                    description=register_desc)
g_desc = """Service to get session. """
g = Service(name='g',\
                    path=root+'/2',\
                    description=g_desc)

@g.get()
def view2(request):
    print request.session
    return Response()

@p.post()
def view1(request):
    print 'here'
    request.session['lol'] = 'what'
    request.session.save()
    print request.session
    return Response()

And this is my outcome

>>> requests.post('http://localhost/proj/1')
<Response [200]>
>>> requests.get('http://localhost/proj/2')
<Response [200]>

Starting HTTP server on http://0.0.0.0:6543
here
{'_accessed_time': 1346107789.2590189, 'lol': 'what', '_creation_time': 1346107789.2590189}
localhost - - [27/Aug/2012 18:49:49] "POST /proj/1 HTTP/1.0" 200 0

{'_accessed_time': 1346107791.0883319, '_creation_time': 1346107791.0883319}
localhost - - [27/Aug/2012 18:49:51] "GET /proj/2 HTTP/1.0" 200 4

As you can see it gives back new session. How do I get that same session so that I can access that same data?


Solution

  • Sessions are tracked with a cookie sent to the client. So your 'client' (the requests library) needs to actually send that cookie back again:

    resp = requests.post('http://localhost/proj/1')
    cookies = resp.cookies
    
    requests.get('http://localhost/proj/2', cookies=cookies)
    

    Better still would be to use a requests.Session set-up:

    with requests.Session() as s:
        s.post('http://localhost/proj/1')
        s.get('http://localhost/proj/2')