zoukankan      html  css  js  c++  java
  • Django

    一 Django中路由的作用

    URL配置就好像Django所支撑网站的目录。本质是URL与要为该URL调用的视图函数之间的映射表,就是以这样方式告诉Djang,对于客户端发来的某个URL该调用哪一段逻辑代码对应执行

    二 简单的路由配置

    from django.conf.urls import url
    
    urlpatterns = [
         url(正则表达式, views视图函数,参数,别名),
    ]
    • 正则表达式:一个正则表达式字符串
    • views视图函数:一个可调用对象,通常是一个视图函数 或者 指定视图函数路径的字符串
    • 参数:可选的要传递给视图函数的默认参数(字典形式)
    • 别名:可选的name参数
    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^index/',views.index),
        url(r'^articles/([0-9]{4})',views.articles),
        url(r'^articles/([0-9]{4})/([0-9]{2})',views.articles),
    
    ]

    无名分组:使用简单的、没有命名的正则表达式组(通过圆括号)来捕获URL 中的值并以位置 参数传递给视图

    • 第一个参数,可以写一个正则表达式
    • 从上往下匹配,一旦匹配成功,就不再继续
    • 如果分了几个组,相应的视图函数就应该接受几个
    • 不要添加一个前导的反斜杠,因为每个URL都有
    • 每个正则表达式前面的 r 是可选的但是应该加上。它告诉python这个字符串是“原始的” ,字符串中任何字符都不应该被转义

    APPEND_SLASH

    在setting里设置:APPEND_SLASH=False,请求时,浏览器不会自动补全斜杠,带上斜杠就匹配失败

    伪静态

    方便搜索引擎收录(手动加上.html  看起来是静态的) 具体如下:

    url(r'^edit_book/(d+).html',views.edit_book)
    视图层:def(request,nid):
    模板:<form action='/adit_book/{{book.nid}}.html' method='post>


    三 有名分组

    命名正则表达式组的语法是(?P<name>pattern),其中name 是组的名称,pattern 是要匹配的模式

    1 url(r'^test/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})', views.test)
    2 def test(request,month,year):
         print(year)
         print(month)
         return HttpResponse('ok')
         #名字必须一致,否则报错,位置可以颠倒,如果分了两个组,必须用两个参数接
    3 有名分组和无名分组不要混用
    4 有名分组可以用**kwargs接收,无名分组可以用*args接收
    5 分组捕获的参数,都是str类型
    6 可以设置默认值

    四 路由分发

    1 先导入from django.conf.urls import include
    2 url(r'^app01/', include('app01.urls')),有两种方式:。。。。(建议用这种)
            另一种:
            先导入 from app01 import urls
                  from app02 import urls as xxx  # urls名字可以改为其他名,但是不建议 这是为了避免重名
                    
                        url(r'^app01/',include(urls))
                        url(r'^app02/'.include(xxx))
                    
    3 在相应的app里创建urls  py文件,建议,不要改名字
    4 urlpatterns 不能变名字 ,后面的写法就一样了 url(r'^test',views.test3 ),
    5 重复上面步骤,分发多个

    路由由上往下匹配,如果有一个没有匹配上,在最后位置加上一个:万能的(匹配任意)       

    url(r'',views.index)   胡乱输入会返回首页

    五 反向解析

    1 路由中,命一个名,url(r'^index/', views.index,name='n1'),
    2 在视图函数里:
        from django.shortcuts import reverse
        #这样就能拿到我反向解析出来的url
        url=reverse('n1')
        再重定向 return redirect(url)
    3 在模板(html页面)里用:
        {% url 'n1'%}
    4 带位置参数反向解析  url(r'^index/([0-9]{4})/([0-9]{2})', views.index,name='n1'),
        视图函数中:url=reverse('n1',args=(2012,12,))
        
        模板:{% url 'n1' 2012 12 %}
    5 带关键字参数反向解析  url(r'^index/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})', views.index,name='n1'),
        视图函数中:url=reverse('n1',args=(2012,12,)   ---可以
              url=reverse('n1',kwargs={'year':2014,'month':12})-----也可以
              
        模板:
            {% url 'n1' 2012 12 %}----可以
            {% url 'n1' month=12 year=2012 %}----可以
        注意:按位置传,顺序是固定的
                
    作用:修改路由中url的时候,其它地方不需要改动


    六 名称空间

    路由分发时重命名用到名称空间(知道它,但是建议不同app的url里name不能重名,app的名字_name 解析时用这个名字)

    1   url(r'^app01/', include('app01.urls',namespace='app01')),
            urlpatterns = [
                url(r'^test',views.test3 ,name='test'),
    
            ]
        url(r'^app02/', include('app02.urls',namespace='app02')),            
            urlpatterns = [
                    url(r'^test02',views.test3 ,name='test'),
    
                ]
    2 在视图函数里:
        url=reverse('app01:test')
        print(url)
        
        url=reverse('app02:test')
        print(url)
    3 在模板里:
        <a href="{% url 'app02:test' %}">点我跳到首页</a>
  • 相关阅读:
    介绍一个小工具 Linqer
    wcf系列5天速成——第一天 binding的使用(1)
    wcf系列5天速成——第二天 binding的使用(2)
    wcf系列学习5天速成——第三天 事务的使用
    iptables 使用
    rsync 文件.数据同步
    Nginx打开目录浏览功能
    linux 添加开机启动
    watch 命令
    python 命令行处理
  • 原文地址:https://www.cnblogs.com/kingyanan/p/9601043.html
Copyright © 2011-2022 走看看