Django 之路由篇
原创
©著作权归作者所有:来自51CTO博客作者小小猿若尘的原创作品,请联系作者获取转载授权,否则将追究法律责任
[欢迎阅读本专栏其他文章]
Django 之视图篇Django 之 Models(Models 模型 & 数据表关系)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
创建第一个django程序
django-admin startproject my_django
cd my_django
python manage.py runserver
- 需要配置
- manage.py 文件
路由系统-urls
- app:负责一个具体业务或者一类具体业务的模块
- python manage.py startapp teacher
- 按照具体的请求url,导入到相应的业务处理模块的一个功能模块
- django的信息控制中枢
- 本质上是接收的URL和相应的处理模块的一个映射
- 在接收URL请求的匹配上使用了RE
- URL的具体格式如urls.py中所示
- 接受的URL是什么,即如何使用RE对传入URL进行匹配
- 已知URL匹配到哪个处理模块
- 从上往下一个一个对比
- url格式是分级格式,则按照级别一级一级往下对比,主要对应url包含子url的情况
- 子url一旦被调用,则不会返回到主url
- 正则以r开头,表示不需要转义,注意尖号(^)和美元符号($)
- ‘one/two/three’ 配对 r’^one/’
- ‘/oo/one/two/three’ 不配对 r’^one/’
- ‘one/two/three’ 配对 r’three/$’
- ‘oo/one/two/three/oo’ 不配对 r’three/$’
- 开头不需要有反斜杠
正常映射
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的值,原则上都应该使用反向解析
源代码
from django.conf.urls import include, url
from django.contrib import admin
from teacher import views as tv
from 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')
]
from django.conf.urls import url
from . import views
urlpatterns = [
# Examples:
# url(r'^$', 'MyDjango.views.home', name='home'),
# url(r'^blog/', include('blog.urls')),
# 视图函数名称只有名称,无括号和参数
url(r'ruochen/', views.do_app),
]
from django.shortcuts import render
from django.http import HttpResponse
from 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')))