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

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

urlpatterns = [   url(r'^admin/', admin.site.urls),   url(r'test',views.test),   url(r'testadd',views.testadd), ]

路由一旦匹配就再也不走下面的路由匹配关系了

路由增长首页的方式前端

url(r'^$',views.home)

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

url(r'',views.error)     切记必须加在最后

无名分组 git

url(r'^test/([0-9]{4})/', views.test),

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

具体操做以下:django

有名分组json

url(r'^test/(?P<year>\d+)/',views.test)

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

具体操做以下:app

 

 

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

 

 反向解析:

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

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

前端反向解析

{% url 'add' %} # {% url '放urls.py中路由与视图函数的name的值' %} 

后端反向解析

url(r'^testadd123/$',views.testadd,name='add')

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

from django.shortcuts import reverse res = reverse('add') print(res)

 

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

{% url 'add' 1 %} # {% url '放urls.py中路由与视图函数的name的值' %} 

后端反向解析

url(r'^testadd123/(\d+)/$',views.testadd,name='add')

from django.shortcuts import reverse res = reverse('add',args=(1,))

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

{% url 'add' 1 %} # {% url '放urls.py中路由与视图函数的name的值' %} 推荐你用这种

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

后端反向解析

res = reverse('add',args=(1,)) # 推荐你用这种
 res = reverse('add',kwargs={'year':1})

 小口诀

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

推导:

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文件夹
项目总路由:

url(r'^app01/',include(app01_urls)), url(r'^app02/',include(app02_urls))

应用子路由:
app01.urls.py

from django.conf.urls import url from app01 import views urlpatterns = [ url(r'^index/',views.index) ]

app02.urls.py

from django.conf.urls import url from app02 import views urlpatterns = [ url(r'^index/',views.index) ]

若是两个app下起了相同的名字,那么反向解析不支持自动查找应用前缀

名称空间(了解便可):

# url(r'^app01/',include(app01_urls,namespace='app01')), # url(r'^app02/',include(app02_urls,namespace='app02'))

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

 总结

总路由对子路由进行分发 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自定义转换器
须要三步走战略
# 自定义转换器

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

后端须要注意的是

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     文件

原文出处:https://www.cnblogs.com/gengbinjia/p/10713110.html

相关文章
相关标签/搜索