前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >django之路由分组,反向解析,有名

django之路由分组,反向解析,有名

作者头像
py3study
发布2020-01-15 23:27:40
1.6K0
发布2020-01-15 23:27:40
举报
文章被收录于专栏:python3python3

路由层   无名分组   有名分组   反向解析   路由分发   名称空间   伪静态的概念

代码语言:javascript
复制
urlpatterns = [
  url(r'^admin/', admin.site.urls),
  url(r'test',views.test),
  url(r'testadd',views.testadd),
]

路由一旦匹配就不再走下面的路由匹配关系了 路由增加首页的方式

代码语言:javascript
复制
url(r'^$',views.home)

路由增加尾页的方式(当所有的路径都匹配不上时,给我返回404提示信息)

代码语言:javascript
复制
url(r'',views.error)     切记必须加在最后

无名分组

代码语言:javascript
复制
url(r'^test/([0-9]{4})/', views.test),

会将加了括号的正则表达式匹配的内容当做位置参数传递给后面的视图函数

具体操作如下:

有名分组

代码语言:javascript
复制
url(r'^test/(?P<year>\d+)/',views.test)

会将加了括号的正则表达式匹配的内容当做关键字参数传递给后面的视图函数 关键字就是你尖括号里面的名字(year)

具体操作如下:

有名分组和无名不能混合使用!!! 只要不混着用,有名分组和无名分组支持多个相同类型的传参

 反向解析:

试想一个场景,你有200多个a标签,href都指向index/,有一天在urls里面index改为了new_index,那么你只能手动改变a标签中的href,当你改完,又变成了my_index,那么一天的时间都可能在改地址,那么有没有什么方法,不再把程序写死,反向解析就是应用于此。

通过名字反向推导出页面文件,类似于字典

前端反向解析

代码语言:javascript
复制
{% url 'add' %} # {% url '放urls.py中路由与视图函数的name的值' %} 

后端反向解析

代码语言:javascript
复制
url(r'^testadd123/$',views.testadd,name='add')

相对于前面的绑定关系,只要通过name的值就能找到前面的路径

代码语言:javascript
复制
from django.shortcuts import reverse
res = reverse('add')
print(res)

无名分组的反向解析 前端反向解析

代码语言:javascript
复制
{% url 'add' 1 %} # {% url '放urls.py中路由与视图函数的name的值' %} 

后端反向解析

代码语言:javascript
复制
url(r'^testadd123/(\d+)/$',views.testadd,name='add')
代码语言:javascript
复制
from django.shortcuts import reverse
res = reverse('add',args=(1,))

有名分组的反向解析 前端反向解析

代码语言:javascript
复制
{% url 'add' 1 %} # {% url '放urls.py中路由与视图函数的name的值' %} 推荐你用这种

<a href="{% url 'add' year=1 %}">999</a>

后端反向解析

代码语言:javascript
复制
res = reverse('add',args=(1,)) # 推荐你用这种

res = reverse('add',kwargs={'year':1})

 小口诀

代码语言:javascript
复制
url = r'^反向/无名(有名)',view.'(传无名)',name=('反向')
def xxx (request 无名)
    reverse('反向',args(无名,))
    render(request,'.html',{'无名':无名})
前端
href={%url '反向' 无名%}

推导:

代码语言:javascript
复制
url(r'^edit/(\d+)/',views.edit,name='edit_user')
{%for user_obj in queryset %}
edit/?id={{user_obj.pk}}
edit/?id={{user_obj.pk}}
edit/?id={{user_obj.pk}}

{%for user_obj in queryset %}
edit/{{user_obj.pk}}/ >>> url(r'^edit/(\d+)/') def edit(request,edit_id) url = reverse('edit_user',args=(edit_id,))
edit/{{user_obj.pk}}/
edit/{{user_obj.pk}}/
edit/{{user_obj.pk}}/

路由分发(include): 总路由不再直接做路由与视图函数的对应关系,而是将获取的路由分发给下面的app去处理对应关系

每一个app下都可以新建自己的urls.py static文件夹 templates文件夹 项目总路由:

代码语言:javascript
复制
url(r'^app01/',include(app01_urls)),
url(r'^app02/',include(app02_urls))

应用子路由: app01.urls.py

代码语言:javascript
复制
from django.conf.urls import url
from app01 import views


urlpatterns = [
url(r'^index/',views.index)

]

app02.urls.py

