Python-Django 路由控制器

1 路由的基本使用:

# url是个函数,有四个参数,第一个参数要传正则表达式,第二参数传函数内存地址,第三个参数传默认参数,第四个是路由的别名
url(r'^liuqingzheng/article/aa.html$', views.test),
-路由从上往下匹配,一旦匹配成功,后面就不继续匹配了

2 路由的无名分组

url(r'^test2/(\d+)/(\w+)$', views.test2),
无名分组分出几个值,视图函数就要接受几个值(位置参数形式传过来的)

写一个无名分组路由,请求格式为:article/2018/12,在浏览器界面显示:您要查看2018年12月的文章

url(r'^article/(\d+)/(\d+)$', app01_views.wuming),
def wuming(request,year,month):
print(year,month)
return HttpResponse('您要查看%s年%s月的文章' %(year,month))

3 路由的有名分组

url(r'^test3/(?P<id>\d+)/(?P<name>\w+)$', views.test3),
有名分组分出几个值,视图函数就要接受几个值(按关键字传入,位置可以打乱)

写一个有名分组路由,请求格式为:user/lqz,在浏览器界面显示:您要查看名字为lqz该人的信息

url(r'^user/(?P<name>\w+)$', app01_views.youming),
def youming(request,name):
print(name)
return HttpResponse('您要查看名字为%s该人的信息' %(name))

4 有名和无名不能混着用

5 在settings中配置(以后项目,一般不用动)

# 默认是true,浏览器浏览的时候,默认加上斜杠
# 如果是False,浏览器默认不会加/
# APPEND_SLASH=False

6 路由分发

1 导入include
-from django.conf.urls import include
2 在主路由中:
url(r'^app01/', include('app01.urls')),
url(r'^app02/', include('app02.urls')),
3 在不同app中新建一个urls
from app01 import views
urlpatterns = [
url(r'^test/', views.test),
]
4 如果浏览器输入app01/test/,就会响应到app01下views中的test取执行

-新建app01,app02,
# -当用户访问app01/test/ 响应到app01的视图函数test
# -当用户访问app02/test/ 响应到app02的视图函数test
url(r'^app01/',include('app0108.urls')),
url(r'^app02/',include('app02.urls'))


7 反向解析:

干什么用?
-在视图函数中重定向的地址原来是写死的,如果url地址变更,我需要所有的url都修改,很麻烦,所有可以通过反向解析,获得url的地址
如何使用:
-路由层:
url(r'^test_2/$', views.test2,name='test2'),
-视图层:
from django.shortcuts import reverse
url=reverse('url地址的别名')
#如果做了分组
url=reverse('url地址的别名',args=[],kwargs={})
-模板层:
{% url 'url地址的别名'%}
#如果做了分组
{% url 'url地址的别名' 参数1 参数2%}

 # 1 当访问'/user/'路径时,重定向到'/userlist/'页面
# 2 当访问'/user/?id=10'路径时,重定向到'/userlist/10'页面
url(r'user/$',app01_views.user),
url(r'userlist/(\d+)?$',app01_views.userlist,name='userlist'),
# 3 在模板(html中)层通过反向解析,解析出'userlist/10'的的地址
url(r'^test$', app01_views.test),

def user(request):
id = request.GET.get('id')
print(id)
if id:
url=reverse('userlist',args=(id,))
else:
url=reverse('userlist')
print(url)
return redirect(url)

def userlist(request,id):
if id:
return HttpResponse('userlist:%s的页面' % (id))
return HttpResponse('userlist ok')

def test(request):
return render(request,'test.html')

<body>
<p>app1-test</p>
<a href="{% url 'userlist' '10' %}">userlist</a>
</body>



8 名称空间

-路由分发时,可以指定名称空间:
-url(r'^app01/', include('app01.urls',namespace='app01')),
-url(r'^app02/', include('app02.urls',namespace='app02')),

-在视图中反向解析:
url=reverse('app01:test')
-在模板中反向解析:
{% url 'app01:url地址的别名'%}
-个人不建议这么使用:
在不同app的urls中起别名的时候,添加:app名_别名


9 django 2.0的path,re_path(了解)

-1.几的url就是2.几的re_path
-2.0的path 第一个参数不再是正则表达式
-5个转换器:int,str,slug,path,uuid


10 自定义转换器(了解):

-1 写一个类:
class MyCon:
regex = '[0-9]{4}'
def to_python(self, value):
return int(value)
def to_url(self, value):
return '%04d' % value
-2 在urls中:
-from django.urls import register_converter
-register_converter(类名,'别名')

-path('test/<别名:year>', views.test,name='year'),

猜你喜欢

转载自www.cnblogs.com/du-jun/p/10241273.html