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

    路由层简单配置

    urlpatterns = [
        url(r'^admin/$', admin.site.urls),
        url(r'^articles/2003/$', views.special_case_2003),
        url(r'^articles/([0-9]{4})/$', views.year_archive),
        url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
        url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
    ]

    在url中加括号(无名分组)是为了捕获值传给后面的视图函数,注意此时是以位置参数传入的,当参数比较多或者需要调整参数顺序时可以改为有名分组以关键字参数的形式传入

    urlpatterns = [
        path('admin/', admin.site.urls),
        path('articles/2003/', views.special_case_2003),
        re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
        re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
        re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]+)/$', views.article_detail),
    ]

    路由分发

    实际项目中不可能只有一个app,如果所有url都放在一个url文件里,那么如果一个app里的url出问题整个项目就崩溃了,因此需要解耦,将不同app的url分配到对应的app的url文件中,这就是url分发

    mysite/urls.py

    from django.urls import path, include
    
    urlpatterns = [
        # path('admin/', admin.site.urls),  # django 2.0以后的写法
        # url('^articles/2003/$', views.special_case_2003),  # 1.0的写法
        # 路由分发:将不同app的路由(url)分发到不同的url里面
        # include作用:自动去掉后面的$,完成分发
        
        path('app1/', include('app1.urls')),  # 只要是app1下面的url,就分发到app1.urls这个文件里面
        path('app2/', include('app2.urls'))   # # 只要是app2下面的url,就分发到app2.urls这个文件里面
    ]

    app1/urls.py

    from django.conf.urls import url
    from app1 import views
    
    urlpatterns = [
        # 有名分组
        url(r'^articles/(?P<y>d{4})/(?P<m>d{1,2})$', views.month_archive),   # 用正则进行匹配,匹配成功执行后面的函数
    
    ]

    app2/urls.py

    urlpatterns = [
        # 有名分组
        url(r'^videos/(d+)', views.videos),
    
    ]

    app1/views.py

    from django.shortcuts import HttpResponse
    
    def month_archive(request, year, month):
        return HttpResponse('year:{0},month:{1}'.format(year, month))

    app2/views.py

    from django.shortcuts import HttpResponse
    
    
    def videos(request, video_id):
        return HttpResponse('videos:%s' % video_id)

    反向解析

      在使用Django 项目时,一个常见的需求是获得URL 的最终形式,以用于嵌入到生成的内容中(视图中和显示给用户的URL等)或者用于处理服务器端的导航(重定向等)。人们强烈希望不要硬编码这些URL(费力、不可扩展且容易产生错误)或者设计一种与URLconf 毫不相关的专门的URL 生成机制,因为这样容易导致一定程度上产生过期的URL。

      因此Django提供了一种方法,给URL指定别名,在需要URL 的时候,我们只需要把别名反解出来就行,对于不同层级,Django 提供不同的工具用于URL 反解:

    • 在模板中,使用url模板标签
    • 在python代码中,使用reverse函数

    urls.py

    urlpatterns = [
        path('admin/', admin.site.urls),
        path('login/', views.login, name="login"),  # 指定别名
      
    path('index/', views.index, name="index"), # 指定别名
    ]

    login.html

    <form action="{% url 'login' %}" method="post">
        <p>用户名:<input type="text" name="user"></p>
        <p>密码:<input type="password" name="pwd"></p>
        <input type="submit">
    </form>

    index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
    <h1>个人首页...</h1>
    
    </body>
    </html>

    views.py

    from django.shortcuts import render, HttpResponse, redirect
    from django.urls import reverse
    
    
    def login(request):
        
        if request.method == "POST":
            username = request.POST.get("user")
            pwd = request.POST.get("pwd")
            if username == "alex" and pwd == "123":
                return redirect(reverse("index"))
            
        return render(request, "login.html")
    def index(request):
      render(request,'index.html')

     

  • 相关阅读:
    数据库设计规则
    了解何时使用 Override 和 New 关键字(C# 编程指南)
    Why we use stored procedure than Sql statement?
    HTML条件注释和javascript条件注释
    <%# %> 和 <% %> 有什么区别?
    short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
    如何实现 Visual Studio 2005 中远程调试
    认识延迟时间为0的setTimeout(转)
    Web应用程序中(VS2005+SP1)添加App_Code
    AWStats 一个不错的Web/Mail/FTP日志分析工具
  • 原文地址:https://www.cnblogs.com/zzliu/p/10548085.html
Copyright © 2011-2022 走看看