On 28 May 2002, Patrick K. O'Brien said:
> I'm having trouble figuring out how to work with cookies in Quixote. I'm
> sure I'm just overlooking something minor, but it's starting to bug me. If
> anyone has any simple examples of setting and getting cookies that they
> wouldn't mind sharing it would really help.
What code do you have now, and precisely how does it not work?
> What I'm trying to do is allow the user to select a style sheet and save the
> selection via a cookie.(I'm saving a simple string that works as the key to
> a dictionary of style sheet links, actually.) Then the function that builds
> my pages will get the user's style from the cookie, or default to the
> default style. I'll be happy to share this technique once I get it working.
Assuming the user selects a style sheet by submitting out a form with a
'style_sheet' variable:
  def process_style_sheet_form (request):
      ss = request.form.get('style_sheet')
      if not is_valid_ss(ss):
          raise QueryError("invalid style sheet selection")
      response.set_cookie("style_sheet", ss)
Then, later on when you expect the user to be carrying around a
"style_sheet" cookie:
  def show_some_page (request):
      ss = request.cookies.get("style_sheet", "default")
      if not is_valid_ss(ss):
          ss = "default"
          # or maybe, if you're paranoid/picky:
          raise PublishError("invalid style_sheet cookie: %r" % ss)
          # ...but I'm not sure if PublishError is the right
          # exception.  Probably defining your own exception class
          # (derived from PublishError) is more appropriate.
      # ...generate page using the style sheet denoted by 'ss'...
Of course, you really should be using Quixote's built-in session
management mechanism for this kind of thing.  Good thing it's going to
be documented in the next release!  ;-)  Here's how I'd do the above
with session management:
  class MySession (Session):
      def __init__ (self, request, id):
          Session.__init__(self, request, id)
          self.style_sheet = None
      def set_style_sheet (self, ss):
          if not is_valid_ss(ss):
              # Alternately, this could just raise QueryError directly --
              # but that assumes that set_style_sheet() is only called as
              # a result of processing a web form.
              raise ValueError("invalid style sheet selection")
  [...]
  def process_style_sheet_form (request):
      ss = request.form.get('style_sheet')
      try:
          request.session.set_style_sheet(ss)
      except ValueError, err:
          raise QueryError(err)
  def show_some_page (request):
      ss = request.session.style_sheet
      # ...generate page using the style sheet denoted by 'ss'...
Note that you no longer have to sanity-check a client-supplied cookie --
that's done for you by Quixote.  You just need to ensure that MySession
objects always have a sane value for their 'style_sheet' attribute, so
you only have to sanity-check the value once, on the way in.
        Greg
--
Greg Ward - software developer                gward@mems-exchange.org
MEMS Exchange                            http://www.mems-exchange.org