zoukankan      html  css  js  c++  java
  • Django 路由

    一、Django的路由分配系统

    1个URL对应1个视图函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    from django.conf.urls import url
    from django.contrib import admin
    from APP import view
    urlpatterns = [
        url(r'^modal/',view.modal),         url(r'^域名',对应的处理函数) 注意不要忘了写 ^ 表示正则匹配以。。开头的URL
        url(r'^modal_add/',view.modal_add),
        url(r'^modal_del/',view.modal_del),
        url(r'^modal_edit/',view.modal_edit),
        ]

     

    二、在客户端通过url中的 path向后端传参数 

     在前端我们不仅可以通过get请求携带参数的方式向server端传数据; https://i.cnblogs.com/%EF%BC%9Fid=1&name=alex

    Django也允许通过,path路径的方式向server端传值;

    注意事项:按位置,和按关键字路由系统只能用1种,不能混合使用;

    1、path正则无名分组匹配《---------》视图函数按位置传参

    复制代码
    from django.conf.urls import url,include
    from django.contrib import admin
    from app1 import views
    urlpatterns = [
        url(r'^index/(w+)/(w+)/',views.index2),  #酱紫的话客户端 输入:http://127.0.0.1:8000/index/a/b/也可以访问到该站点
        url(r'^',views.error)
            ]
    urlpatterns = [
    url(r'^/',index), #视图函数 index(request)
    url(r'^(d{4})/d{2}/$',timeer1), #视图函数 timeer1(request,实参1) 正则增加了分组,视图函数会增加一个参数;
    url(r'^(d{4})/(d{2)/$',timeer2) #视图函数 timeer2(request,实参1,实参2) 视图函数需要2个形参接收;
    # url(r'^(?P<year>d{4})/(?P<month>d{2})/$',timeer),
    ]
     
    复制代码

    在路由系统定义了 几个正则分组(),在视图函数对应几个实参接收;

    def timeer2(request,a1,a2):
        print(a1,a2)  #打印参数a1,a2 就是 2个正则表达式匹配到的结果
      return Httprespose('ok')
    #注意如果按位置传参的动态路由系统,必须在视图函数添加对应的参数接收!

    2、path正则有名分组匹配《---------》视图函数按关键字传参

    按位置传参形参或实参错位会导致数据错乱,所以Django路由分发系统还可以以命名分组的形式匹配URL给视图函数按关键字传参;

    复制代码
    from django.conf.urls import url,include
    from django.contrib import admin
    from app1 import views
    urlpatterns = [
     url(r'^index/(P<n1>w+)/(P<n2>w+)/',views.index,name="zhanggen"),
     url(r'^(?P<year>d{4})/(?P<month>d{2})/$',timeer),
    url(r'^',views.error), ] #注意如果在路由系统正则内部定义了关键字n1,n2,视图函数接收参数也必须是 n1,n2;

    urlpatterns = [
    # url(r'^/',index), #index(request)
    # url(r'^(d{4})/d{2}/$',timeer), #timeer(request,2014) 正则增加了分组,视图函数会增加一个参数;
    # url(r'^(d{4})/(d{2)/$',timeer1) , #timeer(request,2014,12) 视图函数需要两个形参接收
    url(r'^(?P<year>d{4})/$(?P<month>d{2})',timeer2) #timeer(request,year=2017,month=6) 正则设置了有名分组,视图函数使用关键字传参
    ]



    复制代码

    在视图函数定义2个关键字参数, 接收 2个正则表达式匹配到的后缀;

    def index(request,n1,n2):
        print(n1,n2)  #注意必须和 路由系统中的一致
        return  HttpResponse('OK')

    3、URL path传值应用

    有了动态路由就 可以不用在  url?nid=8这样传值了!

    PS: 
    终止符:^edit$  可以精确限制匹配URL的后缀内容
    伪静态:url(r'^edit/(w+).html$', views.edit)  装作成静态网站的url可以 提高 SEO高权重   百度排名靠前

    url(r'^student_del/(.*).html/',views.student_del),
    <a href="/student_del/{{row.id}}.html/">删除</a></td>
    def student_del(request,args1):
        # user_id=request.GET.get('id')
        models.User_info.objects.filter(id=args1).delete()
        return redirect('/students/')

    三、路由分发

    1个Django 项目里面有多个APP目录大家共有一个 url容易造成混淆,于是路由分发让每个APP的拥有了自己单独的url;

    复制代码
    from django.conf.urls import url,include
    from django.contrib import admin
    from app1 import views
    urlpatterns = [
         url(r'^app1/',include('app1.urls')),
         url(r'^app2/',include('app1.urls')),  #注意include的是字符串形式的 文件路径;
         url(r'^',views.error),
                         
                         ]
    复制代码

    酱紫就可以在每个 Django目录下面写自己的 URL了

     四、路由别名(应用站点权限管理)

    1、什么是路由别名?

    给Django路由分发系统 URL--视图函数对应关系命个名,

    然后在模板中{% url "zhanggen" i i1%}反生成 访问该站点URL,

    或者在视图函数中reverse()反向生产当前访问URL;

    2、作用

    保证前后端数据一致性,后端修改了匹配URL,不用在前段更改;

    复制代码
    from django.conf.urls import url,include
    from django.contrib import admin
    from app1 import views
    urlpatterns = [
        url(r'^index/(?P<n1>w+)/(?P<n2>w+)/',views.index,name="alex"), 给这个URL起别名 alex
        url(r'^',views.error),
    ]
    复制代码

    在视图函数使用 reverse("别名", args=(1, 2)) 反生 位置参数动态路由的 别名

    def index(request,n1,n2):
        print(reverse("zhanggen", args=(1, 2)))
        return render(request,'index.html',{'i':1,'i1':2})
        

    在视图函数使用 reverse("别名",kwargs={"关键字参数":1,"关键字参数":2 }反生 关键字参数动态路由的 别名

    def index(request,n1,n2):
        print(reverse("zhanggen",kwargs={"n1":1,"n2":2 }))
        return render(request,'index.html',{'i':1,'i1':2})
     

    在模板中反生 URL

    注意 在视图函数中  return render(request,'index.html',{'i':1,'i1':2})

    复制代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <p>{{ i }}</p>
    <p>{% url "zhanggen" i i1%}</p>
    </body>
    </html>
    复制代码
  • 相关阅读:
    ASP.NET MVC案例——————拦截器
    Windows Azure Virtual Network (10) 使用Azure Access Control List(ACL)设置客户端访问权限
    Windows Azure Storage (20) 使用Azure File实现共享文件夹
    Windows Azure HandBook (5) Azure混合云解决方案
    Windows Azure Service Bus (6) 中继(Relay On) 使用VS2013开发Service Bus Relay On
    Azure PowerShell (9) 使用PowerShell导出订阅下所有的Azure VM的Public IP和Private IP
    Windows Azure Service Bus (5) 主题(Topic) 使用VS2013开发Service Bus Topic
    Azure China (9) 在Azure China配置CDN服务
    Windows Azure Storage (19) 再谈Azure Block Blob和Page Blob
    Windows Azure HandBook (4) 分析Windows Azure如何处理Session
  • 原文地址:https://www.cnblogs.com/zxy6/p/11675351.html
Copyright © 2011-2022 走看看