写点什么

Django 之路由篇

用户头像
若尘
关注
发布于: 2021 年 05 月 26 日
Django 之路由篇

Django 系统

环境搭建

  • anaconda+pycharm

  • anaconda 使用

  • conda list:显示当前环境安装的包

  • conda env list: 显示的安装的虚拟环境列表

  • conda create -n env_name python=3.6

  • 激活 conda 的虚拟环境

  • (Linux)source activate env_name

  • (win) activate env_name

  • pip install django==1.8

创建第一个 django 程序

  • 命令行启动

  • pycharm 启动

  • 需要配置

  • manage.py 文件

路由系统-urls

  • 创建 app

  • app:负责一个具体业务或者一类具体业务的模块

  • python manage.py startapp teacher

  • 路由

  • 按照具体的请求 url,导入到相应的业务处理模块的一个功能模块

  • django 的信息控制中枢

  • 本质上是接收的 URL 和相应的处理模块的一个映射

  • 在接收 URL 请求的匹配上使用了 RE

  • URL 的具体格式如 urls.py 中所示

  • 需要关注两点

  • 接受的 URL 是什么,即如何使用 RE 对传入 URL 进行匹配

  • 已知 URL 匹配到哪个处理模块

  • url 匹配规则

  • 从上往下一个一个对比

  • url 格式是分级格式,则按照级别一级一级往下对比,主要对应 url 包含子 url 的情况

  • 子 url 一旦被调用,则不会返回到主 url

  • '/one/two/three'

  • 正则以 r 开头,表示不需要转义,注意尖号(^)和美元符号($)

  • 'one/two/three' 配对 r'^one/'

  • '/oo/one/two/three' 不配对 r'^one/'

  • 'one/two/three' 配对 r'three/$'

  • 'oo/one/two/three/oo' 不配对 r'three/$'

  • 开头不需要有反斜杠

  • 如果从上到下都没有找到合适的匹配内容,则报错

正常映射

  • 把某一个符合 RE 的 URL 映射到事务处理函数中去

  • 举例如下:


        from showeast import views as sv                urlpatterns = [          url(r'^admin/', admin.site.urls),          url(r'^normalmap/', sv.normalmap),        ]
复制代码

URL 中带参数映射

  • 在事件处理代码中需要由 URL 传入参数,形如 /myurl/param 中的 param

  • 参数都是字符串形式,如果需要整数等形式需要自行转换

  • 通常的形式如下:


    /search/page/432 中的432需要经常性变换,
复制代码

URL 在 app 中处理

  • 如果所有应用 URL 都集中在 MyDjango/urls.py 中,可能导致文件臃肿

  • 可以把 urls 具体功能逐渐分散到每个 app 中

  • 从 django.conf.urls 导入 include

  • 注意此时 RE 部分的写法

  • 添加 include 导入

  • 使用方法

  • 确保 include 被导入

  • 写主路由开头的 url

  • 写子路由

  • 编写 views 视图

  • 同样可以使用参数

URL 中的嵌套参数

  • 捕获某个参数的一部分

  • 例如 URL /index/page-3, 需要捕获数字 3 作为参数


    url(r'index_1/(page-(\d+)/)?$', sv.myindex_1),  # 不太好    url(r'index_2/(?:page-(?P<page_number>\d+)/)?$', sv.myindex_2),  # 好
复制代码


  • 上述例子会得到两个参数,但 ?: 表示忽略此参数

传递额外参数

  • 参数不仅仅来自于 URL,还可能是我们自己定义的内容


    url(r'extrem/$', sv.extremParam, {'name':'ruochen'}), 
复制代码


  • 附加参数同样适用于 include 语句,此时对 include 内所有都添加

URL 的反向解析

  • 防止硬编码

  • 本质上是对每一个 URL 进行命名

  • 以后再编码代码中使用 URL 的值,原则上都应该使用反向解析

源代码

  • urls.py


from django.conf.urls import include, urlfrom django.contrib import admin
from teacher import views as tvfrom teacher import teacher_url
urlpatterns = [ # Examples: # url(r'^$', 'MyDjango.views.home', name='home'), # url(r'^blog/', include('blog.urls')),
url(r'^admin/', include(admin.site.urls)), # 视图函数名称只有名称,无括号和参数 url(r'normalmap/', tv.do_normalmap),

# 尖号表示以后面内容开头的表达式 # 圆括号表示的是一个参数,里面的内容作为参数传递给被调用的函数 # 参数名称以问号加大写P开头,尖括号里面就是参数的名字 # 尖括号后表示正则,[0-9] 表示内容仅能是由0-9 的数字构成 # 后面大括号表示出现的次数,此处4表示只能出现四个0-9的数字 url(r'^withparam/(?P<year>[0-9]{4})/(?P<month>[0,1][0-9])', tv.withparam), # 正常映射
# 比如约定,凡是由teacher模块处理的视图的url都以teacher开头 url(r'^teacher/', include(teacher_url)),
url(r'^book/(?:page-(?P<pn>\d+)/)$', tv.do_param2),
url(r'^yourname/$', tv.revParse, name='askname')
]
复制代码


  • teacher_url.py


from django.conf.urls import urlfrom . import views
urlpatterns = [ # Examples: # url(r'^$', 'MyDjango.views.home', name='home'), # url(r'^blog/', include('blog.urls')),
# 视图函数名称只有名称,无括号和参数 url(r'ruochen/', views.do_app),
]
复制代码


  • views.py


from django.shortcuts import renderfrom django.http import HttpResponsefrom django.core.urlresolvers import reverse
# Create your views here.
'''视图函数需要一个参数,类型应该是 HttpRequest'''def do_normalmap(request): print('In do_normalmap') return HttpResponse('This is normalmap')
def withparam(request, year, month): return HttpResponse('This is with param {0}, {1}'.format(year, month))
def do_app(r): return HttpResponse('这是个子路由')
def do_param2(r, pn): return HttpResponse('Page number is {0}'.format(pn))
def extremParam(r, name): return HttpResponse('My name is {0}'.format(name))
def revParse(r): return HttpResponse('Your requested URL is {0}'.format(reverse('askname')))
复制代码


发布于: 2021 年 05 月 26 日阅读数: 6
用户头像

若尘

关注

还未添加个人签名 2021.01.11 加入

还未添加个人简介

评论

发布
暂无评论
Django 之路由篇