路由层
路由匹配:APPEND_SLASH = False , 取消自动补全 , settings.py 中添加字段即可
若url尾部为书写/ , django内部会自动补全
urls.py 中 对应关系正确书写方式
url(r'^admin/$', admin.site.urls)
首页重定向
urls(r'^$',views.start)
无名分组
无名分组就是将括号内正则表达式匹配到的内容当做位置参数传递给后面的视图函数
分组:将某一段正则表达式用小括号括起来
举例:
url(r'^index/(\d+)/',views.index)
def index(request,xxx):
print(xxx) # 输出:111
return HttpResponse('想')
有名分组
有名分组就是将括号内正则表达式匹配到的内容当做关键字参数传递给后面的视图函数。
url(r'^indexadd/(?P<year>\d)',views.indexadd)
def indexadd(request,year):
print(year)
return HttpResponse('么么')
无名有名是否可以混合使用?不能,但是同一个分组可以使用N次。
无名分组
url(r'^index/(\d+)/(\d+)/(\d+)/', views.index)
def index(request,*args,**kwargs):
print(args) # 输出:('111', '222', '333') <class 'tuple'>
print(kwargs) # 输出:{}
return HttpResponse('想')
有名分组
url(r'^index/(?P<name>)/(?P<age>)/(?P<hobby>)/',views.indexadd)
def indexadd(request,*args,**kwargs):
print(args, type(args)) # () <class 'tuple'>
print(kwargs,type(kwargs)) # {'name': '1', 'age': '2', 'hobby': '3'} <class 'dict'>
return HttpResponse('么么')
反向解析,导入摸快reverse
通过一些方法得到一个结果,该结果可以直接访问对应的url触发视图函数
对应关系,urls.py
url(r'^$',views.home),
url(r'^func_lkkk/',views.func,name='ooo')
视图函数层,views.py
获得
from django.shortcuts import render,HttpResponse,reverse
def home(request):
print(reverse('ooo')) # /func_lkkk/ , <class 'str'>
return render(request,'func.html')
def func(request):
return HttpResponse('aaa')
templates,静态文件
<a href="{% url 'ooo' %}">func</a>
那么这个数字写代码的时候应该放什么?
数字一般情况下放的是数据的主键值,数据的编辑和删除。
无名分组反向解析
url(r'^func_lkkk/(\d+)/',views.func,name='ooo')
def home(request):
print(request)
return render(request,'func.html')
def func(request,*args,**kwargs):
a = reverse('ooo',args=(1,))
print(a) # /func_lkkk/1/,字符串
return HttpResponse('aaa')
<body>
<a href="{% url 'ooo' 11 %}">func</a>
</body>
有名分组反向解析
url(r'^func_lkkk/(?P<year>\d+)/',views.func,name='ooo')
前端:两种
<a href="{% url 'ooo' 11 %}">func</a>
<a href="{% url 'ooo' year=11 %}">func</a>
后端:两种
print(reverse('ooo',kwargs={'year':11}))
print(reverse('ooo',args=(11,)))
url(r'^func_lkkk/(?P<year>\d+)/',views.func,name='ooo')
def home(request):
print(request)
return render(request,'func.html')
def func(request,*args,**kwargs):
print(reverse('ooo',kwargs={'year':11}))
print(reverse('ooo',args=(11,)))
return HttpResponse('ss')
路由分发
Django 的每一个应用都可以有自己的templates文件夹, urls.py 文件夹,static文件夹
正式基于上述的特点,Django能够非常好的做到分组开发(每个人只写自己的app),作为组长,只需要将手下书写的app全部拷贝到一个新的Django项目中,再再配置文件中注册所有的app再利用路由分发的特点所有的app整合即可。
当Django项目中的url特别多的时候,总路由urls.py代码非常冗余不好维护,这是也可以利用路由分发来减轻总路由的塔里。
利用路由分发之后,总路由不再与视图函数具有直接的对应关系,而是分发处理,识别当前url是属于那个应用下,直接分发对应的应用做处理。
项目中若无 urls.py 文件夹则手动创建
# app01/urls
urlpatterns = [
url(r'^sex/',views.sex)
]
def sex(request):
return HttpResponse('app01 sex')
# app02/urls
urlpatterns = [
url(r'^sex/',views.sex)
]
def sex(request):
return HttpResponse('app02 sex')
# 总路由
from django.conf.urls import url,include
# 第一种:
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^app01/',include('app01.urls')),
url(r'^app02/',include('app02.urls'))
]
# 第二种:
url(r'^app01/', include(app01_urls)), # 只要url前缀是app01开头 全部交给app01处理
url(r'^app02/', include(app02_urls))
名称空间
当多个应用出现相同别名,反向解析不会自动识别应用前缀
# 名称空间
# 总路由
url(r'^app01/',include('app01.urls',namespace='app01')),
url(r'^app02/',include('app02.urls',namespace='app02'))
# 解析的时候
# app01
urlpatterns = [
url(r'^reg/',views.reg,name='reg')
]
# app02
urlpatterns = [
url(r'^reg/',views.reg,name='reg')
]
reverse('app01:reg')
reverse('app02:reg')
{% url 'app01:reg' %}
{% url 'app02:reg' %}
其实只要保证名字不冲突 就没有必要使用名称空间。一般情况下,有多个app的时候我们在起别名的时候会加上app的前缀,这样的话就能够确保多个app之间名字不冲突的问题。
urlpatterns = [
url(r'^reg/',views.reg,name='app01_reg')
]
urlpatterns = [
url(r'^reg/',views.reg,name='app02_reg')
]
伪静态
"""
静态网页
数据是写死的 万年不变
伪静态
将一个动态网页伪装成静态网页
为什么要伪装呢?
https://www.cnblogs.com/Dominic-Ji/p/9234099.html
伪装的目的在于增大本网站的seo查询力度
并且增加搜索引擎收藏本网上的概率
搜索引擎本质上就是一个巨大的爬虫程序
总结:
无论你怎么优化 怎么处理
始终还是干不过RMB玩家
"""
urlpatterns = [
url(r'^reg.html',views.reg,name='app02_reg')
]
虚拟环境
django版本区别
django1.X路由层使用的是url方法,而在django2.Xhe3.X版本中路由层使用的是path方法
url()第一个参数支持正则
path()第一个参数是不支持正则的 写什么就匹配什么
如果你习惯使用path那么也给你提供了另外一个方法
from django.urls import path, re_path
from django.conf.urls import url
re_path(r'^index/',index),
url(r'^login/',login)
2.X和3.X里面的re_path就等价于1.X里面的url
虽然path不支持正则 但是它的内部支持五种转换器, 路由层
path('index/<int:id>/',index)
# 将第二个路由里面的内容先转成整型然后以关键字的形式传递给后面的视图函数
def index(request,id):
print(id,type(id)) # 输入数字,输出 数字 int 类型
return HttpResponse('index')
"""
str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
int,匹配正整数,包含0。
slug,匹配字母、数字以及横杠、下划线组成的字符串。
uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)
"""
除了有默认的五个转换器之外 还支持自定义转换器(了解)
https://www.cnblogs.com/xiaoyuanqujing/articles/11642628.html
博客最底部
模型层里面1.X外键默认都是级联更新删除的,但是到了2.X和3.X中需要你自己手动配置参数
models.ForeignKey(to='Publish')
models.ForeignKey(to='Publish',on_delete=models.CASCADE...)