Django入门到放弃之路由

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Django入门到放弃之路由

1.url路由分发之include

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

# 项目文件夹下的urls.py文件中的url写法:

    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'^$', views.base),

        url(r'^app01/', include('app01.urls')),

        url(r'^app02/', include('app02.urls')),

 

    ]

    

# app01下urls.py内容写法

    from django.conf.urls import url

    from django.contrib import admin

    from app01 import views

    urlpatterns = [

        # url(r'^admin/', admin.site.urls),

        url(r'^$', views.app01base),

        url(r'^index/', views.index),

    ]

    

app02下urls.py内容写法  

    from django.conf.urls import url

    from django.contrib import admin

    from app02 import views

 

    urlpatterns = [

        # url(r'^admin/', admin.site.urls),

        url(r'^$', views.app02base),

        url(r'^home/', views.home),

 

    ]

2.有名分组 无名分组

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

#1 无名分组的使用

    ### 无名分组,把分组分出来的值,当作位置参数传递给视图函数

    url(r'^login/([0-9]{4})/([0-9]{2})', views.login),

#2 有名分组的使用

    ### 有名分组,把分组出来的值,当作关键字参数传递给视图函数

    url(r'^login/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})', views.login),

    

#3  有什么作用

    可以从url地址中解析出参数,传递给视图函数使用

    

#4  案例

    # 这种地址,把人名和id分出来

    # 有名分组

    # ilovejaney/p/13748739.html

    url(r'^(?P<name>.*?)/p/(?P<id>\d+).html', views.article),

    # 无名分组

    url(r'^(.*?)/p/(\d+).html', views.article),

 

# 5 伪静态

    -原来是动态页面/login   做成/login.html  伪装成静态页面,便于seo优化

    -seo优化:

    -https://www.cnblogs.com/liuqingzheng/articles/9509792.html

3.位置参数

1

2

3

4

5

6

7

8

9

url(r'^books/(\d{4})/', views.year_books), #匹配年份的

url(r'^books/(\d{4})/(\d{1,2})/', views.year_month_books), #匹配年份和月份的

# http://127.0.0.1:8000/books/2001/

视图:

    def year_month_books(request,year,month): #位置参数,第一个参数接收的就是无名分组路径中匹配

    到的第一个分组的数据,第二个参数接收的就是无名分组路径中匹配到的第二个分组的数据

    print(year,month)

    # return render(request,'books.html')

    return HttpResponse(year+month)

4.位置参数默认值

 

1

2

3

4

5

6

7

8

9

10

# urls.py中

from django.conf.urls import url

from import views

urlpatterns = [

url(r'^blog/$', views.page),

url(r'^blog/page(?P<num>[0-9]+)/$', views.page),

#

views.py中,可以为num指定默认值

def page(request, num="1"):

pass

5.反向解析

无参反向解析

1

2

3

4

5

6

7

8

9

10

11

1 通过路由的别名,解析出路由的地址

url(r'/home/',views.home,name='home')

2 用在视图函数中:

    url=reverse('home')  # home就是路由的别名

    print(url)

    

3 模板文件中使用

    {% url 'home' %}

    

4 有什么作用

    -动态根据路由别名获得路径,一旦路径改变,不需要改其他代码

有参反向解析

1

2

3

4

5

# urls.py

path( 'index/<str:name',views.index, name='login')

# 视图函数

url==reverse('login',args=['xxx']) # xxx 为字符串

url==reverse('login',kwargs={'name':'xxx'}) # name为有名分组的名称

6.名称空间

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

1 路由做反向解析时,有同名路由,出现问题

2 在做路由分发时,给每个app的路径设置一个名称空间

 

3 使用步骤

    1 在总路由中设置

          # include第二个参数app01: app的名字  namespace='名称空间的名字'

          #     path('app01', include(('app01.urls','app01'),namespace='index')) path 设置 注意 app01后没有/

          url(r'^app01',include(('app01.urls','app01'),namespace='index'))

 

    -2 子路由中:

        url(r'/index/',views.meinv,name='meinv')

    -3 app01 views.py

        def meinv(request):

        url = reverse('index:meinv'# reverse('名称空间的名字:路由的别名')

        print(url)

        return render(request,'index.html')

 

    -3 模板文件中使用 index.html

      <a href="{% url 'index:meinv' %}">哈哈</a>

7.转化器

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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

    str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式

    int,匹配正整数,包含0

    slug,匹配字母、数字以及横杠、下划线组成的字符串。

    uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00

    path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)

    

2 例子

    -path('login/<int:year>', views.login),

    -path('login/<str:year>', views.login),

    -path('login/<path:p>', views.article),

3 高级例子

    -实现匹配这种路径:http://127.0.0.1:8000/liuqingzheng/p/4444.html

    -path('<str:name>/p/<int:id>.html', views.article),

    -re_path(r'^(?P<name>.*?)/p/(?P<id>\d+).html$', views.login),

    -url(r'^(?P<name>.*?)/p/(?P<id>\d+).html$', views.login),  # url在2.x以后不建议使用

    

4 转换器可以不可以在re_path中使用?不能!!!!   

8.自定义转化器

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

对于一些复杂或者复用的需要,可以定义自己的转化器。转化器是一个类或接口,它的要求有三点:

 

1.regex 类属性,字符串类型

2.to_python(self, value) 方法,value是由类属性 regex 所匹配到的字符串,返回具体的Python变量值,以供Django传递到对应的视图函数中。

3.to_url(self, value) 方法,和 to_python 相反,value是一个具体的Python变量值,返回其字符串,通常用于url反向引用。

 

例子:

class FourDigitYearConverter: 

    regex = '[0-9]{4}'

    def to_python(self, value): 

        return int(value) 

    def to_url(self, value): 

        return '%04d' % value

使用register_converter 将其注册到URL配置中:

 

 

from django.urls import register_converter, path 

from import converters, views 

register_converter(converters.FourDigitYearConverter, 'yyyy'

urlpatterns =

    path('articles/2003/', views.special_case_2003), 

    path('articles/<yyyy:year>/', views.year_archive), 

    ... 

]


相关文章
|
17天前
|
前端开发 关系型数据库 Python
Django入门到放弃之分页器
Django入门到放弃之分页器
|
17天前
|
关系型数据库 MySQL 机器人
Django入门到放弃之数据库配置
Django入门到放弃之数据库配置
|
17天前
|
缓存 中间件 数据库
Django入门到放弃之缓存及信号机制
Django入门到放弃之缓存及信号机制
|
17天前
|
前端开发 数据库 数据安全/隐私保护
Django入门到放弃之Auth模块
Django入门到放弃之Auth模块
|
17天前
|
JSON 前端开发 数据安全/隐私保护
Django入门到放弃之CSRF_TOKEN
Django入门到放弃之CSRF_TOKEN
|
17天前
|
前端开发 中间件 索引
Django入门到放弃之中间件
Django入门到放弃之中间件
|
17天前
|
缓存 数据库 数据安全/隐私保护
Django入门到放弃之session
Django入门到放弃之session
|
17天前
|
JavaScript 前端开发 数据安全/隐私保护
Django入门到放弃之cookies
Django入门到放弃之cookies
|
17天前
|
前端开发 网络协议 数据库
Django入门到放弃之forms组件
Django入门到放弃之forms组件
|
17天前
|
JSON 前端开发 JavaScript
Django入门到放弃之ajax
Django入门到放弃之ajax