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.