04 Django框架(URL)
目录
04 Django框架(URL)
Django请求生命周期流程图(简易版)
路由(URL)
路由匹配
url(正则表达式,函数或者类型地址)
路由匹配的原则:从上往下正则表达式能够匹配到内容就算匹配成功会立刻执行后面的视图函数并且结束整个路由匹配过程,一个视图函数可以对应多个路由,一个路由只对应一个视图函数
# 取消自动加斜杠(setting)
优化操作在路由匹配环节如果第一次都没有匹配上django会在路径后面加斜杠再次匹配
APPEND_SLASH = True # 改参数可以控制 简易使用默认的自动添加
True:自动加斜杠(默认)
False:不自动加斜杠
# 创建首页
urlpatterns = [
url(r'^admin/', admin.site.urls),
# 首页
url(r'^$',views.home),
url(r'^test/$',views.test),
url(r'^testadd/$',views.testadd),
# 404页面
url(r'',views.error)
]
分组
分组:就是给一段正则表达式用小括号括起来。
无名分组
# 无名分组
url(r'^test/([0-9]{4})/',views.test) # test(request,1234)
url(r'^test/(\d+)/', views.test)
def test(request, what):
print(what) # 1234
return HttpResponse('from test')
'无名分组就是将括号内正则表达式匹配到的内容,当作 位置参数 传给后面的视图函数。'
有名分组
# 有名分组
url(r'^testadd/(?P<year>[0-9]{4})',views.testadd)
将匹配的内容用 组名'year'来取代。
# testadd(request,year=1234)
'有名分组就是将括号内正则表达式匹配到的内容,当作 关键字参数 传给后面的视图函数。'
# 能否混用?
不能混用
url(r'^index/(\d+)/(?P<xxx>\d+)/',views.index)
# 单个情况下可以重复使用
url(r'^index/(\d+)/(\d+)/(\d+)/',views.index)
url(r'^index/(?P<yyy>\d+)/(?P<xxx>\d+)/',views.index)
反向解析(reverse)
Formal反向解析
1.在路由层书写正则与函数名的时候 在后面加一个唯一标识
url(r'^login/',views.login,name='my_login')
2.前端反向解析
{% url 'my_login' %}
前端页面设置:
<a href="{% url 'haha' %}">111</a> 自己起的别名是:name='haha'
浏览器显示页面后,右击【检查】就会看到自己修改的 url中正则的内容 r'^index_xixi/'
3.后端反向解析
# 必须在views中导入reverse
from django.shortcuts import reverse
print(reverse('haha')) # 里面填写别名即可
"""
通过标记解析出一个结果 该结果可以访问到标记所在的那一行地址
"""
分组的反向解析
无名分组的反向解析
url(r'^index/(\d+)/',views.jindex,name='xxx')
后端
res = reverse('xxx',args=(111,)) # args得是tuple,不能是int
print(res) # /index/111/
前端
{% url 'xxx' 1 %}
<a href='{% url 'xxx' 1 %}'>clink me</a>
"""
这个数字写代码的时候应该放什么?
数字一般情况下放的是数据的主键值,利用主键值来做数据的编辑和删除。
伪代码:
url(r'^edit/(\d+)/, views.edit, name='xxx')
前端:
{% for user_obj in user_queryset %}
<a href='{% url 'xxx' args=1 %}'>clink me</a>
或者 <a href='{% url 'xxx' 1 %}'>clink me</a>
{% endfor %}
后端:
def edit(request, edit_id):
reverse('xxx', edit=(1,))
return HttpResponse('from edit')
"""
有名分组的反向解析
url(r'^index/(?P<year>\d+)/',views.index,name='xxx')
后端
res = reverse('xxx',kwargs={'year':123}) # 主键
'简便写法': res = reverse('xxx', args=(123,))
print(res) # /login/123/
前端
<a href='{% url 'xxx' year=123 %}'>clink me</a>
'简便写法': <a href='{% url 'xxx' 123 %}'>clink me</a>
"""其实无名有名反向解析可以使用通用的方式"""
即:都可以使用无名分组的反向解析
路由分发(include)
当django项目特别庞大的时候 如果所有的路由匹配都写在项目的总路由中会导致总路由过于复杂不利于维护 此时可以将路由做拆分
"""
django支持所有的应用都可以拥有自己的
urls.py
templates文件夹
static文件夹
也就意味着多人协同开发变得更加的简单了
"""
如何将多个单独的app组织到一起 >>> 路由分发
总路由
from app01 import urls as app01_urls
from app02 import urls as app02_urls
from django.conf.urls import url,include
# 路由分发
url(r'^app01/',include(app01_urls)),
url(r'^app02/',include(app02_urls)),
子路由
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'^index/',views.index)
]
子路由
from django.conf.urls import url
from app02 import views
urlpatterns = [
url(r'^index/',views.index)
]
# 总路由更加简便的写法,对应子路由还是同样的写法
from django.conf.urls import url,include
url(r'^app01/',include('app01.urls')),
url(r'^app02/',include('app02.urls')),
名称空间(了解)
# 当多个app中出现了相同的别名 那么使用反向解析无法自动识别
总路由
# 名称空间写在总路由中
url(r'^app01/',include('app01.urls',namespace='app01')),
url(r'^app02/',include('app02.urls',namespace='app02')),
反向解析
后端
reverse('app01:my_index') # 自动就提示了
reverse('app02:my_index')
前端
{% url 'app01:my_index' %}
{% url 'app02:my_index' %}
"""
名称空间其实也可以不用 只需要确保不同的app下别名不冲突即可
如何不冲突
可以在起别名的时候加上应用名前缀
app01_my_index
app02_my_index
"""
伪静态(了解)
静态页面
数据写死的 不怎么改变的
伪静态页面
看似是文件其实是动态网页 这么做事为了提高网站被搜索引擎收录的概率
将路径后缀改为.html形式即可
虚拟环境(了解)
虚拟环境能够实现针对不同的项目配备专属的编程环境
创建虚拟环境相当于重新下载了一个新的解释器
虚拟环境的唯一表示是venv文件夹