第三篇.路由控制

一.Django中路由的作用

url配置就像Django所支撑网站的目录,本质是要为该url调用视图函数的映射表,也就是以这种方式告诉Django,对应客户端发来的某个url调用哪一段逻辑代码对应执行.

二.简单的路由配置

2.3APPEND_SLASH

setting.py下配置APPEND_SLASH

# 为假,不会加反斜杠,默认为True
# APPEND_SLASH=False

定义了urls.py

from django.conf.urls import url
from app01 import views

urlpatterns = [
        url(r'^blog/$', views.blog),
]
访问 http://www.example.com/blog 时,默认将网址自动转换为 http://www.example/com/blog/ 。
如果在settings.py中设置了 APPEND_SLASH=False,此时我们再请求 http://www.example.com/blog 时就会提示找不到页面。

三.无名分组

3.1按位置传参

-分组之后,会把分组出来的数据,当位置参数,传到视图函数,所以,视图函数需要定义形参
-url(r'^publish/([0-9]{4})/([0-9]{2})$', views.publish),
-def publish(request,*args):   视图函数可以这样接收

3.2无名分组的应用

urls.py下配置

from django.conf.urls import url,include
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r'^publish/([0-9]{4})/([0-9]{2})$', views.publish)
]

views.py下配置

from django.shortcuts import render, HttpResponse,redirect,reverse
def publish(request, *args,**kwargs):#无名分组
    if request.method == 'GET':
        # print(year)
        # print(mounth)
        print(args)
        print(kwargs)
        return HttpResponse('publishok')
    elif request.method == 'POST':
        return HttpResponse('post')

四.有名分组

4.1正则分组的应用

import re
ret=re.search('(?P<year>[0-9]{4})/([0-9]{2})/(?P<month>[0-9]{4})','1999/11/1102')
print(ret.group())
print(ret.group(1))
print(ret.group(2))
print(ret.group('year'))
print(ret.group('month'))

上面的示例使用简单的、没有命名的正则表达式组(通过圆括号)来捕获URL 中的值并以位置 参数传递给视图。在更高级的用法中,可以使用命名的正则表达式组来捕获URL
中的值并以关键字 参数传递给视图。
在Python 正则表达式中,命名正则表达式组的语法是(?P<name>pattern),其中name 是组的名称,pattern 是要匹配的模式。

4.2按关键字传参

-按关键字传参
-有名分组之后,会把分组出来的数据,当关键字参数,传到视图函数,所以,视图函数需要定义形参,形参名字要跟分组的名字对应,与顺序无关
-url(r'^publish/(?P<year>[0-9]{4})/(?P<mounth>[0-9]{2})/$', views.publish),
-def publish(request, mounth,year):
*****有名分组和无名分组,不要混用

4.3有名分组的应用

urls.py下的配置

from django.conf.urls import url,include
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^publish/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.publish),
]

views.py下的配置

# def publish(request, mounth,year):#有名分组
def publish(request, *args,**kwargs):#无名分组
    if request.method == 'GET':
        # print(year)
        # print(month)
        print(args)
        print(kwargs)
        return HttpResponse('publishok')
    elif request.method == 'POST':
        return HttpResponse('post')

总结:有名分组和无名分组不要混用

五反向解析

5.1反向解析的步骤

第一步:先命一个名:

-1 无参数:url(r'^publishadd133/$', views.publishadd,name='ddd'),
            -2 无名分组:url(r'^publishadd/([0-9]{4})/([0-9]{2})/$', views.publishadd,name='ddd'),
            -3 有名分组:url(r'^publishadd/(?P<year>[0-9]{4})/(?P<mounth>[0-9]{2})/$', views.publishadd,name='ddd'),

第二步:在模板层:

-1 无参数:{% url 'ddd' %}
            -2 无名分组的:{% url 'ddd' 2018 12 %}
            -3 有名分组:{% url 'ddd' 2018 12 %}  还可以 {% url 'ddd' year=2018 mounth=12 %}

第三步:在视图层:

from django.shortcuts import reverse
            在视图函数里:
            1 无参数:url=reverse('ddd')
            1 无名分组:url=reverse('ddd',args=(2018,12,))
            1 有名分组:url=reverse('ddd',args=(2018,12,)) 还可以 url=reverse('ddd',kwargs={'year':2018,'mounth':12})

5.2反向解析的应用

urls文件

from django.conf.urls import url,include
from django.contrib import admin
from app03 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^test1/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.url_test,name='test'),
]

views文件

