zoukankan      html  css  js  c++  java
  • Django之路由控制配置

    路由控制配置

    简单的路由配置

    Django即支持1.x版本的路由配置也支持2.x的路由配置

    • 1.x版本的路由配置是使用re进行路由配置(re_path)
    • 2.x版本的路由配置使用(path)进行路由配置
    from django.contrib import admin
    from django.urls import path,re_path
    from app1 import views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('timer/', views.timer),
        path('login/', views.login),
    
        #year_archive(request,year)
        re_path(r'^articles/([0-9]{4})/$',views.year_archive),# 匹配成功之后会将匹配成功的内容传入到year_archive函数中,在views定义函数时要接收两个参数
        re_path(r'^articles/([0-9]{4})/([0-9]{2})/$',views.month_archive)
    ]
    
    

    注意:

    • 若要从URL 中捕获一个值,只需要在它两头放置一对圆括号(捕获的值传递到视图函数中,在定义视图函数的时候也要接收相对应传入的参数)
    • 不需要添加一个前导的反斜杠,每个URL都有(自动添加)
    • 每个正则表达式前面的'r'是可选的但是简易加上,它告诉python这个字符串是“原始的” -- 字符串中任何字符串都不应该转义

    请求的例子:

    http://127.0.0.1:8000/articles/9999/20/ #走的是month_archive
    http://127.0.0.1:8000/articles/9999/ # 走的是year_archive
    # url有覆盖效果,以最先匹配的为准
    

    路由控制之有名分组

    re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$',views.month_archive)
    
    • 使用?P<组名>给正则表达式命名,这样就不需要考虑视图函数中的位置参数位置错乱了(固定写法),并且在视图函数中的形参命名必须以分组名字命名(关键字传参)

    路由控制之分发

    在具体的app中创建urls.py文件,该应用中的url全部写在应用中的urls.py中,然后使用全局urls去控制分发url,完成每个应用之间url解耦合

    全局中的urls.py

    from django.contrib import admin
    from django.urls import path,re_path,include
    from app1 import views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('timer/', views.timer),
        path('login/', views.login),
    
        #^也可以写具体应用名,只是访问时也需要加上应用名,以^开头说明不用去匹配前面的,直接噗呸include中的内容
        re_path(r"^",include("app1.urls"))
    ]
    

    应用中的urls.py

    from django.contrib import admin
    from django.urls import path,re_path,include
    from app1 import views
    
    urlpatterns = [
    
        re_path(r'^articles/([0-9]{4})/$',views.year_archive),# 匹配成功之后会将匹配成功的内容传入到year_archive函数中,在views定义函数时要接收两个参数
        re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$',views.month_archive)
    
    ]
    

    路由控制之反向解析

    在使用Django 项目时,一个常见的需求是获得URL 的最终形式,以用于嵌入到生成的内容中(视图中和显示给用户的URL等)或者用于处理服务器端的导航(重定向等)。人们强烈希望不要硬编码这些URL(费力、不可扩展且容易产生错误)或者设计一种与URLconf 毫不相关的专门的URL 生成机制,因为这样容易导致一定程度上产生过期的URL

    • 在模版中进行反向解析

    在urls.py中

    # 给url命名(别名)
    path('login.html/', views.login,name='log'),
    

    在login.html中:

    <!--不管url怎么变化,这里的action是动态去获取名字为log的url-->
    <form action="{% url 'log' %}" method="post">
            <label for="username">用户名
                <input type="text" id="username"    name="user" placeholder="请输入用户名">
            </label>
            <label for="pwd">密码
                <input type="password" id="pwd" name="pwd" placeholder="请输入密码">
            </label>
            <input type="submit">
        </form>
    
    • 在python views.py中进行反向解析
      如果url中有正则表达式,需要在reverse函数中传入一个args参数,并且参数的值必须符合url中的正则表达式,如果不进行替换会报错
    re_path(r'^articles/([0-9]{4})/$',views.year_archive,name='y_a')
    
    def year_archive(request,year):
    
        # 使用django.urls模块下的reverse模块进行反向解析
        from django.urls import reverse
    
        url = reverse('y_a',args=(year,))
        print(url) #/app1/articles/2000/
        # HttpResponse返回的参数时一哥字符串
        return HttpResponse("<h1>%s</h1>url:%s"%(year,url))
    

    路由控制之名称空间

    命名空间(英语:Namespace)是表示标识符的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其它命名空间中。 由于name没有作用域,Django在反解URL时,会在项目全局顺序搜索,当查找到第一个name指定URL时,立即返回 我们在开发项目时,会经常使用name属性反解出URL,当不小心在不同的app的urls中定义相同的name时,可能会导致URL反解错误,为了避免这种事情发生,引入了命名空间。

    project的urls.py:

    urlpatterns = [
       re_path(r'^app1/', include(("app1.urls","app1"))),
       re_path(r'^app2/', include(("app2.urls","app2")))
    ]
    

    app1.urls.py

    urlpatterns = [
    re_path(r'^index/', index,name="index"),
    ]
    

    app2.urls.py

    urlpatterns = [
    re_path(r'^index/', index,name="index"),
    ]
    

    app11.views

    from django.core.urlresolvers import reverse
    def index(request):
        return HttpResponse(reverse("app01:index"))
    

    app02.views

    from django.core.urlresolvers import reverse
    def index(request):
        return HttpResponse(reverse("app02:index"))
    

    Django2.0中的path

    这里正则表达式匹配的数是以字符串格式显示的,在进行逻辑处理时需要使用int去更改他的格式,使用path可以中int:可以进行直接转换成int类型

    urlpatterns = [
        re_path(r'^articles/([0-9]{4})/$',views.year_archive,name='y_a'),
        path("articles/<int:year>/",views.year_archive,name='y_a')
    ]
    

    path转化器:

    Django默认支持以下5个转换器

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

    注册自定义path转化器

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

      • regex 类属性,字符串类型
      • to_python(self, value) 方法,value是由类属性 regex 所匹配到的字符串,返回具体的Python变量值,以供Django传递到对应的视图函数中。
      • to_url(self, value) 方法,和 to_python 相反,value是一个具体的Python变量值,返回其字符串,通常用于url反向引用。

    例子:

    # 将该类写在应用程序下面的convertrs.py中(编码规范,非强制要求)
    # 可以在该类中对数据进行复杂的逻辑操作
    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  
    
    # 注册到URL配置中,并且将给该类命名
    register_converter(converters.FourDigitYearConverter, 'yyyy')  
    urlpatterns = [  
        path('articles/2003/', views.special_case_2003),  
        path('articles/<yyyy:year>/', views.year_archive),  
        ...  
    ]
    

    使用方法与默认的转换器一样

  • 相关阅读:
    hdoj 2803 The MAX【简单规律题】
    hdoj 2579 Dating with girls(2)【三重数组标记去重】
    hdoj 1495 非常可乐【bfs隐式图】
    poj 1149 PIGS【最大流经典建图】
    poj 3281 Dining【拆点网络流】
    hdoj 3572 Task Schedule【建立超级源点超级汇点】
    hdoj 1532 Drainage Ditches【最大流模板题】
    poj 1459 Power Network【建立超级源点,超级汇点】
    hdoj 3861 The King’s Problem【强连通缩点建图&&最小路径覆盖】
    hdoj 1012 u Calculate e
  • 原文地址:https://www.cnblogs.com/wualin/p/10088002.html
Copyright © 2011-2022 走看看