OK, not having gotten any feedback, I guess my problem description was
to vague.

I have therefore prepared a little sample program, that should be easy
to extract and run from this e-mail: when running it with python2 I have
no problems, when running it with python3 I get the aforementioned byte
vs. string problems (also shown below once more).

While I roughly know, what has changed between python2 and python3
concerning strings/bytes, I am kind of stuck in this situation: I don't
know what to do in this case and I would hope that someone will try out
this sample program and point me in the right direction.

To make the installation experience easier, I have avoided to use to
many different python/configuration files: the whole program lives in
one file sample.py, which make use of a couple of templates.

To try out the program, you should therefore extract from this e-mail

* the file sample.py

* as well as the templates page.pt, home.pt, other.pt, and notfound.pt
  (note that only page.pt is a complete html page, the others are
  just html snippets)

steps to install/run the program on python2

create the environment
$ virtualenv foo
$ cd foo
$ ./bin/easy_install pyramid
$ ./bin/easy_install pyramid_viewgroup

copy the python script and the page templates to your foo env
$ cp .../simple.py .
$ cp .../page.pt .
$ cp .../home.pt .
$ cp .../other.pt .
$ cp .../notfound.pt .

adjust the path to the templates in simple.py, like
path=os.path.dirname('/path/to/my/foo/')

start the server
$ ./bin/python simple.py -port 8080

and have a look at some pages
http://myserver:8080/home
http://myserver:8080/other
http://myserver:8080/whatever - not found!
http://myserver:8080/         - default view

