zoukankan      html  css  js  c++  java
  • Django笔记&教程 2-2 URL详细匹配规则

    Django 自学笔记兼学习教程第2章第2节——URL详细匹配规则
    点击查看教程总目录

    本章第一节中我们简单介绍了URL与View关系

    简单概括来说,网页请求的url会通过urls.py里面的urlpatterns列表中的urlpattern来匹配对应的view方法,然后view方法会返回一个HttpResponse
    过程示意如下:
    url - > urlpattern - > view

    本节就来详细说下这个匹配关系

    本文参考文献:module-django.urls.conf

    1- urlpattern

    urlpattern可以调用两种函数获得:django.urls.path()django.urls.re_path()
    后者是用于正则匹配url的(新手一般用不到)
    这两种函数的参数和含义是一样的

    path(route, view, kwargs=None, name=None)
    re_path(route, view, kwargs=None, name=None)
    
    • route : 要匹配的url
    • view : 匹配后要调用的view函数名
    • kwargs: 向view函数传递额外的参数(route也可以传递参数给view, 所以对于新手来说,kwargs这个比较少用到)
    • name: urlpattern的名字,主要用于后面在模板中指定urlpattern。(因为url中间可能会修改,模板中写死了的话,改起来麻烦)

    2 - 传参

    本章第一节中我们举了个最简单的hello例子。 这里我们进行一个简单的拓展思考,如果这个hello后面要跟上访问的人的名字呢
    比如浏览器访问http://127.0.0.1:8000/hello/tony, 希望返回结果hello, tony
    访问http://127.0.0.1:8000/hello/Bob, 希望返回hello, Bob
    这个时候如果像第一节里面那样一个一个写,就麻烦了,一个名字就要写一个view方法,也不现实。
    所以我们需要能够把route的一些字段作为参数传递给view函数

    比如要将http://127.0.0.1:8000/hello/Bob中的Bob作为参数的话,那么可以这么写

    path('hello/<slug:name>', views.hello)
    

    同时views.py中的hello方法也要添加一个参数勇于去接受这个传入的变量

    def hello(request, name):
        return HttpResponse("Hello, %s" % name)
    

    这里细下这句'hello/<slug:name>'

    1. 若要从URL捕获字符串作为参数传递给view函数,需要使用尖括号,尖括号内写捕获后的变量名。
      比如'hello/<name>'就会将name对应位置的字符串捕获并以name作为变量名传入view函数。
    2. 捕获的值可以选择性地包括转换器类型,设置后会将捕获后的字符串转换为对应类型。例如,使用<int:value>来捕获整型参数, 其中:前为转换器类型,:后为捕获后的变量名。(如果不包含转换器,则匹配除/字符外的任何字符串)

    详细官方文档:urls/#example

    3 转换器(converters)类型

    Django默认的转换器有:

    • str:转换器默认值,匹配除路径分隔符'/'外的任何非空字符串
    • int:匹配零或任何正整数,返回一个int
    • slug:匹配由ASCII字母或数字以及连字符和下划线组成的任何slug字符串。
    • uuid:匹配格式化的UUID,返回一个UUID实例。
    • path:匹配任何非空字符串,包括路径分隔符'/'。

    前三个用的比较多,新手应该暂时用不到后两个。

    同时对于更复杂的匹配需求,可以定义自己的路径转换器,
    具体可查阅官方文档: registering-custom-path-converters

    4 使用include收纳不同app的url

    对于一个网站系统而言,可能会有很多功能模块app,每个功能模块app又有各自的urlpatterns
    如果这些全部都放在项目文件夹project_name下的项目名文件夹project_name/project_name中的urls.py中的话,
    会很混乱也不方便管理,所以最好的办法是,每个功能模块app对应的urlpatterns放在app文件夹下的,然后在project_name/project_name中的urls.py使用include方法进行导入。
    以我在做的简易教务系统为例,其有两个app: usercourse
    要导入 user中的url到主url中的话,
    则主urls.py(详细路径为SSCMS/SSCMS/urls.py)代码如下

    from django.urls import path, include
    
    urlpatterns = [
        path('user/', include("user.urls")),
        # ... other urlpatterns
    ]
    

    SSCMS/user/urls.py

    from django.urls import path
    from user import views
    
    urlpatterns = [
        path('login/', views.home, name="login"),
        path('login/<slug:kind>', views.login, name="login"),
        path('register/<slug:kind>', views.register, name="register"),
    
        path('update/<slug:kind>', views.update, name="update"),
        path('logout/', views.logout, name="logout"),
    ]
    

    此事要访问user中的名为login的urlpattern的话,浏览器应该请求的网站为

    http://127.0.0.1:8000/user/login/
    

    使用include方法
    实际上会将一组url“根植到”其他url之下。
    比如上面的例子就将SSCMS/user/urls.py中的urlpatterns“根植”到SSCMS/SSCMS/urls.py中的user/下。

    更多细节,可见include的官方文档:including-other-urlconfs

  • 相关阅读:
    PHP学习—Cookie&Session
    IP组播综合实验
    k8s kubeadm部署高可用集群
    python调用zbbix的api实现批量添加域名监控脚本
    Python调用Harbor api删除私有仓库harbor镜像
    Kubernetes故障排查指南-分析容器退出状态码
    blackbox_exporter+grafana+prometheus监控主机存活,端口存活及网站状态
    k8s中使用ceph-csi在ceph中进行数据持久化
    Jenkins+K8S流水线自动化部署Java程序
    生产环境k8s中使用helm部署prometheus+grafana监控k8s集群中相关node和pod
  • 原文地址:https://www.cnblogs.com/BigShuang/p/14285580.html
Copyright © 2011-2022 走看看