Django(3)

1.路由基础
2.多APP共存,url如何管理(可能出现冲突),模板如何管理(可能出现冲突)  ***
3.路由分发(将app自己的路由分发给应用自身管理) ***
4.无名有名分组(re)*****
5.反向解析 *****
6.2.x新特性 ****

 

-------------------------------

1. url函数:url('^index/$', views.index, {'msg': '默认参数'}, name="路由别名")
2. 有名无名分组: /page/10/1
-- 路由层:'^page/(\d+)/(\d+)/$' 视图层:def page(request, n1, n2) n1=10, n2=1
-- 路由层:'^page/(?P<num>\d+)/(?P<id>\d+)/$' 视图层:def page(request, id, num) num=10, id=1
-- 注:有名无名不能混用
3. 路由分发:
-- 有多个app,1.创建app: startapp app_name -> 2.配置,在settings中配置app信息 -> 在应用自己目录下创建urls.py
-- 主路由:url('^app01/', include('app01.urls', namespace='app01'))
-- 子路由:url('^login/$', views.login, name='login')
-- 访问:/app01/login/
4. 反向解析: {% url 'app01:login' [参数们] %} reverse('app01:login'[, args=() | kwagrs={}])
5. 2.x新特性: url, include, re_path, path
-- re_path同url
-- path采用的是绝对字符串匹配 path('index/', views.index, name='index')
-- path: str|int|slug|uuid|path 语法:path('page/<int:id>/', ...)
-- 自定义转化器:1.按格式自定义转化器类 2.注册自定义转化器类并起转化器名 3.在路由中用转化器名进行匹配
6. 多app共存问题
-- 路由问题:import app01.views as app01_view | 路由分发
-- 模板问题:
-- 在templates文件夹下建立与应用名相同的文件夹,将该应用的模板文件放置自己应用名文件夹下,render(request, 'app01/login.html')
-- 在各自app应用下建立templates文件夹,再在templates下建立与应用同名文件夹,放置自己的模板页面,render(request, 'app01/login.html')
-- 模板页面命名:app01_login.html

 

-------------------

1.url-------符号 ^ $代表头和尾的定位,一般建议尾$不要用,以免拼接有其他内容无法解析到 

2.url-------有4个参数,一般写前2个参数,有需要再展开 url(r'^index/',views.index,False,name='index')  #  正则路径 视图函数地址  默认关键字参数,路由别名

3.url--------一般  /  符号在http里不加也是会自动增加,如果不想自动增加到 setting--APPEND_SHASH=False 或 在setting---中间件'django.middleware.common.CommonMiddleware' 注掉

 

1.无名分组--带位置参数,任意符合都可以:                                           eg: url(r'^index/(\d)+/',views.index)

  • 正则表达式:一个正则表达式字符串
  • views视图函数:一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
  • 参数:可选的要传递给视图函数的默认参数(字典形式)
  • 别名:一个可选的name参数
  • 无名分组分出几个值,视图函数就要接受几个值(位置参数形式传过来的)
  • 注:无名分组和有名分组在url 同一行里不能混用!
  • 2种分式是:提高传输安全简化了GET方式的传参主式

2.有名分组--带关键字参数,只能指定关键字才能获得:                                   eg: url(r'^index/(?p<id>\d)+/',views.index)  #  id 关键字

  有名分组分出几个值,视图函数就要接受几个值(按关键字传入,位置可以打乱)

  URLconf 会更加明晰且不容易产生参数顺序问题的错误 ,这些好处是以简洁为代价;

 

 

多APP共存的路由url分配  ---1.在自己APP文件夹--建立一个url文件夹

多APP共存的模板冲突问题----1.在自己APP文 件夹--建立一个templats文 件夹--把模板移入

 

解决方案:

2.路由---在主路由下建立路由分发

from django.conf.urls import include
urlpatterns = [
  url(r'^app01/', include('app01.urls')),
  url(r'^app02/', include('app02.urls')),
]
# 注:主路由分发一定不能使用$正则语法 (错误eg: ^app01/$)

2.模板-在主templats 下建立每一个APP同名的文件夹---将模板移入

 

路由别名:

​1.有些路由会被大量访问(直接访问、间接访问)
2.这些路由可能后期还会发生变化
3.可以给路由设置别名,通过别名访问:<a href="{% url '路由别名' '传入有名无名分组所需参数' %}"></a>

名称空间

    主路由:
from django.conf.urls import include
urlpatterns = [
    url(r'^app01/', include('app01.urls', namespace='app01')),
    url(r'^app02/', include('app02.urls', namespace='app02')),
]

app01应用下路由
from django.conf.urls import url
from app01 import views
urlpatterns = [
    url(r'^test/', views.test, name='test')
]

app02应用下路由
from django.conf.urls import url
from app02 import views
urlpatterns = [
    url(r'^test/', views.test, name='test')
]

前端页面反向解析:{% url 'app01:test' %} | {% url 'app02:test' %}
视图函数reverse方法:url = reverse('app01:test') | url = reverse('app02:test')


反向解析 reverse
  
'''
from django.shortcuts import reverse
在视图函数中通过reverse方法反向解析出真实的路径
# 1.不带分组:url(r'可能会变的真实路由', 视图函数, name='路由别名')
url = reverse('路由别名')
# 2.无名分组:url(r'可能会变的真实路由(带无名分组)', 视图函数, name='路由别名')
url = reverse('路由别名', args=(给无名分组赋值))
# 3.有名分组:url(r'可能会变的真实路由(带有名分组)', 视图函数, name='路由别名')
url = reverse('路由别名', kwargs={给有名分组赋值,key就是有名分组名})
 

2.x新特性

  

from django.urls import path, re_path
# 向下兼容,不建议使用url, 使用与url相同的re_path
from django.conf.urls import url
urlpatterns = [
    path('index/', views.index),
    # page/<int:msg>/   page/(?P<msg>(\d+))   # 访问/page/123/
    # path('page/<int:msg>/', views.page),
    # path('page/<str:msg>/', views.page),
    # path('page/<path:msg>/', views.page),
    # path('page/<slug:msg>/', views.page),
    path('page/<uuid:msg>/', views.page),
]
# 1. 2.x版本re_path的使用方式同1.x版本url
# 2. path写的是绝对字符串,请求地址必须与路由地址完全匹配
# 3. path拥有五个转换器:
 -- str:匹配除路径分隔符(/)外的字符串,默认
 -- int:匹配自然数
 -- slug:匹配字母、数字、横杠及下划线组成的字符串
 -- uuid:匹配uuid形式的数据
 -- path:匹配任何字符串,包括路径分隔符(/) (不能用?)
 

自定义转换器(*)

'''
# 原因:自定义正则匹配目标路径
语法:
1.自定义类
# 匹配11位的185电话
class CVT185phone:
 # 匹配过程
    regex = '185\d{8}'
    def to_python(self, value):
        return int(value)
 # 反解过程
    def to_url(self, value):
        return '%11d' % value
# 在主路由中
from django.urls import register_converter
from 所在路径 import CVT185phone
register_converter(CVT185phone, 'phone185')
path('page/<phone185:msg>/', views.page, name="pages")

 


 

posted @ 2019-02-27 19:21  陈大哥的小可爱  阅读(164)  评论(0)    收藏  举报