[python]pyramid 学习3 (route)

模式1: main中add_view

projectname/__init__.py main方法中加入

from views import myview
config.add_route('myroute', '/prefix/{one}/{two}')
config.add_view(myview, route_name='myroute')

projectname/views.py中加入方法

from pyramid.response import Response
def myview(request):
return Response(request.matchdict['one']+"#"+request.matchdict['two'])

 

浏览器访问
127.0.0.1:6543/prefix/1/2 查看效果

 

模式2 main中使用scan

projectname/__init__.py main方法中加入路由规则

config.add_route('scan','/scan/{one}')
config.scan("projectname")

projectname/views.py中加入方法

from pyramid.response import Response
from pyramid.view import view_config

@view_config(route_name="scan")
def scan(request):
return return Response(request.matchdict['one'])

 

浏览器访问
127.0.0.1:6543/scan/test 查看效果


路由语法规则

*

/foo/*fizzle
/foo/La%20Pe%C3%B1a/a/b/c
{'fizzle':(u'La Pe\xf1a', u'a', u'b', u'c')}

.

foo/{baz}/{bar}{fizzle:.*}
foo/1/2/ -> {'baz':u'1', 'bar':u'2', 'fizzle':()}
foo/abc/def/a/b/c -> {'baz':u'abc', 'bar':u'def', 'fizzle': u'a/b/c')}

 

生成url

config.add_route('scan','/scan/{one}')
url = request.route_url('scan', one='1000')

 

404

config.add_view('pyramid.view.append_slash_notfound_view',
context='pyramid.httpexceptions.HTTPNotFound')

自定义404

from pyramid.httpexceptions import HTTPNotFound
from pyramid.view import AppendSlashNotFoundViewFactory

def notfound_view(context, request):
return HTTPNotFound('It aint there, stop trying!')

custom_append_slash = AppendSlashNotFoundViewFactory(notfound_view)
config.add_view(custom_append_slash, context=HTTPNotFound)

route debug

PYRAMID_DEBUG_ROUTEMATCH=true \ paster serve development.ini

route include

def add_views(config):
config.add_view('myapp.views.view1', name='view1')
config.add_view('myapp.views.view2', name='view2')

config.include(add_views)

include prefix

def users_include(config):
config.add_route('show_users', '/show')

config.include(users_include, route_prefix='/users')
/users/show


Custom Route

def any_of(segment_name, *allowed):
def predicate(info, request):
if info['match'][segment_name] in allowed:
return True
return predicate

num_one_two_or_three = any_of('num', 'one', 'two', 'three')

config.add_route('route_to_num', '/{num}',
custom_predicates=(num_one_two_or_three,))
/one
/two
/three

 

def integers(*segment_names):
def predicate(info, request):
match = info['match']
for segment_name in segment_names:
try:
match[segment_name] = int(match[segment_name])
except (TypeError, ValueError):
pass
return True
return predicate

ymd_to_int = integers('year', 'month', 'day')

config.add_route('ymd', '/{year}/{month}/{day}',
custom_predicates=(ymd_to_int,))

posted on 2011-10-20 00:07  bluefrog  阅读(2431)  评论(0编辑  收藏  举报