Django路由层
路由匹配
# url方法第一个参数是正则表达式,并且按顺序匹配视图函数
url(r'test', views.test),
url(r'testxxx', views.testxxx),
# 使用'/'来阻止此类情况
url(r'test/', views.test),
url(r'testxxx/', views.testxxx),
# 当用户输入的url后缀缺少'/'时,django自动加斜杠
# 取消自动加斜杠 settings.py
APPEND_SLASH = False
# 使用'^'和'$'来规范路径
url(r'^test/$', views.test),
url(r'^testxxx/$', views.testxxx),
# 匹配首页
url(r'^$', views.test),
# 匹配404
使用异常捕获比较靠谱
无名分组
# 分组,即使用'()'包括某一段正则表达式
url(r'^test/(\d+)/', views.test),
# url函数会将第一个参数中使用'()'独立分组的正则表达式也作为位置参数传入视图函数
有名分组
url(r'^test/(?P<re_name>\d+)/', views.test),
# 即将'()'内正则表达式以其别名为关键字作为关键字参数传入视图函数
# 无名分组与有名分组不能混用,但可以重用
反向解析
# 通过某些方法直接访问路由中设置的url触发视图函数 eg: 通过给url传入第三个关键字参数'name='为当前路径设置别名,然后通过前段或者后端使用别名替换直接路径实现路径在各个文件间解耦合效果,别名不能冲突
url(r'^something/', views.something,name='反向解析尝试'),
# 前端反向解析
<a href="{% url '反向解析尝试' %}">去something页面1</a>
# 后端反向解析 views.py
from django.shortcuts import render, HttpResponse, redirect, reverse
reverse('反向解析尝试') # 返回路由中对应的url
无名分组反向解析
url(r'^re_test/(\d+)/', views.re_test, name='re_test1'),
# 无名分组后端反向解析,即:将可以匹配到'()'内正则的值作为args参数传入reverse()函数,一般我们可以用数据主键值
def home(request):
print(reverse('re_test1',args=(1,)))
return render(request,'home.html')
# 无名分组前端反向解析,类似于后端,在引用url别名处添加可以匹配到'()'内正则的值,一般我们可以用数据主键值
<a href="{% url 're_test1' 1 %}">去something页面1</a>
有名分组反向解析
url(r'^re_testx/(?P<age>\d+)/', views.re_test2, name='re_test2'),
# 有名分组后端反向解析
print(reverse('re_test2', kwargs={'age':1})) # 或
print(reverse('re_test2',args=(1,)))
# 有名分组前端反向解析
<a href="{% url 're_test2' age=1 %}">去something页面1</a> #或
<a href="{% url 're_test2' 1 %}">去something页面1</a>
路由分发
# 每一个应用都可以有自己的templates文件夹、urls.py、static文件夹
# 项目urls.py配置(基础方式)
from django.conf.urls import url, include
from app02 import urls as app02_urls
from app03 import urls as app03_urls
urlpatterns = [
url(r'^app02/',include(app02_urls)),
url(r'^app03/',include(app03_urls))
]
# 项目urls.py配置(简单方式)
from django.conf.urls import url, include
urlpatterns = [
url(r'^app02/',include('app02.urls')),
url(r'^app03/',include('app03.urls'))
] # Django会自动获取各应用下的urls文件路径,当为include直接传入字符串值时,会识别为导入路径
# 注意:总路由下url不可以使用'$'限制结尾
# 在每个应用下新建urls.py
from django.conf.urls import url
from app02 import views # 注意导入本项目views
urlpatterns = [
url(r'^jiliguala/', views.jiliguala, name='app02_jiliguala'),
]
from django.conf.urls import url
from app03 import views # 注意导入本项目views
urlpatterns = [
url(r'^jiliguala/', views.jiliguala, name='app03_jiliguala'),
]
# 实现各APP内路由函数
from django.shortcuts import render, HttpResponse, redirect
# Create your views here.
def jiliguala(request):
return HttpResponse('app02_jiliguala')
from django.shortcuts import render, HttpResponse, redirect
# Create your views here.
def jiliguala(request):
return HttpResponse('app03_jiliguala')
名称空间
# 当多个应用下的url别名重复时,反向解析不能自动识别该url的应用前缀
# 总路由设置
urlpatterns = [
url(r'^app02/',include(app02_urls, namespace='app02')),
url(r'^app03/',include(app03_urls, namespace='app03'))
]
# 反向解析
reverse('app02:jiliguala')
<a href="{% url 'app02:jiliguala' %}">jiliguala</a>
# 一般情况下,我们这样设置url别名:appname_别名
伪静态
# 即将一个动态网页伪装成一个静态网页
# 目的是增大本网站的SEO查询力度,增加被搜索引擎收藏的几率
虚拟环境
# 在一般开发中,我们会给每一个项目配备一个该项目独有的解释器环境,该环境内只有该项目用到的模块。
# 项目会配备一个requirements.txt的文件,里面存有该项目需要的所有的模块及对应版本