Django入门到放弃之路由

1.url路由分发之include

# 项目文件夹下的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 无名分组的使用
    ### 无名分组,把分组分出来的值,当作位置参数传递给视图函数
    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.位置参数

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.位置参数默认值

 

# 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 通过路由的别名,解析出路由的地址
url(r'/home/',views.home,name='home')
2 用在视图函数中:
    url=reverse('home')  # home就是路由的别名
    print(url)
    
3 模板文件中使用
    {% url 'home' %}
    
4 有什么作用
    -动态根据路由别名获得路径,一旦路径改变,不需要改其他代码

有参反向解析

# 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 在做路由分发时,给每个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.转化器

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.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),  
    ...  
]

  

   

posted @ 2022-08-27 22:06  百衲本  阅读(27)  评论(0编辑  收藏  举报
cnblogs_post_body { color: black; font: 0.875em/1.5em "微软雅黑" , "PTSans" , "Arial" ,sans-serif; font-size: 15px; } cnblogs_post_body h1 { text-align:center; background: #333366; border-radius: 6px 6px 6px 6px; box-shadow: 0 0 0 1px #5F5A4B, 1px 1px 6px 1px rgba(10, 10, 0, 0.5); color: #FFFFFF; font-family: "微软雅黑" , "宋体" , "黑体" ,Arial; font-size: 23px; font-weight: bold; height: 25px; line-height: 25px; margin: 18px 0 !important; padding: 8px 0 5px 5px; text-shadow: 2px 2px 3px #222222; } cnblogs_post_body h2 { text-align:center; background: #006699; border-radius: 6px 6px 6px 6px; box-shadow: 0 0 0 1px #5F5A4B, 1px 1px 6px 1px rgba(10, 10, 0, 0.5); color: #FFFFFF; font-family: "微软雅黑" , "宋体" , "黑体" ,Arial; font-size: 20px; font-weight: bold; height: 25px; line-height: 25px; margin: 18px 0 !important; padding: 8px 0 5px 5px; text-shadow: 2px 2px 3px #222222; } cnblogs_post_body h3 { background: #2B6695; border-radius: 6px 6px 6px 6px; box-shadow: 0 0 0 1px #5F5A4B, 1px 1px 6px 1px rgba(10, 10, 0, 0.5); color: #FFFFFF; font-family: "微软雅黑" , "宋体" , "黑体" ,Arial; font-size: 18px; font-weight: bold; height: 25px; line-height: 25px; margin: 18px 0 !important; padding: 8px 0 5px 5px; text-shadow: 2px 2px 3px #222222; } 回到顶部 博客侧边栏 回到顶部 页首代码 回到顶部 页脚代码