zoukankan      html  css  js  c++  java
  • django之路由(url)

    前言:

    Django大致工作流程

    1、客户端发送请求(get/post)经过web服务器、Django中间件、 到达路由分配系统 
    2、路由分配系统根据提取 request中携带的的url路径(path)与视图函数映射关系列表中,匹配到1个视图函数,foo(request)执行;

    3、视图函数 使用原生SQL或者ORM去数据库拿到数据,在服务端进行渲染(模板+数据渲染)

    4、视图函数return一个 response对象 返回客户端

      

    一、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>
  • 相关阅读:
    Atitit (Sketch Filter)素描滤镜的实现  图像处理  attilax总结v2
    JS设置cookie、读取cookie、删除cookie
    Atitit 图像处理30大经典算法attilax总结
    Atitit数据库层次架构表与知识点 attilax 总结
    Atitit 游戏的通常流程 attilax 总结 基于cocos2d api
    Atitti css transition Animation differ区别
    Atitit 图像清晰度 模糊度 检测 识别 评价算法 源码实现attilax总结
    Atitit 全屏模式的cs桌面客户端软件gui h5解决方案 Kiosk模式
    Atitit 混合叠加俩张图片的处理 图像处理解决方案 javafx blend
    Atitit  rgb yuv  hsv HSL 模式和 HSV(HSB) 图像色彩空间的区别
  • 原文地址:https://www.cnblogs.com/langhuagungun/p/10265417.html
Copyright © 2011-2022 走看看