zoukankan      html  css  js  c++  java
  • 路由控制

    1. 简单的路由配置

    • 作用:URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表
    • 格式:
    from django.conf.urls import url
    from django.contrib import admin
    from app名 import views
    urlpatterns = [
         url(r'^admin/', admin.site.urls),
         url(正则表达式, views视图函数,参数,别名),
    ]
    (1)正则表达式:一个正则表达式字符串
    (2)views视图函数:一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
    (3)参数:可选的要传递给视图函数的默认参数(字典形式)
    例:
    url(r'^register/$', views.register,{'name':'qqc','age':'11'}),视图函数中要有相对应的参数进行接收
    (4)别名:一个可选的name参数
    • 例子
    注:Django settings.py配置文件中默认没有 APPEND_SLASH 这个参数,但 Django 默认这个参数为 APPEND_SLASH = True其作用就是自动在网址结尾加'/'伪静态(以ntml结尾),方便搜索引擎收录.
    

    2. 分组

    2.1 无名分组

    • 格式:url(r'^admin/', admin.site.urls),
    • 第一个参数,可以写一个正则表达式 从上往下匹配,一旦匹配成功,就不往下走了 如果分几个个组,相应的视图函数,就应该接收几个

    2.2 有名分组

    • 格式:
    url('地址/(?P<name>pattern)', views.函数名)
    注:name 是组的名称,pattern 是要匹配的模式
    --------------------------------------
    例子:
    url(r'^test/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})', views.test)
    对应的函数:
    def test(request,month,year):
        print(year)
        print(month)
        return HttpResponse('ok')
    
    注:
    (1)名字必须一致,否则报错,位置可以颠倒,如果分了两个组,必须用两个参数接
    (2)有名分组和无名分组不要混用
    (3)有名分组可以用**kwargs接收,无名分组可以用*args接收
    (4) 分组捕获的参数,都是str类型,捕获的值作为关键字参数而不是位置参数传递给视图函数
    (5)视图函数可以设置默认参数
    

    3. 路由分发

    • 步骤
    (1)在主urls文件导入from django.conf.urls import include
    (2)在主urls文件设置所要分发的app文件,
    两种方式:
    url(r'^app01/', include('app01.urls')),
    url(r'^app01/', include(urls))
    (3)urlpatterns 不能变名字,app文件中的url格式相同

    例:

    主urls:
    from django.conf.urls import url,include
    from django.contrib import admin
    from app01 import views
    from app01 import urls
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^app01/',include('app01.urls')),
    ]
    
    app文件中的urls:
    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^func/(?P<year>[0-9]{2})/(?P<month>[0-9]{1})', views.func),
    ]
    

      

     app 文件中的视图函数:
    from django.shortcuts import render 
    from django.shortcuts import render,HttpResponse,reverse 
    def func(request,year,month): 
        print(month) print(year) 
    return HttpResponse ('my app01') 
     
    • Django 版本区别
    2+版本的re_path 就是1+版本的url
    2+版本多了一个path,不支持正则
    

    4. 反向解析

    • 作用:修改路由中的URL时,其他地方无需改动也可访问原来的地址
    • 导入模块from django.shortcuts import reverse
    • 在视图函数中
    urls文件:
      url(r'^test',views.test2),
      #绑定name='n',即使访问地址改变也可以找到
      url(r'^index555/',views.index,name='n'),
      
    views 文件:
    def test2(request):
        url=reverse('n')
        #通过reverse()得到改变过后的地址 /index555/ (原来的地址是index)
        print(url) 
        #将url(改变后的地址)传入,返回之前的信息 '我是index'
        return redirect(url)  
        # return HttpResponse ('hhhhhhhhhh')
    def index(request):
        return HttpResponse ('我是index')
    • 在模板中使用 {% url 'n1'%}
    • 带位置参数
    url(r'^index/([0-9]{4})/([0-9]{2})', views.index,name='n1'),
    
    视图:url=reverse('n1',args=(2012,12,))
    
    模板:{% url 'n1' 2012 12 %}
    注:按顺序传顺序是固定的
    
    • 带关键字参数
    url(r'^index/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})', views.index,name='n1'),
    
    视图:url=reverse('n1',args=(2012,12,) 或者
    url=reverse('n1',kwargs={'year':2014,'month':12})
    			  
    模板:
    {% url 'n1' 2012 12 %}----可以
    {% url 'n1' month=12 year=2012 %}----可以
    5. 名称空间
    

      

    • 反向解析时,不同的app文件的url中name指定的名字相同 那么在路由分发时可以指定名称空间namespace='app01'

    6. Django 2.0+ 版本

    • django2.0的re_path和1.0的url一样
    • path
    导入:
    from django.urls import path
    #不支持正则,精准匹配
    #有五个转换器
    (1)str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
    (2)int,匹配正整数,包含0。
    (3)slug,匹配字母、数字以及横杠、下划线组成的字符串。
    (4)uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
    (5)path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)
     
     用法:
     path('index/<int:year>',views.index)
     -----------------------------------
    注:在<>内指定转换器和参数,根据转换器规则匹配;
    如果没有转换器将匹配任意字符;
    无需添加前导斜杠
    
    • 注册自定义转换器
    class Test:
        regex='[a-z]{3}'
        def to_python(self,value):
            return str(value)
        def to_url(self,value):
            return '%03s' %value
    # 定义个转化器msg,注册到url配置中
    register_converter(Test,'msg')
    urlpatterns = [
        path('index/<msg:y>',views.index)
    ]
    
    (1)regex 类属性,字符串类型
    (2)to_python(self, value) 方法,value是由类属性 regex 所匹配到的字符串,返回具体的Python变量值,以供Django传递到对应的视图函数中。
    (3)to_url(self, value) 方法,和 to_python 相反,value是一个具体的Python变量值,返回其字符串,通常用于url反向引用。
  • 相关阅读:
    VS 2017 没有工具栏中没有Report Viewer的解决方案
    数据类型和C#关系对应
    .NET CORE部署各种问题
    .NET CORE AutoMapper使用
    .NET CORE 配置Swagger文档
    window快捷登陆linux的的设置方式(设置ssh的config配置)
    linux安装mongodb并启动
    windows更改DNS设置
    scp的使用
    浏览器缓存机制
  • 原文地址:https://www.cnblogs.com/quqinchao/p/10187294.html
Copyright © 2011-2022 走看看