zoukankan      html  css  js  c++  java
  • Django之路由

    django的请求生命周期

    那么今天我们就来看看这个路由层(urls)

    无名分组

    在urls.py文件中添加一个()需要传参给app里面views中的视图函数

    from app01 import views
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^test/([0-9]{4})/',views.test),
    ]
    def test(request,xxx):
        print(xxx)
        return HttpResponse('test')

    由此可以看到这是类似函数的位置参数,同理我们联想倒关键字传参

    有名分组

    在urls.py文件中添加一个(?P<keyword>content)需要传有名参数给app里面views中的视图函数

    from app01 import views
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^test/([0-9]{4})/',views.test),
        url(r'^testadd/(?P<year>[0-9]{4})',views.testadd),
    ]
    def testadd(request,year):
        print(year)
        return HttpResponse('testadd')

    值得注意的是有名分组和无名分组不能够混合使用,可以一次传多个无名分组的数据,也可以一次传多个有名分组数据

    反向解析之动态解析

    无名反向解析

    前端反向解析
    {% url 'add' 1 %} # {% url '放urls.py中路由与视图函数的name的值' %} 

    后端反向解析
    from django.shortcuts import reverse

    url(r'^testadd123/(d+)/$',views.testadd,name='add')

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
       # 无名分组的反向解析
        url(r'^test/(d+)/',views.test,name='num')
    ]

    此时对于我的视图函数

    def test(request,xxx):
        print(xxx)
        print(reverse('num',args=(10,)))
        return HttpResponse('test')

    如果对于路径urls的test是可以随意更改,我们不妨更改为test123,依然可以获取到视图函数test的响应

     url(r'^test123/(d+)/',views.test,name='num')
    在浏览器中输入http://127.0.0.1:8000/test/1234依然是得到响应test
    如果返回是一个HTML文件的话如:
    又如在返回前端很多a标签时,它的路径已经写死了,这时候如果修改的话非常麻烦,如果有反向解析就可以解决这个问题,
    当然动态获取{% url 'num' 1 %} 是需要加上这个1的


    有名反向解析

    有名分组的反向解析
    前端反向解析
    {% url 'add' 1 %} # {% url '放urls.py中路由与视图函数的name的值' %} 推荐你用这种

    <a href="{% url 'add' year=1 %}">999</a>
    后端反向解析
    res = reverse('add',args=(1,)) # 推荐你用这种

    res = reverse('add',kwargs={'year':1})

     
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^testadd/(P<year>d+)/',views.testadd,name='numadd'),
    ]
    def testadd(request,year):
        print(reverse('numadd',args=(10,)))
        return HttpResponse('testadd')

    只不过是传参数的时候还是需要把year有名传过来

    我们这时候把正则匹配的teatadd改为testadd123

    浏览器输入http://127.0.0.1:8000/testadd2019/1234依然是可以访问到testadd的响应的

    又如在返回前端很多a标签时,它的路径已经写死了,这时候如果修改的话非常麻烦,如果有反向解析就可以解决这个问题,
    当然动态获取{% url 'numadd' year=1 %} 是需要加上这个1的

    路由分发

    总路由不再直接做路由与视图函数的对应关系,而是将获取的路由分发给下面的app去处理对应关系
    from django.conf.urls import include

    所以总路由的正则匹配一定不要加$

     由于各个app里面的视图函数名字可能一样

    方法一:我们可以采取起别名的方式避免冲突

    from app01 import urls as app01_url

    from app02 import urls as app02_urls

    小伙伴们是不是想到作用域和名称空间

    方法二:名称空间

    url(r'^app01/',include(urls,namespace='app01')),
    url(r'^app02/',include(urls,namespace='app02'))

    方法三:可以在视图函数名字前面加上app名字如app01_urls

    方法四:直接用字符串搞定,都不要导入了

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

    伪静态网页

    假装自己的路径是一个静态(数据写死的)文件的路径,其实你
    是经过了视图函数处理,动态渲染页面
    提高百度收藏你这个网页力度,当别人搜索你这个页面相关的内容
    百度会优先展示你的页面(这样虽然能提高你网页被访问概率,但是还是干不过RMB玩家)

    虚拟环境

    (演示一下虚拟环境,下载django2.0测试自定义转换器)
    由来:
    每个项目用到的模块不一样
    目的:
    为了让每一个项目都有仅仅属于自己的项目解释器
    使用:
    new project的时候选择虚拟环境创建项目
    如果勾选了下面的make to all project你创建的虚拟环境就能够被其他新建的项目使用


    django2.0与django1.0的区别(了解)
    1.0里面的url对应django2.0里面re_path
    django2.0里面的path第一个是精准匹配(你怎么写的,我就怎么匹配)
    django1.0版本中匹配到的参数都是字符串类型


    django2.0转换器
    1.0版本的url和2.0版本的re_path分组出来的数据都是字符串类型
    默认有五个转换器,感兴趣的自己可以课下去试一下
    str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
    int,匹配正整数,包含0。
    slug,匹配字母、数字以及横杠、下划线组成的字符串。
    uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
    path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)

    path('index/<str:id>/',index )


    django2.0自定义转换器
    # 自定义转换器
    class FourDigitYearConverter:
    regex = '[0-9]{4}'
    def to_python(self, value):
    return int(value)
    def to_url(self, value):
    return '%04d' % value
    register_converter(FourDigitYearConverter, 'yyyy')

    urlpatterns = [
    path('admin/', admin.site.urls),
    # path('index/<int:id>/',index ),
    # path('index/<str:id>/',index ),
    path('login/<yyyy:name>/',index)

    承蒙关照
  • 相关阅读:
    oracle中rownum和rowid的区别和用法
    jsp中,对window对象的简单总结
    下拉列表框实现二级联动
    window.showModalDialog()的简单用法
    javascript中的正则表达式
    java实现树型结构样式
    几个数据库的驱动、连接
    Java桌面程序中设置一个软件的系统托盘
    【动态规划】求两字符串连续最大公共子串长度
    大整数相乘
  • 原文地址:https://www.cnblogs.com/guanlei/p/11000917.html
Copyright © 2011-2022 走看看