from django.shortcuts import render, HttpResponse,redirect,reverse
def url_test(request,year,month):
    print(year)
    print(month)
    # url=reverse('test',args=(1989,11))#这样可以
    url=reverse('test',kwargs={'month':12,'year':2018})
    print(url)
    return render(request,'publish.html')

publish.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<a href="{% url 'test' 1989 10 %}">哈哈</a>
</body>
</html>

六.路由分发

6.1有什么用:

以后路由关系越来越多,可以把每一个app的路由分到自己里面,自己做处理做分发,协同开发可以自己写路由,不用去总的里面一条一条加

6.2路由分发

1 在不同的app里创建urls.py
2 在总路由 
    -from django.conf.urls import include 
    -url(r'^blog/',include('clog.urls')),
    -url(r'^app01/',include('app01.urls')),
3 在不同的app的urls里配置路由关系    
***重点***总路由,不能加结束符$

 第一步:创建app

第二步:setting里面记得设置

P.S

第三步:相关代码

分到app01 app

分到clog app里面

第四步最终结果

   

七.名称空间

-url(r'^blog/',include('blog.urls',namespace='blog')),
        -子路由:url(r'^publish/$', views.publish,name='test'),
        -反向解析:
            -视图层:url = reverse('blog:test')#现在指定了名称空间下的他
            -模板层:{% url 'app01:test'%}
        ***一般不要用***
            子路由:url(r'^publish/$', views.publish,name='app01_test')

八.Django2.0版本的repath和path

8.1repath的用法

django2.0的re_path和1.0的url一样

urls文件

from django.contrib import admin
from django.urls import path,re_path
from app03 import views

urlpatterns = [
    # re_path('正则',视图函数),
    re_path('^test/(?P<year>\d+)',views.re_test),
]

views文件

from django.shortcuts import render,HttpResponse
# Create your views here.
def re_test(request,year):
    print(year)
    print(type(year))
    return HttpResponse('这就是结果')

8.2path的用法

urls文件

from django.contrib import admin
from django.urls import path,re_path
from app03 import views

urlpatterns = [
    # path传的第一个参数,不是正则,准确的路径,不支持正则
    path('test/<int:year>',views.re_test),
]
#一般从前台传过来都是字符串类型,转换器能转成整数类型或别的类型

views文件

from django.shortcuts import render,HttpResponse
# Create your views here.
def re_test(request,year):
    print(year)
    print(type(year))
    return HttpResponse('这就是结果')

8.3path转化器

Django默认支持以下5个转化器:

str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
int,匹配正整数,包含0。
slug,匹配字母、数字以及横杠、下划线组成的字符串。
uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)

8.4自定义转化器

总结

1 定义一个类:
    class MyCon:
        # 写一个正则表达式
        regex = '[0-9]{4}'
        # 匹配出來的数据,会传到这里,retrun回去的,会被视图函数接收
        def to_python(self, value):
            return int(value)
        # 反向解析用的
        def to_url(self, value):
            return '%04d' % value
2 from django.urls import register_converter
  register_converter(MyCon,'yyy')
3 path('test/<yyy:year>', views.re_test,name='test'),

urls文件

from django.contrib import admin
from django.urls import path,re_path,register_converter
from app03 import views
#自定义转化器
#1 定义一个类 里面必须有3个东西, 差一个都会报错
class MyCon:
    # 写一个正则表达式
    regex="[0-9]{4}"
    # 匹配出来的数据,会传到这里,return回去的,会被试图函数接受
    def to_python(self,value):#这个value对应下面的year,传进来的字符串year返回去是整数year
        return int(value)
    #反向解析用的
    def to_url(self,value):
        return '%04d'%value

register_converter(MyCon,'yyy')#和下面的yyy匹配上

urlpatterns = [
    path('test/<yyy:year>',views.re_test,name="test"),
]
#一般从前台传过来都是字符串类型,转换器能转成整数类型或别的类型

views文件

from django.shortcuts import render,HttpResponse,reverse#reverse用于反向解析
# Create your views here.
def re_test(request,year):
    print(year)
    print(type(year))
    url=reverse('test',args=(9,))
    print(url)
    return HttpResponse('这就是结果')

小知识点

#占8位,不够的话,用0补全,多了全部显示
print("%08d"%123)

八.伪静态

伪装成静态文件,其实不是静态文件,方便百度收录

-路由:url(r'^book/(?P<id>\d+.html)',views.book),#在路由上处理很简单加正则匹配就可以
        -访问:http://127.0.0.1:8000/book/4.html

 

posted @ 2019-03-09 02:02  王苗鲁  阅读(261)  评论(0)    收藏  举报