zoukankan      html  css  js  c++  java
  • Django 路由层(urlconf)

    Django 的路由层(URLconf)

    URL配置(conf)就像是Django所支撑的网站的目录;

    本质就是:URL与调用该URL执行的视图函数的映射表;

    通俗的讲:就是用户使用哪个url,URL(conf)就需要告诉服务器执行哪个程序代码.

    一  路由配置的简单使用

    path :不能使用正则 ,path('路径',views.方法)
    
    re_path :可以使用正则 ,re_path(r'正则表达式路径',views.方法)
    from django.urls import path,re_path 
    
    from app01 import views #必须导入views
    
    urlpatterns = [
        re_path(r'^articles/2003/$', views.special_case_2003),
        
    ]

    二  路由配置使用注意事项

    •   若要从URL中获取一个值,只需要在对应的URL处放置一对圆括号
    re_path(r'^articles/([0-9]{4})/$', views.year_archive) 
    #传送给views时会携带小括号的数值,故需要相应的形参接受
    • 不需要添加一个前导的反斜杠,因为每个URL 都有。
    re_path(r'/articles/$', views.year_archive)  #错误写法
    • 每个正则表达式前面的'r' 是可选的但是建议加上.

    三 路由配置与views传值过程解析

    '''
    url配置:
    re_path(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
    
    对应url请求时候的传值过程
    
    /articles/2005/03/ 请求将匹配列表中的第三个模式。
    Django 将调用函数views.month_archive(request, '2005', '03')。
    '''

    四 有名分组

      1 基本格式

    path('index/(? P<year> d{4})',views.year)
    
    对应views中
    
    def year(request,year):
        
         return HttpResponse(year)

      2 传值方式---关键字传参

    /articles/2003/03/03/ 
    请求将调用函数views.article_detail(request, year='2003', month='03', day='03')。

    五 分发(include)

      1、分发意义

      ULR解耦合。把每一个应用的视图函数放入自己的文件中,全局的urls只需要分配该路径属于某一个应用的视图函数。这样解决如果有一个程序出了问题不会影响到其他的应用的执行。

    urlpatterns = [
       re_path(r'^admin/', admin.site.urls),
       re_path(r'^app01/', include('app01.urls')),
    ]
    
    之后app01中的urls,再对匹配成功的url进行分发

    六 反向解析

      1 使用场景

    在模板中:使用url 模板标签。
         {%  url '别名' %}
    在Python 代码中:使用from django.urls import reverse()函数
      rev_url=reverse('别名')
      

      2 html文件中的反向解析

    项目.urls.py 设置别名 name='Index'

    from django.contrib import admin
    from django.urls import path,re_path
    
    from app01 import views
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('index/',views.index,name='Index'),
        path('login/', views.login)
    
    ]

    app01.views.py中 导入 inverse

    from django.shortcuts import render,HttpResponse,redirect
    
    from django.urls import reverse #导入方向解析函数
    
    # Create your views here.
    
    def index(request):
    
        return render(request,'index.html')
    
    
    def login(request):
        print(request.method)
        if request.method=='GET':
            return render(request,'login.html')
        else:
            re_path=reverse('Index') #反向解析
            return redirect(request,re_path)

      3 html 文件中的反向解析

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <form action="{%  url 'Log' %}" method="post">
        {% csrf_token %}
    
        用户名 <input type="text" name="user"> 密码 <input type="text" name="pwd">
        <input type="submit">
    </form>
    </body>
    </html>

      4 反向解析解析过程分析

      根据别名,在urlpatterns中找到对应的路径并返回

    五 名称空间(解决反向解析出现找不到正确url的问题)

      命名空间(英语:Namespace)是表示标识符的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其它命名空间中。

      由于name没有作用域,Django在反解URL时,会在项目全局顺序搜索,当查找到第一个name指定URL时,立即返回.

      我们在开发项目时,会经常使用name属性反解出URL,当不小心在不同的app的urls中定义相同的name时,可能会导致URL反解错误,为了避免这种事情发生,引入了命名空间。

    project的urls.py

    urlpatterns = [
        re_path(r'^admin/', admin.site.urls),
        re_path(r'^app01/', include("app01.urls",namespace="app01")),
        re_path(r'^app02/', include("app02.urls",namespace="app02")),
    ]

    app01.urls

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

    app02.urls

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

    app01.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"))

  • 相关阅读:
    windows10 gcc编译C程序(简单编译)
    windows10 下 gcc/g++ 的安装
    神经网络内在逻辑:没打开的AI“黑匣子”
    tensorflow的变量作用域
    如何手画三相电相(线)电压(流)波形图
    pycharm如何添加固定代码块
    pycharm的个性化设置
    zookeeper学习三
    zookeeper学习二
    es中对mapping的理解
  • 原文地址:https://www.cnblogs.com/angle6-liu/p/10216728.html
Copyright © 2011-2022 走看看