代码语言:javascript
复制
from django.conf.urls import url
from app02 import views


urlpatterns = [
url(r'^index/',views.index)

]

如果两个app下起了相同的名字,那么反向解析不支持自动查找应用前缀 名称空间(了解即可):

代码语言:javascript
复制
# url(r'^app01/',include(app01_urls,namespace='app01')),
# url(r'^app02/',include(app02_urls,namespace='app02'))

# print(reverse('app01:aaa'))
# print(reverse('app02:aaa'))

 总结

代码语言:javascript
复制
总路由对子路由进行分发
from django.conf.urls import url,include
url(r'^app01/',include('app01.urls'))
url(r'^app02/',include('app02.urls'))
再在子路由app下创建urls
from django.conf.urls import url
from app01 import views
urlpatterns = [
    url(r'^index/',views.index,name='app01_aaa')
]

views
def index(request):
    print(reverse('app02_aaa'))
    return HttpResponse('.....')

伪静态 假装自己的路径是一个静态(数据写死的)文件的路径,其实你 是经过了视图函数处理,动态渲染页面 提高百度收藏你这个网页力度,当别人搜索你这个页面相关的内容 百度会优先展示你的页面(这样虽然能提高你网页被访问概率,但是还是干不过RMB玩家) 路由层结束了!!!

虚拟环境(演示一下虚拟环境,下载django2.0测试自定义转换器) 由来:     每个项目用到的模块不一样 目的:     为了让每一个项目都有仅仅属于自己的项目解释器 使用:     new project的时候选择虚拟环境创建项目     如果勾选了下面的make to all project你创建的虚拟环境就能够被其他新建的项目使用 django2.0与django1.0的区别(了解) 1.0里面的url对应django2.0里面re_path django2.0里面的path第一个是精准匹配(你怎么写的,我就怎么匹配) django1.0版本中匹配到的参数都是字符串类型 django2.0转换器(了解) 1.0版本的url和2.0版本的re_path分组出来的数据都是字符串类型 默认有五个转换器,感兴趣的自己可以课下去试一下   str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式   int,匹配正整数,包含0。   slug,匹配字母、数字以及横杠、下划线组成的字符串。   uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。   path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)

  path('index/<str:id>/',index ) django2.0自定义转换器 需要三步走战略 # 自定义转换器

代码语言:javascript
复制
class FourDigitYearConverter:
regex = '[0-9]{4}'
def to_python(self, value):
return int(value)
def to_url(self, value):
return '%04d' % value
register_converter(FourDigitYearConverter, 'yyyy')

urlpatterns = [
path('admin/', admin.site.urls),
# path('index/<int:id>/',index ),
# path('index/<str:id>/',index ),
path('login/<yyyy:name>/',index)

]

视图层(views.py) django必会三板斧   1.HttpResponse >>> 返回字符串   2.render >>> 支持模板语法,渲染页面,并返回给前端   3.redirect >>> 重定向(即可以重定向到别人的网址,也可以重定向到自己路由) django返回的数据都是HttpResponse对象 JsonResponse(返回json格式的数据) FBV与CBV   FBV:基于函数的视图   CBV:基于类的视图 from django.views import View

class Login(View): def get(self,request): # return HttpResponse('get') return render(request,'login.html')

def post(self,request): return HttpResponse('post')

查看as_view()源码

源码补充: 第一个疑问: url(r'^login/',views.Login.as_view()) # >>>等价于 url(r'^login/',views.view)

第二个疑问: 为什么我get请求就走get方法,post请求就走post方法

文件上传 前端需要注意的地方   form表单method必须是post   enctype必须是multipart/form-data

后端需要注意的是

代码语言:javascript
复制
def upload(request):
  if request.method == 'POST':
  # print(request.FILES)
  # print(type(request.FILES))
  # print(request.FILES.get('myfile'))
  # print(type(request.FILES.get('myfile')))
  # 获取文件对象
  file_obj = request.FILES.get('myfile')
  # print(file_obj.name)
  # 获取文件名
  file_name = file_obj.name
  # 文件读写操作
  with open(file_name,'wb') as f:
  # for line in file_obj:
  for line in file_obj.chunks():
  f.write(line)
  return render(request,'upload.html')

request的八种属性:   request.GET   request.POST   request.method   request.body     原始数据   request.path # /upload/   request.get_full_path() # /upload/?id=1   request.META     网页原信息   request.FILES     文件

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-05-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档