博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django框架(四)-- 路由控制:有名/无名分组、反向解析、路由分发、名称空间、伪静态、APPEND_SLASH、不同版本的Django区别、Django虚拟环境搭建...
阅读量:5063 次
发布时间:2019-06-12

本文共 4803 字,大约阅读时间需要 16 分钟。

 

路由控制

一、简单路由配置

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
[0-9]{4})/(?P
[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
[0-9]{4})/(?P
[0-9]{2})/$',views.manlist,name='man_url')
(2)模板层
# 1.无参
# 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.pyurl(r'booklist$',views.booklist)# 在blog中,urls.pyurl(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
\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/
', 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/
', views.re_test,name='test'),

九、APPEND_SLASH

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

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

如访问  时,默认会加上 ‘/’,相当于方位了 

如果设置了APPEND_SLASH = False,访问  就不会加’/‘,就找不到页面

十、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文件夹输入:activatelinux:soruse env1/Script/activate
  • 退出虚拟环境
deactivate
  • 使用虚拟环境(pycharm中使用)
file --> setting --> Project --> Project Interpreter --> add选择虚拟环境路径下的python.exe

 

转载于:https://www.cnblogs.com/zhangbingsheng/p/10612446.html

你可能感兴趣的文章
sql注入
查看>>
「破解」Xposed强
查看>>
src与href的区别
查看>>
ABAP工作区,内表,标题行的定义和区别
查看>>
《xxx重大需求征集系统的》可用性和可修改性战术分析
查看>>
Python 中 创建类方法为什么要加self
查看>>
关于indexOf的使用
查看>>
【转】JS生成 UUID的四种方法
查看>>
英语单词
查看>>
centos6.8下安装matlab2009(图片转帖)
查看>>
Mongo自动备份
查看>>
求助大神!怎样批量删除数据库表中某个字段中同样的一段字符!
查看>>
VMWARE虚拟机无法访问的三种方法分析
查看>>
enq: SQ - contention
查看>>
cer证书签名验证
查看>>
ant 安装
查看>>
新手Python第一天(接触)
查看>>
vue路由动态加载
查看>>
【原】UIWebView加载本地pdf、doc等文件
查看>>
iOS中ARC内部原理
查看>>