zoukankan      html  css  js  c++  java
  • URL与视图

    path函数

      path函数的定义为:path(route,view,name=None,kwargs=None)。以下对这几个参数进行讲解。

    • route 参数
      • url的匹配规则。这个参数中可以指定url中需要传递的参数,比如在访问文章详情页的时候,可以传递一个id。传递参数是通过<>尖括号来进行指定的。并且在传递参数的时候,可以指定这个参数的数据类型
      • 常用的类型(URL转换器
        • str:非空的字符串类型。默认的转换器。但是不能包含斜杠。
        • int:匹配任意的零或者正数的整形。到视图函数中就是一个int类型。
        • slug:由英文中的横杠-,或者下划线_连接英文字符或者数字而成的字符串。
        • uuid:匹配uuid字符串。
        • path:匹配非空的英文字符串,可以包含斜杠。
    • view参数
      • 可以为一个视图函数或者是类视图.as_view()或者是django.urls.include()函数的返回值。
    • name参数
      • 这个参数是给这个url取个名字的,这在项目比较大,url比较多的时候用处很大。
    • kwargs 参数:
      • 有时候想给视图函数传递一些额外的参数,就可以通过kwargs参数进行传递。这个参数接收一个字典。传到视图函数中的时候,会作为一个关键字参数传过去。比如以下的url规则:

      • 那么以后在访问blog/1991/这个url的时候,会将foo=bar作为关键字参数传给year_archive函数。

    urls 模块化

      如果项目变得越来越大。那么url会变得越来越多。如果都放在主 urls.py 文件中,那么将不太好管理。因此我们可以将每个app自己的urls放到自己的app中进行管理。一般我们会在app中新建一个urls.py文件用来存储所有和这个app相关的子url。

    • 应该使用 include 函数包含子 urls.py ,并且这个 urls.py 的路径是相对于项目的路径。示例代码如下:
    urlpatterns = [
      path('admin/', admin.site.urls),
      path('book',include('book.urls'))
    ]
    
    •  在 appurls.py 中,所有的url匹配也要放在一个叫做 urlpatterns 的变量中,否则找不到。 
    •  url 是会根据主 urls.pyapp中的 urls.py 进行拼接的,因此注意不要多加斜杠。

    URL 反转

    为什么需要url命名?

      因为url是经常变化的。如果在代码中写死可能会经常改代码。给url取个名字,以后使用url的时候就使用他的名字进行反转就可以了,就不需要写死url了。

    如何给一个url指定名称?

    在`path`函数中,传递一个`name`参数就可以指定。示例代码如下:

    urlpatterns = [
        path('',views.index,name='index'),
        path('login/',views.login,name='login')
    ]
    

    应用命名空间

      在多个app之间,有可能产生同名的url。这时候为了避免反转url的时候产生混淆,可以使用应用命名空间,来做区分。定义应用命名空间非常简单,只要在`app`的`urls.py`中定义一个叫做`app_name`的变量,来指定这个应用的命名空间即可。示例代码如下:

    # 应用命名空间
    app_name = 'front'
    
    urlpatterns = [
        path('',views.index,name='index'),
        path('login/',views.login,name='login')
    ]
    

      以后在做反转的时候就可以使用`应用命名空间:url名称`的方式进行反转。示例代码如下:

    return redirect(reverse('front:login'))
    

    应用(app)命名空间和实例命名空间

      一个app,可以创建多个实例。可以使用多个url映射同一个app。所以这就会产生一个问题。以后在做反转的时候,如果使用应用命名空间,那么就会发生混淆。为了避免这个问题。我们可以使用实例命名空间。实例命名空间也是非常简单,只要在`include`函数中传递一个`namespace`变量即可。示例代码如下:

    urlpatterns = [
        path('',include('front.urls')),
        # 同一个app下有两个实例
        path('cms1/',include('cms.urls',namespace='cms1')),
        path('cms2/',include('cms.urls',namespace='cms2')),
    ]
    

      以后在做反转的时候,就可以根据实例命名空间来指定具体的url。示例代码如下:

    def index(request):
        username = request.GET.get("username")
        if username:
            return HttpResponse('CMS首页')
        else:
            # 获取当前的命名空间
            current_namespace = request.resolver_match.namespace
            return redirect(reverse("%s:login"%current_namespace))
    

    include 函数用法

    • include(module,namespace=None)
      •  module:子url的模块字符串。
      • namespace:实例命名空间。这个地方需要注意一点。如果指定实例命名空间,那么前提必须要先指定应用命名空间。也就是在子`urls.py`中添加`app_name`变量。
    • include((pattern_list, app_namespace), namespace=None)
      • `include`函数的第一个参数既可以为一个字符串,也可以为一个元组,如果是元组,那么元组的第一个参数是子`urls.py`模块的字符串,元组的第二个参数是应用命名空间。也就是说,应用命名空间既可以在子`urls.py`中通过`app_name`指定,也可以在`include`函数中指定。    
    • include(pattern_list)
      • `pattern_list`是一个列表。这个列表中装的是`path`或者`re_path`函数。实例代码如下
    path('movie/',include([
            path('',views.movie),
            path('list/',views.movie_list),
        ]))

      

      如果在反转url的时候,需要添加参数,那么可以传递`kwargs`参数到`revers`函数中。示例代码如下:

    detail_url = reverse('detail',kwargs={"article_id":1,'page':2})
    

       如果想要添加查询字符串的参数,则必须手动的进行拼接。示例代码如下:

    login_url = reverse('login') + "?next=/"
    

    re_path 函数  

    •  re_path和path的作用都是一样的。只不过`re_path`是在写url的时候可以用正则表达式,功能更加强大。
    • 写正则表达式都推荐使用原生字符串。也就是以`r`开头的字符串。
    • 在正则表达式中定义变量,需要使用圆括号括起来。这个参数是有名字的,那么需要使用`?P<参数的名字>`。然后在后面添加正则表达式的规则。示例代码如下:
    from django.urls import re_path
    from . import views
    
    urlpatterns = [
        # r"":代表的是原生字符串(raw)
        re_path(r'^$',views.article),
        # /article/list/<year>/
        re_path(r"^list/(?P<year>d{4})/$",views.article_list),
        re_path(r"^list/(?P<month>d{2})/$",views.article_list_month)
    ]
    

      如果不是特别要求。直接使用`path`就够了,省的把代码搞的很麻烦(因为正则表达式其实是非常晦涩的,特别是一些比较复杂的正则表达式,今天写的明天可能就不记得了)。除非是url中确实是需要使用正则表达式来解决才使用`re_path`。

  • 相关阅读:
    spark streaming 概述
    spark sql 的性能调优
    LeetCode 106. Construct Binary Tree from Inorder and Postorder Traversal (用中序和后序树遍历来建立二叉树)
    LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal (用先序和中序树遍历来建立二叉树)
    LeetCode 90. Subsets II (子集合之二)
    LeetCode 88. Merge Sorted Array(合并有序数组)
    LeetCode 81. Search in Rotated Sorted Array II(在旋转有序序列中搜索之二)
    LeetCode 80. Remove Duplicates from Sorted Array II (从有序序列里移除重复项之二)
    LeetCode 79. Word Search(单词搜索)
    LeetCode 78. Subsets(子集合)
  • 原文地址:https://www.cnblogs.com/renshaoqi/p/10537279.html
Copyright © 2011-2022 走看看