• Django——路由


    Django——路由

    1、路由分发

    可以在每个应用中创建一个 urls.py 进行在该应用中的路由匹配。

    # include 在根目录路由中对应用的路由进行分发
    # 对 UrlApp 应用分发一个 路由配置
    path('urlapp/' , include('UrlApp.urls')),
    path('urlapp2/' , include('UrlApp2.urls'))
    
    • 1
    • 2
    • 3
    • 4

    2、匹配路由

    1、使用正则表达式

    re_path 方法是使用正则定义 url

    在需要对应用户的数据进行验证的时候,会使用正则表达式匹配路由

    # 使用正则表达式匹配路由的时候必须匹配开头以及结尾(^正则表达式/$)
    re_path(r'^[A-Z0-9]+/$'  , views.re_views),
    
    • 1
    • 2

    2、URL参数传递

    在 path 解析 url 中携带的参数,使用 来获取路由中对应位置的数据。url接收到这个参数之后,会传递给对应关系的视图。

    # 获取 url 中的参数
    path('demo//' , views.get_url_data),
    
    • 1
    • 2
    def get_url_data(request , urldata):
        return HttpResponse(f'从 url 中获取到的参数为: {urldata}')
    
    • 1
    • 2

    url 映射中的 path 和 re_path 方法可以传入第三个参数,这个参数会作为请求的附加数据,在项目中这个附加数据会一起传递给对应的视图函数。

    这个附加数据必须以字典的形式写入

    # 在 url 映射方法中携带附加数据
    path('extra/' , views.extra , {'age':27}),
    
    path('default/' , views.default_data),
    path('default//' , views.default_data),
    
    • 1
    • 2
    • 3
    • 4
    • 5
    def extra(request , age):
        return HttpResponse(f'获取 url 映射方法中的附加数据:{age}')
    
    def default_data(request , data=369):
        # 当匹配的 url 有获取到同名的参数的情况,该默认数据会被覆盖。
        return HttpResponse(f'从 url 中获取到的参数为: {data}')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3、路由转换器

    转换器的本质上也是使用正则进行匹配

    # 转换器写法:<转换器名称:参数名>
    # int: 匹配0以及正整数。获取到的数据会被解析为int类型
    path('int//' , views.int_view),
    # str : 匹配除了 URl 分隔符(/) 之外的非空字符串
    path('str//' , views.str_view),
    # path : 匹配任意非空字符
    path('path//' , views.path_view),
    # slug: 匹配字母, 数字 , 下划线 ,横杆组成的字符串
    path('slug//' , views.slug_view),
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    def int_view(request , data):
        print(type(data))
        return HttpResponse(f'使用 int 转换器 , 接收到的数据为:{data}')
    
    def str_view(request , data):
        return HttpResponse(f'使用 str 转换器 , 接收到的数据为:{data}')
    
    def path_view(request , data):
        return HttpResponse(f'使用 path 转换器 , 接收到的数据为:{data}')
    
    def slug_view(request , data):
        return HttpResponse(f'使用 slug 转换器 , 接收到的数据为:{data}')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3、反向解析路由

    html 模板中用反向解析获取访问视图完整 URl 路径 , 需要给 url定义一个名称(给 url 起别名)

    在 html 模板中反向解析路由的格式 : {% url 'URL的模式名称' 参数%}

    <body>
    <a href="/urlapp2/index/">点击开奖a><br>
    <a href="{% url 'num' %}">点击开奖,无奖竞猜a>
    <a href="{% url 'name_data' '尔康'%}">不要点击a>
    body>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    path('html/' , views.html_view),
    path('index/' , views.index),
    path('num/' , views.number_view , name='num'),
    path('name//' , views.data_view , name='name_data'),
    
    • 1
    • 2
    • 3
    • 4
    def index(request):
        return HttpResponse('我不好')
    
    def html_view(request):
        return render(request , 'UrlDemo.html')
    
    def number_view(request):
        number = randint(136 , 569)
        return HttpResponse(f'中奖号码为:{number}')
    
    def data_view(request , data):
        return HttpResponse(f'{data} 是这个直播间最帅的!')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在后端视图中解析路由 , reverse(url模式名称)

    def text(request):
        # 导入 reverse 解析路由方法
        return HttpResponse(f'视图解析路由为:{reverse("num")}')
    
    def redirect_reverse(request):
        # return redirect(reverse('num'))
        # url 中的 name 解析名称可以直接在 redirect 中直接使用
        return redirect('num')
    
    def text_data(request , data):
        # reverse(url名称 , args=[参数]/kwargs={参数})
        # return HttpResponse(f'视图解析路由为:{reverse("name_data" , args=["叶晓春"])}')
        return HttpResponse(f'视图解析路由为:{reverse("name_data" , args=[data])}')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    path('text/' , views.text),
    path('demo/' , views.redirect_reverse),
    path('text_data/' , views.text_data),
    path('text_data//' , views.text_data),
    
    • 1
    • 2
    • 3
    • 4

    4、url的应用名称空间

    在 应用的 urls.py 文件中 , 定义一个 app_name 的属性

    # 定义当前应用的 url 应用名称空间
    app_name = 'app2'
    
    • 1
    • 2
    
    <a href="{% url 'app2:num' %}">点击开奖,无奖竞猜a>
    <a href="{% url 'app2:name_data' '尔康'%}">不要点击a>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    def text(request):
        # 导入 reverse 解析路由方法
        return HttpResponse(f'视图解析路由为:{reverse("app2:num")}')
    
    def redirect_reverse(request):
        # return redirect(reverse('num'))
        # url 中的 name 解析名称可以直接在 redirect 中直接使用
        return redirect('app2:num')
    
    def text_data(request , data):
        # reverse(url名称 , args=[参数]/kwargs={参数})
        # return HttpResponse(f'视图解析路由为:{reverse("name_data" , args=["叶晓春"])}')
        return HttpResponse(f'视图解析路由为:{reverse("app2:name_data" , args=[data])}')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    22 年最全面试java八股文合集
    Mac 常用软件汇总
    搭建知识付费系统的最佳实践是什么
    安卓Android_手机安装burp的https_CA证书
    使用位移基本场方法对空间扩展光源进行建模
    供应链管理系统(Java+SSH+MyEclipse+MySQL)
    IDEA 连接 数据库
    GitHub 上传本地项目代码
    一文带你快速了解Python史上最快Web框架
    心理测评测试h5公众号字节微信小程序app开源版开发
  • 原文地址:https://blog.csdn.net/xiugtt6141121/article/details/136597248