zoukankan      html  css  js  c++  java
  • Django框架(四)-- 路由控制:有名/无名分组、反向解析、路由分发、名称空间、伪静态、APPEND_SLASH、不同版本的Django区别、Django虚拟环境搭建

     

    路由控制

    一、简单路由配置

    url(r'^booklist$', views.booklist)
    • 第一个参数是正则表达式,第二个参数是视图函数
    • 每个正则表达式前面的'r' 是可选的但是建议加上。它告诉Python 这个字符串是“原始的” —— 字符串中任何字符都不应该转义
    url(r'booklist', views.booklist)
    url(r'booklistadd', views.booklistadd)

    如果不加^ 和 $ ,由于路由匹配是从上往下匹配的,若是要匹配 booklistadd ,则很可能会匹配到booklist就会停止匹配

    二、无名分组

    url(r'^booklist/([0-9]{4})/([0-9]{2})/$', views.booklist)
    
    def booklist(request, a, b)  或者 def booklist(request, *args)
    • 按位置传参
    • () 表示分组,分组后,会把分组出来的数据当做位置参数,传递到视图函数
    • 视图函数中必须要有位置参数接收分组出来的数据。由于分组出来的数据可能有很多,所以也可以用 *args 来用一个元组接收所有数据。

    三、有名分组

    url(r'^booklist/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.booklist)
    
    def booklist(request, year, month)
    • 按关键字传参
    • 分组后,会把分组出来的数据按关键字传参,传递到视图函数
    • 视图函数需要定义形参来接收,并且视图函数中形参的名字要跟分组的名字一样,与顺序无关

    四、反向解析

    1、什么是反向解析

    在Django中,经常需要获取某条URL,为生成的内容配置URL链接。

    urlpatterns =[ url ( r'^booklist$', views.booklist ) , ]

    如在a标签中,<a href='/booklist/'>,倘若url发生了变化,就必须要去html中手动修改a的href,这样会浪费大量的工作时间。因此,Django提供一种方案,在url中提供一个name参数,相当于是给url取了一个名字。

    url(r'^booklist$', views.booklist,name='book_url')

    2、使用反向解析获取url

    (1)三种url
    # 1.无参
    url(r'^booklist$', views.booklist,name='book_url')
    # 2.有参,无名分组
    url(r'^userlist/([0-9]{4})/([0-9]{2})/$',views.userlist,name='user_url')
    # 3.有参,有名分组
    url(r'^manlist/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$',views.manlist,name='man_url')
    (2)模板层
    # 1.无参
    <form action="{{% url 'book_url' %}}">
    # 2.有参,无名分组, 2008 和 12 表示两个参数,即两个分组
    {{% url 'user_url' 2008 12 %}}
    # 3.有参,有名分组
    {{% url 'man_url' 2018 12 %}} 或者 {{% url 'man_url' year=2018 month=12 %}}
    (3)视图层
    from django.conf.urls import redirect,reverse 
    
    # 1.无参
    url=reverse('book_url')
    return redirect(url)
    # 2.有参,无名分组, 2008 和 12 表示两个参数,即两个分组
    url=reverse('user_url',args=(2018,12,))
    # 3.有参,有名分组
    url=reverse('man_url',args=(2018,12,)) 
    或者 
    url=reverse('man_url',kwargs={'year':2018,'mounth':12})

    五、路由分发

    1、在不同的app中创建子路由urls.py

    2、在总路由中配置

    from django.conf.urls import include 
    
    url(r'^app01/',include('app01.urls'))
    url(r'^blog/',include('blog.urls'))

    3、在不同app的urls中配置路由

    # 在app01中,urls.py
    url(r'booklist$',views.booklist)
    # 在blog中,urls.py
    url(r'userlist$',views.userlist)

    六、名称空间(一般不使用)

    1、什么是名称空间

    命名空间(英语:Namespace)是表示标识符的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。

    # 总路由
    url(r'^app01/',include('app01.urls',namespace='app01'))
    url(r'^blog/',include('blog.urls',namespace='blog'))
    # 子路由
    # app01中
    url(r'^publish/$', views.publish,name='test')
    # blog中
    url(r'userlist$',views.userlist,name='test')
    -反向解析:
                -视图层:url = reverse('blog:test')
                -模板层:{% url 'app01:test'%}
            ***一般不要用***
                子路由:url(r'^publish/$', views.publish,name='app01_test'),

    2、使用名称空间

    名称空间 : 路由别名

    视图层:url = reverse('blog:test')
    模板层:{% url 'app01:test'%}

    七、伪静态

    为了更好的被搜索引擎收录而通过一定的规则,把动态页面的地址转换成以htm或html结尾的地址,看起来是静态的,实际是依然是动态页面。

    例如访问http://127.0.0.1:8000/book/4.html,它看上去是静态网站,但是其实其中的数据是通过后台获取实时更新的。

    # 路由,用html结尾
    url(r'^book/(?P<id>d+.html)',views.book),

    八、Django 2.x和Django 1.x 路由层区别

    1、Django2.x中

    • re_path:跟1.0的url用法相同
    • path:传的路径,是准确路径
    urlpatterns = [path('test/',view.test), ]

    2、转换器

    5个转换器

    path('test/<path:year>', views.re_test)
    # year 表示名字,path表示year是path类型的
    str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
    int,匹配正整数,包含0。
    slug,匹配字母、数字以及横杠、下划线组成的字符串。
    uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
    path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)

    3、自定义转换器

    # 1 定义一个类:
    class MyCon:
        # 写一个正则表达式
        regex = '[0-9]{4}'
        # 匹配出來的数据,会传到这里,retrun回去的,会被视图函数接收
        def to_python(self, value):
            return int(value)
        # 反向解析用的
        def to_url(self, value):
            return '%04d' % value
    # 2.注册转换器 
    from django.urls import register_converter
         register_converter(MyCon,'yyy')
    # 3.使用自定义转换器
    path('test/<yyy:year>', views.re_test,name='test'),

    九、APPEND_SLASH

    # 是否开启URL访问地址后面不为/跳转至带有/的路径的配置项
    APPEND_SLASH=True
    • Django settings.py配置文件中默认没有 APPEND_SLASH 这个参数,但 Django 默认这个参数为 APPEND_SLASH = True。 其作用就是自动在网址结尾加'/'

    • 默认APPEND_SLASH = True,即会自动在网址末尾加上 ‘/’

    如访问 https://www.cnblogs.com 时,默认会加上 ‘/’,相当于方位了 https://www.cnblogs.com/

    如果设置了APPEND_SLASH = False,访问 https://www.cnblogs.com 就不会加’/‘,就找不到页面

    十、Django虚拟环境搭建

    一、为什么要用虚拟环境

    公司以前开发的项目是在Django1.5的基础上开发的,先要需要基于Django2.0开发一套项目。这样不能卸载原有版本,就可以通过搭建虚拟环境来使用Django2.0。

    二、搭建虚拟环境

    1、用pycharm创建
    file ---> new project ---> 选择new environment using Virtualenv虚拟环境
    • Name中填写新虚拟环境的名字,或者使用默认名字,方便以后安装第三方包和其他项目使用;
    • 在Location中填写新环境的文件目录;
    • 在Base interpreter下拉框中选择Python解释器;
    • 勾选Inherit global site-packages可以使用base interpreter中的第三方库,不选将和外界完全隔离
    • 勾选Make available to all projects可将此虚拟环境提供给其他项目使用
    2、对已有项目搭建虚拟环境
    file --> setting --> Project -->Project Interpreter --> Virtualenv Environment

    3、用命令行创建
    • 安装
    pip3 install virtualenv
    • 创建虚拟环境
    先进入到某个指定的目录,然后输入命令
    virtualenv  env_django(虚拟环境名字)    --- 创建纯净环境
    或者
    virtualenv --system-site-packages env_django(虚拟环境名字)     --- 创建环境,继承原安装的模块
    • 激活虚拟环境
    windows进到目录虚拟环境文件的的Scripts文件夹输入:activate
    linux:soruse env1/Script/activate
    • 退出虚拟环境
    deactivate
    • 使用虚拟环境(pycharm中使用)
    file --> setting --> Project --> Project Interpreter --> add选择虚拟环境路径下的python.exe
  • 相关阅读:
    Delphi公用函数单元
    Delphi XE5 for Android (十一)
    Delphi XE5 for Android (十)
    Delphi XE5 for Android (九)
    Delphi XE5 for Android (八)
    Delphi XE5 for Android (七)
    Delphi XE5 for Android (五)
    Delphi XE5 for Android (四)
    Delphi XE5 for Android (三)
    Delphi XE5 for Android (二)
  • 原文地址:https://www.cnblogs.com/zhangbingsheng/p/10612446.html
Copyright © 2011-2022 走看看