路由控制

一、简单路由配置

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

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

二、无名分组

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

三、有名分组

  1. url(r'^booklist/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.booklist)
  2.  
  3. 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取了一个名字。

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

2、使用反向解析获取url

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

五、路由分发

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

2、在总路由中配置

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

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

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

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

1、什么是名称空间

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

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

2、使用名称空间

名称空间 : 路由别名

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

七、伪静态

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

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

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

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

1、Django2.x中

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

2、转换器

5个转换器

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

3、自定义转换器

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

九、APPEND_SLASH

  1. # 是否开启URL访问地址后面不为/跳转至带有/的路径的配置项
  2. 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创建
  1. file ---> new project ---> 选择new environment using Virtualenv虚拟环境
  • Name中填写新虚拟环境的名字,或者使用默认名字,方便以后安装第三方包和其他项目使用;
  • 在Location中填写新环境的文件目录;
  • 在Base interpreter下拉框中选择Python解释器;
  • 勾选Inherit global site-packages可以使用base interpreter中的第三方库,不选将和外界完全隔离
  • 勾选Make available to all projects可将此虚拟环境提供给其他项目使用
2、对已有项目搭建虚拟环境
  1. file --> setting --> Project -->Project Interpreter --> Virtualenv Environment

3、用命令行创建
  • 安装
  1. pip3 install virtualenv
  • 创建虚拟环境
  1. 先进入到某个指定的目录,然后输入命令
  2. virtualenv env_django(虚拟环境名字) --- 创建纯净环境
  3. 或者
  4. virtualenv --system-site-packages env_django(虚拟环境名字) --- 创建环境,继承原安装的模块
  • 激活虚拟环境
  1. windows进到目录虚拟环境文件的的Scripts文件夹输入:activate
  2. linuxsoruse env1/Script/activate
  • 退出虚拟环境
  1. deactivate
  • 使用虚拟环境(pycharm中使用)
  1. file --> setting --> Project --> Project Interpreter --> add选择虚拟环境路径下的python.exe

Django框架(四)-- 路由控制:有名/无名分组、反向解析、路由分发、名称空间、伪静态、APPEND_SLASH、不同版本的Django区别、Django虚拟环境搭建的更多相关文章

  1. [Django框架之路由层匹配、有名 无名分组、反向解析、路由分发、名称空间、伪静态、本地虚拟环境、django版本区别]

    [Django框架之路由层匹配.有名 无名分组.反向解析.路由分发.名称空间.伪静态.本地虚拟环境.django版本区别] 路由层 路由即请求地址与视图函数的映射关系,如果把网站比喻成一本书,那路由就 ...

  2. Django框架之第三篇(路由层)--有名/无名分组、反向解析、路由分发、名称空间、伪静态

    一.Django请求生命周期 二.路由层  urls.py url()方法 第一个参数其实就是一个正则表达式,一旦前面的正则匹配到了内容,就不会再往下继续匹配,而是直接执行对应的视图函数. djang ...

  3. 一、数据库表中字段的增删改查,二、路由基础.三、有名无名分组.四、多app共存的路由分配.五、多app共存时模板冲突问题.六、创建app流程.七、路由分发.八、路由别名,九、名称空间.十、反向解析.十一、2.x新特性.十二、自定义转换器

    一.数据库表中字段的增删改查 ''' 直接在modules中对字段进行增删改查 然后在tools下点击Run manage.py Task执行makemigrations和migrate 注意在执行字 ...

  4. django之路由分组,反向解析,有名,无名分组

    路由层 无名分组 有名分组 反向解析 路由分发 名称空间 伪静态的概念 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'test',vi ...

  5. Django学习——路由层之路由匹配、无名分组、有名分组、反向解析

    路由层之路由匹配 """路由你可以看成就是出去ip和port之后的地址""" url()方法 1.第一个参数其实是一个正则表达式 2.一旦第 ...

  6. Django框架04 /模板相关、别名/反向解析/路由分发

    Django框架04 /模板相关.别名/反向解析/路由分发 目录 Django框架04 /模板相关.别名/反向解析/路由分发 1. 语法 2. 变量/万能的点 3 . 过滤器 4. 标签Tags 5. ...

  7. 四 Django框架,models.py模块,数据库操作——创建表、数据类型、索引、admin后台,补充Django目录说明以及全局配置文件配置

    Django框架,models.py模块,数据库操作——创建表.数据类型.索引.admin后台,补充Django目录说明以及全局配置文件配置 数据库配置 django默认支持sqlite,mysql, ...

  8. 第三百零六节,Django框架,models.py模块,数据库操作——创建表、数据类型、索引、admin后台,补充Django目录说明以及全局配置文件配置

    Django框架,models.py模块,数据库操作——创建表.数据类型.索引.admin后台,补充Django目录说明以及全局配置文件配置 数据库配置 django默认支持sqlite,mysql, ...

  9. Django url反向解析与路由分发名称空间

    url反向解析 url.py from django.conf.urls import url from django.contrib import admin from app01 import v ...

随机推荐

  1. LG1983 「NOIP2013」车站分级 拓扑排序

    问题描述 LG1983 题解 考虑建立有向边\((a,b)\),代表\(a\)比\(b\)低级. 于是枚举每一辆车次经过的车站\(x \in [l,r]\),如果不是车辆停靠的车站,则从\(x\)向每 ...

  2. 关于==和equals的区别和联系,面试这么回答就可以

    长篇大论的话,我这里就不多写了,相信大家入门java 的时候就知道个大概了,这里想表述的是,如果面试官问你<关于==和equals的区别>,该怎么回答完美呢?可以这样说 总结的来说: 1) ...

  3. ASP.NET开发实战——(二)为什么使用ASP.NET

    本文主要内容是通过分析<博客系统>需求,确定使用Web应用的形式来开发,然后介绍了HTML.HTTP的概念,并使用IIS搭建了一个静态的HTML“页面”,从而引出“动态”的ASP.NET. ...

  4. [LeetCode] 312. Burst Balloons 打气球游戏

    Given n balloons, indexed from 0 to n-1. Each balloon is painted with a number on it represented by ...

  5. 阅读java编程思想之一切都是对象

    温故而知新--- 1. 用句柄操作对象 现实生活中,我们可以把遥控器当作句柄,电视机当作对象.当我们拿到句柄(遥控器)的时候,我们是可以控制对象的(电视机).比如说调节音量大小,色彩等.那么在程序里, ...

  6. java-int数据的溢出

    数据的溢出: 当整数的数据大小超出了可以表示的范围,而程序中又没有做数值范围的检查时, 这个整型变量所输出的值将发生紊乱,且不是预期的运行结果. 01 //  整数值如果超出了自己所可以表示范围的最大 ...

  7. 应用层协议:HTTPS

    1. HTTPS定义 Hyper Text Transfer Protocol over Secure Socket Layer,安全的超文本传输协议,网景公式设计了SSL(Secure Socket ...

  8. 利用SQL生成模型实体类

    DECLARE @TableName sysname = 'TableName'; DECLARE @Result VARCHAR(MAX) = 'public class ' + @TableNam ...

  9. Postman界面了解

    Postman界面了解 2019年3月21日去面试了一家软件测试,本以为自己对简历上写的技能都熟悉,跳个槽,涨点工资,想象很美好,现实太残忍.当问到做接口测试postman和swagger工具的时候, ...

  10. axios的各种传参方式

    axios的各种传参方式 1. params方式 axios({ url: '/users', method: 'get', params: { id: '11111', name: '22222' ...