django中path解释器的原理解释
from django.urls import converters
# ctrl+b 打开converters.py,取其中一个类作为解释
class IntConverter: regex = '[0-9]+' # 定义的正则匹配规则 def to_python(self, value): # 浏览器端返回的url传递到urls.py中进行匹配,符合匹配规矩,将参数传入,这时此方法会将浏览器中url传递进来的参数进行类型转换,再传入view.py中对应的视图函数里 return int(value) def to_url(self, value): # 这个用于url重定向时,reserve在使用kwargs传递参数时,会将参数的类型进行转化传递到浏览器的url中 return str(value)
完成类型转换后还需要进行注册,django中converters.py注册代码如下
DEFAULT_CONVERTERS = { 'int': IntConverter(), 'path': PathConverter(), 'slug': SlugConverter(), 'str': StringConverter(), 'uuid': UUIDConverter(), } # 默认已经注册的解释器类 REGISTERED_CONVERTERS = {} def register_converter(converter, type_name): REGISTERED_CONVERTERS[type_name] = converter() get_converters.cache_clear() # converter解释器的类名,调用时的别名
开始定义自定义的path解释器,实现如下功能
在应用目录新建converters.py,在应用的目录下的__init__.py文件中写入from . import converters,进行初始化,converters.py代码如下
from django.urls import converters,register_converter class CategoryConverter(object): '''自定义的path解释器''' regex = r'w+|(w++w+)+' def to_python(self, value): result = value.split("+") return result def to_url(self, value): if isinstance(value, list): result = "+".join(value) return result else: raise RuntimeError("转换url的时候,分类参数必须为列表") register_converter(CategoryConverter, 'cate')
views.py部分代码
1 from django.shortcuts import render,HttpResponse,redirect,reverse 2 3 def article(request): 4 return HttpResponse('文章首页') 5 6 def article_list(request, categories): 7 text = '你填写的分类是:%s' % categories 8 return HttpResponse(text) 9 10 def artcile_detail(request, article_id): 11 reverse('detail', kwargs={'article_id':article_id}) 12 return HttpResponse('文章详情')
urls.py部分代码
1 from django.urls import path,include,re_path 2 from booktest import views 3 from django.urls import converters 4 # ctrl+b 打开converters.py 5 6 urlpatterns = [ 7 path('^article/$', views.article), 8 path('article/list/<cate:categories>/', views.article_list), 9 path('article/detail/<int:article_id>', views.artcile_detail), 10 ]
浏览器返回页面: