zoukankan      html  css  js  c++  java
  • Django入门(四)

    一、URL路由的简单配置

    1、URL路由基础:​

      URL是Web服务的入口,用户通过浏览器发送过来的如何请求,都是发送到一个知道的URL地址,然后被响应。
    ​  URL路由在Django项目中的体现就是urls.py文件,这个文件可以是多个的,但绝对不会再同一目录下.实际上Django提倡项目有个根urls.py,各个app下分别有自己的一个urls.py,既集中又分开,是一种解耦的模式。

      在django项目中编写路由就是向外暴露我们接收哪些URL的请求,除此之外任何的URL都不会被处理,URL路由就是web服务对外暴露的API

    2、路由简单配置:

    urlpatterns = [
        #url(正则表达式,视图函数,参数,别名)
        url(r'^index/$', index,name='index'),
    ]

    注意:

    • 若要从URL中捕获一个值,只需要在它周围放置一对圆括号。
    • 不需要添加前导的反斜杠,因为每个URL都有。 例如,应该是^articles而不是^/articles
    • 每个正则表达式前面的'r'是可选的但是建议加上。它告诉Python这个字符串是“原始的” —— 字符串中任何字符都不应该转义。
    • urlpatterns列表中的元素按照书写顺序从上往下逐行匹配正则表达式,一旦匹配成功则不再继续

    开启URL访问地址后面不为“/”跳转至带有“/”路径的配置项:

    APPEND_SLASH=True
    Django settings.py配置文件中默认没有 APPEND_SLASH 这个参数,但 Django 默认这个参数为 APPEND_SLASH = True。 其作用就是自动在网址结尾加'/'

    二、有名分组和无名分组

    1、无名分组

      按位置传参

      分组后,将分好组的数据当做位置传参到视图函数,所以视图函数需要定义形参

      示例: 

    url:(r'^articles/([0-9]{4})/([0-9]{2})/$', views.article_detail)

      视图函数

    def article_detail(request,*args)

    2、有名分组

    有名分组的语法是: (?P<name>pattren)  ,其中name是组的名字,pattren

      按关键字传参

      分组后,会把分组出来的数据当做关键字参数传到视图函数,所以视图函数需要定义形参,形参名字和分组的名字相对应,与顺序无关

      示例:

    url:(r'^articles/(?P<year>[0-9]{4})/(?P<mouth>[0-9]{2})/$', views.article_detail),

      函数视图

    def article_detail(request,mouth,year)

    注:有名分组和无名分组最好不要混用!

    三、反向解析

    在使用Django 项目时,一个常见的需求是获得URL 的最终形式,以用于嵌入到生成的内容中(视图中和显示给用户的URL等)或者用于处理服务器端的导航(重定向等)。人们强烈希望不要硬编码这些URL(费力、不可扩展且容易产生错误)或者设计一种与URLconf 毫不相关的专门的URL 生成机制,因为这样容易导致一定程度上产生过期的URL。

    在需要URL的地方,对于不同层级,Django提供不同的工具用于URL反查:

    1. 在模板语言中:使用URL模板标签
    2. 在Python代码中:使用reverse() 函数
    3. 在更高层的处理Django模型实例相关的代码中:使用get_absolute_url()方法

    案例:urls.py

    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^test/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})', views.test,name='year_month'),
    ]

    HTML中:

    <a href="{% url 'year_month' 1001 12 %}">点击下载2333</a>

    在视图函数中:

    from django.shortcuts import HttpResponse,reverse
    
    def test(request,year ,month):
        print(year,month)
        url = reverse('year_month',args=(1000,20,))
        print(url)
        return HttpResponse('2018-12')

    总结:

    1.在html中使用{% url '别名' 参数 参数 %}  参数之间用空格分隔
    2.在视图函数中:
        2.1 url=reverse('year_month')
        2.2 url=reverse('year_month',args=(1000,20))

    四、名称空间

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

    由于name没有作用域,Django在反解URL时,会在项目全局搜索,当查找到第一个name指定URL时,立即返回。所以当两个不同app下的URL的name重复时,会产生冲突。

    为了解决这一问题,有两种解决方法:

    #方法一,在分发路由时,分配名称空间
    url(r'^app01/', include('app01.urls',spacename='app01')),
    #使用
    app01:路由别名
    
        
    #方法二,在设置路由别名时,加上前缀,不要重复
    url(r'^delauthor/(d+)(.html)$',delauthor,name='app01_delauthor')
    url(r'^delauthor/(d+)(.html)$',delauthor,name='app02_delauthor')
  • 相关阅读:
    go golang 代码记录
    ERROR org.apache.hadoop.yarn.server.resourcemanager.ResourceManager: RECEIVED SIGNAL 15
    hbase启动之后master和regionserver相继自动断掉
    Native memory allocation (malloc) failed to allocate 32744 bytes for ChunkPool::allocate
    虚拟机中二次安装cdh重新启动hadoop集群报错
    cdh在虚拟机中二次安装时无法选择之前管理的主机
    sqoop生成与关系数据库表结构对应的hive表结构,但在hive却找不到table
    Sqoop将hive数据导出到MySQL中文乱码了怎么办?
    idea通过maven打jar包不成功或无法加载主类或打成功也找不到jar包
    一个牛公司的关于oracle数据的面试题
  • 原文地址:https://www.cnblogs.com/Mister-JH/p/9925299.html
Copyright © 2011-2022 走看看