(see the explanations below, what's going on under the hood.)

--
now do the same with python3

create the environment
$ virtualenv-3.2 bar3
$ cd bar3
$ ./bin/easy_install-3.2 pyramid
$ ./bin/easy_install-3.2 pyramid_viewgroup

copy the simple.py script and the page templates as above,
and adjust the path to the templates

start the server with
$ ./bin/python3 simple.py -port 8080

and have a look at some pages as above.

While http://myserver:8080/, the default view renders fine,
as soon as I look at some of the other pages: home, other, whatever (not found)
I get 

File 
"/home/reuleaux/tmp/bar3/lib/python3.2/site-packages/pyramid-1.3.2-py3.2.egg/pyramid/view.py",
 line 139, in render_view
    return ''.join(iterable)
TypeError: sequence item 0: expected str instance, bytes found

 - Expression: "provider('content')"
 - Filename:   None
 - Location:   (24:33)
 - Source:     ... l:replace="structure provider('content')">page content</div>
                                        ^^^^^^^^^^^^^^^^^^^
 - Arguments:  repeat: {...} (0)
               renderer_name: /home/reuleaux/tmp/bar3/page.pt
               req: <NoneType - at 0x84bf40>
               request: <NoneType - at 0x84bf40>
               provider: <Provider - at 0x28059d0>
               renderer_info: <RendererHelper - at 0x2805a10>
               context: <Home - at 0x2805a50>
               escape: False
               view: <NoneType - at 0x84bf40>
192.168.1.7 - - [21/Jul/2012 01:58:49] "GET /home HTTP/1.1" 500 59  

As mentioned before: I am lost in this case, any help is appreciated.

Some explanations of what's going on in the python2 case / 
how it is supposed to work:

While viewlets/content providers are not everyone's preferred style,
I have used them here to assemble some pages from building blocks
e. g. my home page looks just like this:

  @implementer(IPage)
  class Home(object):
      content=HomeContent()
      title='Home'

I. e. it is a page (implements IPage), and its contents is just
the home content.

Another page, Other, is very similar, but has of course some other
content:

  @implementer(IPage)
  class Other(object):
      content=OtherContent()
      title='Other'

I have used traversal to find those objects, e. g.
  
  http://myserver:port/home

will render Home, .../other will render Other and so on

The views operate just on the interfaces IPage, IContent,
i. e. view_page can render any page, and will make use of
view_content to fill in / show the content provided for
this particular page.


Anyway, thanks for reading, and thanks in advance for trying out.


-Andreas


simple.py
--------------------------------------------------
from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response

from pyramid_viewgroup import Provider

from pyramid.renderers import render_to_response

import sys
import os

import argparse


opts=None


# path = os.path.dirname('/home/reuleaux/tmp/foo/')
path = os.path.dirname('/home/reuleaux/work/website/py3/')



from zope.interface import Interface, implementer


class IContent(Interface):
    pass


class IPage(Interface):
    pass


@implementer(IContent)
class HomeContent(object):
    msg="hi from home"
    tmplt=os.path.join(path, 'home.pt')


@implementer(IPage)
class Home(object):
    content=HomeContent()
    title='Home'


@implementer(IContent)
class OtherContent(object):
    msg="hi from other"
    tmplt=os.path.join(path, 'other.pt')
    

@implementer(IPage)
class Other(object):
    content=OtherContent()
    title='Other'


@implementer(IContent)
class NotFoundContent(object):
    tmplt=os.path.join(path, 'notfound.pt')
    msg="not found!"
    

@implementer(IPage)
class NotFound(object):
    content=NotFoundContent()
    title='not found'



app={
    'home': Home,
    'other': Other,
    }


@implementer(IPage)
class App(object):
    def __getitem__(self, name):
        return app.get(name, NotFound)()
    

class Root(object):
    def __init__(self, request):
        self.request = request
    
    def __getitem__(self, name=None):
        if name in ['static', 
                    ]:
            raise KeyError
        else:
            return App()[name]
        



def default_view(request):
    return Response('Hello world!')





def content_view(request):
    content=getattr(request.context, 'content', None)

    if hasattr(content, 'tmplt'):
        return render_to_response(content.tmplt,
                                  { },
                              )
    else:
        return Response('<span class="mark">content</span>')


def page_view(request):
    context=request.context
    provider=Provider(context, request)
    return render_to_response(
        os.path.join(path, 'page.pt'),
        {
            'provider': provider,
            'context': context,
        },
    )
   



def parser():

    parser=argparse.ArgumentParser()
    
    parser.add_argument("-port", 
                        '--port', 
                        dest="port",
                        action="store",
                        default=6543,
                        help="port")

    return parser


def run(args):
    
    p=parser()
    global opts
    opts = p.parse_args(args)
    # print(opts)

    config = Configurator(root_factory=Root)


    config.add_view('.default_view',)
    
    config.add_view('.page_view',
                    context='.IPage',)

        
    config.add_view('.content_view',
                    name='content',
                    context='.IPage',)


    app = config.make_wsgi_app()
    server = make_server('0.0.0.0', int(opts.port), app)
    server.serve_forever()


if __name__ == '__main__':
   run(sys.argv[1:])
--------------------------------------------------





page.pt
--------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>

<html xmlns="http://www.w3.org/1999/xhtml";
      xmlns:tal="http://xml.zope.org/namespaces/tal";
      >
  <head>
    <title>${context.title}</title>
    
    <style type="text/css"
           media="screen">
      .mark  { 
      font-weight: bold;
      font-style: italic;
      } 
    </style>
    

  </head>
  <body>
     <p>any page will have this structure</p>

     <p>and here comes the content:</p>

     <div tal:replace="structure provider('content')">page content</div>

     <p>rest of the page...</p>

  </body>
</html>
--------------------------------------------------




home.pt
--------------------------------------------------
<div
    xmlns:tal="http://xml.zope.org/namespaces/tal";
    tal:omit-tag=""
    >

  
  <p>
    this is my <span class="mark">home page</span>...
  </p>  


</div>
--------------------------------------------------





other.pt
--------------------------------------------------
<div
    xmlns:tal="http://xml.zope.org/namespaces/tal";
    tal:omit-tag=""
    >


  <p>  
    this is my <span class="mark">other page</span>
  </p>
  

</div>
--------------------------------------------------




notfound.pt
--------------------------------------------------
<div
    xmlns:tal="http://xml.zope.org/namespaces/tal";
    tal:omit-tag=""
    >

  Sorry, page not found

</div>
--------------------------------------------------
















-- 
You received this message because you are subscribed to the Google Groups 
"pylons-discuss" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/pylons-discuss?hl=en.

Reply via email to