替换django.conf.urls.defaults的一个drop-in,它支持http动词分派和视图包装。
django-reroute的Python项目详细描述
django reroute是一组简化视图的工具,特别是在实现rest api时。django reroute为支持http动词分派的django.conf.urls.defaults提供了一个替换项,这样您的视图就不会被if request.method == 'GET'语句弄乱。它还提供了一组漂亮的视图装饰器,用于简化常见任务,如使用requestcontext呈现模板,以及在请求处理后重定向到特定视图。
新闻
django 1.3现在从v1.1.1开始支持
下载
github:http://github.com/dnerdy/django-reroute
易于安装:
easy_install django-reroute
来源:
# Download the source and run python setup.py install
将django reroute添加到项目中
django reroute是django.conf.url的替换项。默认值:
# Replace from django.conf.urls.defaults * # with from reroute import *
尽管最好是直截了当:
# Replace from django.conf.urls.defaults import handler404, handler500, patterns, url, include # with from reroute import handler404, handler500, patterns, url, include
http动词调度
除了regex之外,谓词url模式还可以匹配http谓词:
from reroute.verbs import verb_url urlpatterns = patterns('myapp.views', url('^regular$', 'regular_old_view'), verb_url('GET', '^restful$', 'restful_view') )
verb_url模式regex可以重载,仅基于http verb启用路由:
urlpatterns = patterns('myapp.views', verb_url('GET', '^restful$', 'restful_view'), verb_url('PUT', '^restful$', 'another_restful_view') )
restful资源示例:
paychecks = patterns('myapp.views.employees.paychecks', verb_url('GET', '^paychecks$', 'index_paychecks'), verb_url('POST', '^paychecks$', 'add_paycheck'), ) urlpatterns = patterns('myapp.views.employees', verb_url('GET', '^employees$', 'index_employees'), verb_url('POST', '^employees$', 'add_employee'), verb_url('GET', '^employees/(?P<employee_id>\d+)$', 'show_employee') verb_url('PUT', '^employees/(?P<employee_id>\d+)$', 'update_employee') verb_url('DELETE', '^employees/(?P<employee_id>\d+)$', 'delete_employee'), url('^employees/(?P<employee_id>\d+)/', include(paychecks)), )
渲染模板
返回要添加到模板上下文的值字典:
@render('template.html') def view(request): return {'title': 'This is the page title'} # The template is rendered using a RequestContext instance
如果需要,返回一个httpresponse,它将被使用:
@render('template.html') def view(request): if special_case: return HttpResponse('This response will be used instead of rendering template.html') else: return {'title': 'This is the page title'}
重定向
返回一个值字典,用作反向Kwargs:
@redirect('other_view_name') def view(request): return {'view_kwarg': 42} # This is equivalent to: # return HttpResponseRedirect(reverse('other_view_name', kwargs={'view_kwarg': 42})) @render('other_tempate.html') def other_view(request, view_kwarg): return { 'title': 'This is the other view page title', 'message': 'Meaning of life? {0}'.format(view_kwarg) }
同样,如果您返回一个httpresponse,它将被使用:
@redirect('other_view_name') def view(request): if special_case: return HttpResponse('This response will be used instead of redirecting') else: return {'view_kwarg': 42}
内部:包装器
包装器类似于应用于一组选择性url的中间件。包装器是任何可以调用的参数:view,request,*args,**kwargs:
import logging from reroute import reroute_patterns def wrapper_one(view, request, *args, **kwargs): logging.debug("wrapper one") return view(request, *args, **kwargs) def wrapper_two(view, request, *args, **kwargs): logging.debug("wrapper two") return view(request, *args, **kwargs) urlpatterns = reroute_patterns([wrapper_one, wrapper_two], 'myapp.views', verb_url('GET', '^restful$', 'restful_view'), verb_url('PUT', '^restful$', 'another_restful_view') )
您甚至可以自己制作替换图案的插件:
from functools import partial patterns = partial(reroute_patterns, [wrapper_one, wrapper_two]) urlpatterns = patterns('myapp.views', verb_url('GET', '^restful$', 'restful_view'), verb_url('PUT', '^restful$', 'another_restful_view') )
版本1.1.1中的更改
- [new]增加了对django 1.3的支持
版本1.1.0中的更改
- [new]将render和redirectdecorators添加到reroute.decorators,以简化公共视图任务(即呈现模板或重定向到另一个视图)
- [fixed]动词URL模式偶尔分组不正确,导致405个响应。python维护一个在100个条目之后被清除的regex缓存,verb_url模式由regex对象分组,而不是regex模式。清除缓存后,具有相同regex模式的regex对象不再相等。
版本1.0.1中的更改
- [fixed]pypi包不能与pip一起工作
版本1.0.0中的更改
- [new]添加了对csrf免除装饰符的支持
- [fixed]不正确的默认kwargs用于具有相同regex的谓词url模式