zoukankan      html  css  js  c++  java
  • django之路由分组,反向解析,有名,无名分组

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

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

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

    路由增加首页的方式

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

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

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

    无名分组 

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

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

    具体操作如下:

    有名分组

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

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

    具体操作如下:

     

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

     反向解析:

    试想一个场景,你有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     文件

  • 相关阅读:
    边缘引导插值/方向卷积插值
    cout显示Mat类对象报错Access Violation
    图像特征点匹配C代码
    TF-IDF(词频-逆向文件频率)用于文字分类
    Jsp中如何通过Jsp调用Java类中的方法
    根据wsdl文件,soupUI生成webservice客户端代码
    根据wsdl,axis2工具生成客户端代码
    根据wsdl,apache cxf的wsdl2java工具生成客户端、服务端代码
    根据wsdl,基于wsimport生成代码的客户端
    Mysql截取和拆分字符串函数用法
  • 原文地址:https://www.cnblogs.com/gengbinjia/p/10713110.html
Copyright © 2011-2022 走看看